资源预览内容
第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
第9页 / 共15页
第10页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
C8051F MCU应应 用用 笔笔 记记 Silicon Laboratories Inc. 新华龙电子有限公司 4635 Boston Lane 深圳市福田区华强北路现代之窗大厦 A 座 13F C 室(518013) Austin, TX 78735 0755-83645240 83645242 83645244 83645251 AN002 配置内部和外部振荡器 SYSCLKXTAL1XTAL2OSCOSCXCNENRCCMOSVDDCXTAL1XTAL2XTAL1XTAL1OSCICNAGND晶体输入电路内部时钟振 荡 器晶体输入电路内部时钟振 荡 器 引言 本应用笔记的目的是介绍如何配置和使用内部及外部振荡器。本文提供了配置说明、应用举例和示例代码。 关键点 ? 在器件复位时内部振荡器被自动允许,并选择工作于 1.9MHz。 ? 系统时钟可以很容易地在内部振荡器和外部振荡器之间进行切换。 ? 选择外部振荡器作为系统时钟和禁止内部振荡器可以在同一个写操作内完成。如果外部振荡器被停止,在同一个写操作可以允许内部振荡器和选择内部振荡器作为系统时钟。 ? 在使用内部振荡器作为系统时钟的情况下,允许改变内部振荡器的频率。 ? 在所有的振荡器方式中,/SYSCLK 是系统时钟的缓冲输出,可以在交叉开关中允许其输出到 电话:Email: mcuinfosilabs.com (版权所有) 电邮:shenzhenxhl.com.cn Internet: www.silabs.com 网址:www.xhl.com.cn AN002 配置内部和外部振荡器 输出端口引脚。 ? 如果时钟丢失检测器被允许,将在系统时钟频率降到 10kHz 左右时产生复位。 ? 晶体振荡器有效标志可以用于在晶体振荡器稳定后产生中断,这样可以让中断处理程序将时钟切换外部振荡器。 配置说明 除了具有高度可配置性外,C8051 的振荡器还具有灵活和易于使用的特点。 系统时钟可以自由地在内部振荡器和外部振荡器之间进行切换。并且也可以在选择内部振荡器时让外部振荡器保持在允许状态, 这样可以避免在系统时钟被切换到外部振荡器时的启动延迟。 外部振荡器具有很高的可配置性, 为系统设置者提供了多种选择。 时基信号可以从外部 CMOS电平时钟源、晶体或陶瓷谐振器、RC 组合电路或外部电容获得。 内部和外部振荡器的工作受两个 SFR 寄存器控制,即 OSCICN(内部振荡器控制寄存器)和OSCXCN(外部振荡器控制寄存器) 。图 7 和图 8 分别给出了这两个寄存器的说明。 内部振荡器内部振荡器 在系统复位时,内部振荡器被选为系统时钟并工作在 1.9MHz。内部振荡器可以被编程为表 1中所示的四种频率之一。内部振荡器的频率可以在运行中切换频率改变只需要几个系统周期。如果工作频率对于改变振荡器操作之后的指令是很重要的话,可以查询 IFRDY(内部振荡器频率准备好标志,OSCICN.4) 。 内部振荡器本身的功耗与所选择的频率无关,但是整个器件的功耗所选择的频率有关。 随着工艺、供电电压及温度的不同,内部振荡器的精度在20%。 外部外部CMOS时钟时钟 系统时钟可以由一个接到 XTAL1 脚的外部 CMOS 电平时钟源提供,例如晶体振荡器模块或来自另一个微控制器的时钟。 外部晶体外部晶体 通常在需要一个精确的时基信号才会选择晶体, 例如 ADC 的绝对采样速率比较关键, 或需要用于产生一个标准 UART 波特率时。 一个替换方案是用一个低频率的音叉晶体例如 32.768kHz 钟表晶体,使器件工作在低功耗方式,当系统需要时再切换到高频率的内部振荡器。 外部外部RC 时间基准还可以通过一个外部串连 RC 电路获得。在这种配置下,电容通过电阻充电,直到XTAL1 的电压达到(1/3)*AV+,此时 XTAL1 被接地,使电容放电。这种工作方式在 XTAL1 脚产生一个锯齿波,其周期主要由电容两端电压的上升时间决定;对于一个 100pF 的电容,放电时间小于 10nS。该信号经过缓冲后被送到一个二分频器,分频器的输出作为系统时钟。 在外部 RC 方式下时基的精度主要由 R 和 C 元件的误差决定。 2 AN02-1 AN002 配置内部和外部振荡器 外部电容外部电容 该方式与上述的外部 RC 方式相似, 区别在于该方式下电容的充电电流由接到 XTAL2 的内部可编程电流源提供。这是精度最差的一种时基方式;也是最灵活的一种方式,因为只用一个元件值可提供八种不同的工作频率,最高频率几乎可达到最低频率的 3000 倍。 外部电容方式下的时基精度主要由电容的误差和流过 XTAL2 的内部电流源的精度决定。 内部电流源的精度大约在30,随着工艺、供电电压及温度的不同而变化。 表表 1. 内部振荡器频率选择内部振荡器频率选择 IFCN1:0 标称频率 00 1.9 MHz 01 3.8 MHz 10 7.5 MHz 11 15 MHz 配置举例 下面是振荡器配置的几个例子。 内部振荡器内部振荡器 复位后,内部振荡器工作在 1.9MHz 并被选为系统时钟。 如果系统设计只使用内部振荡器而不使用外部振荡器, XTAL1 脚应如图 1 所示那样从外部接地或通过将 XOSCMD 位(OSCXCN.6-4)设置为000从内部接地。如果系统需要/RST 引脚长时间保持低电平,则建议将 XTAL1 从外部接地。 用 IFCN 位(OSCICN.1-0)对内部振荡器编程。如表 1 所示,有四种频率可供选择。 在振荡器频率发生改变后,IFRDY(内部振荡器频率准备好,OSCICN.4)标志变为低电平,表示振荡器频率尚未达到其编程值。一旦振荡器频率稳定在它的最新编程频率,IFRDY 将变为高电平。 内部振荡器的启动几乎是瞬时完成的。 内部振荡器的频率可以随意改变,而且内部振荡器可以在几个时钟周期内稳定到它的最新编程频率。因此,如果对于一个应用来说绝对频率不是很重要的话,不需要对 IFRDY 位进行查询。 外部振荡器外部振荡器 该系列器件支持四种不同的外部振荡器配置:外部 CMOS 驱动器、外部晶体或陶瓷谐振器、外部 RC 网络和外部电容。为了允许外部振荡器,首先应配置 OSCXCN,即外部振荡器配置寄存器,然后将 CLKSL 置1 (OSCICN.3)以选择外部振荡器作为系统时钟。 在基于晶体的设计中,由于晶体振荡器的启动需要几个毫秒的时间,所以需要在将 CLKSL AN02-1 3 AN002 配置内部和外部振荡器 置1之前等待 XTLVLD(晶体振荡器有效标志,OSCXCN7.7)变为高电平(表示外部振荡器已经稳定) 。 在外部 RC 和外部电容方式下,外部振荡器的启动是瞬时完成的。 外部外部 CMOS 驱动器驱动器 主时钟可以由一个接到 XTAL1 输入脚的外部 CMOS 电平时钟源提供。 在这种配置下, XTAL2应悬空,如图 2 所示。另外,XOSCMD 位应设置为010以直接使用输入频率,或设置为011以允许二分频器。 注:与 I/O 端口引脚不同,XTAL1、XTAL2 不是 5V 兼容的,XTAL1 的电压应保持在 AV+和 AGND 之间。 注:如果 XOSCMD 被设置为1xx ,XTLVLD 标志可以用于检测外部 CMOS 振荡器。 XTAL1XTAL2AGND内部振荡器图内部振荡器图1. 外部外部CMOS时钟连接时钟连接 外部晶体外部晶体 主时钟可以通过将一个晶体或陶瓷谐振器并接 XTAL1 和 XTAL2 而得到。这种配置需要将XOSCMD 设置为110以直接使用晶体频率,或设置为111以允许二分频器,并且要根据晶体频率、等效负载电容和晶体的等效串连电阻(ESR)来设置 XFCN。图 3 给出了使用外部晶体的系统配置。 注意,负载电容应接到模拟地平面。还应该注意晶体振荡器反向器的反馈电阻已在片内提供,不需要外接电阻。 应查询 OSCXCN 中的 XTLVLD(晶体振荡器有效)位(或用该位产生中断) ,判断晶体振荡器频率是否稳定。一旦 XTLVLD 变为高电平,CLKSL(OSCICN.3)可以被置1以使用外部振荡器作为系统时钟。 4 AN02-1 AN002 配置内部和外部振荡器 XTAL1XTAL2AGNDX1Cx1Cx210 M外部晶体图外部晶体图3. 外部晶体连接外部晶体连接 确定确定XFCN XFCN 控制晶体振荡器驱动器的驱动电平。一般来说,驱动电平应足够强以保证晶体起振。但过强可能导致晶体性能过早变坏。 对于 3MHz 以上的晶体,如果 XFCN 设置的很高,对晶体的寿命没有多大影响,可以使用最大的 XFCN 值, 尽管这可能导致晶体振荡器消耗更多的工作电流。 对于低频音叉晶体, 例如 32.768 kHz 或 100 kHz,过强的驱动可能产生稳定性问题。此外,如果驱动电平过高音叉晶体可能根本就不能起振。 如果在设计中使用一个标称负载电容为 20pF 左右的石英晶体,用表 2 的“频率范围”列可以快速确定 XFCN,该列也适应于低频音叉晶体和大多数陶瓷谐振器。功率系数可以按下例所示那样进行计算。 方程 1 给出了晶体起振所需要的功率系数(PF) 。 方程方程 1功率系数功率系数 PF = 5 * ESR * f2*CL2 其中: PF = 功率系数 ESR= 晶体(或陶瓷谐振器)的等效串连电阻,以欧姆为单位 f = 晶体频率,以 MHz 为单位 CL = 等效负载电容,以 pF 为单位 ESR 可以从晶体的数据表中找到。频率是已知的,为所选晶体的频率。等效负载电容必须按方程 2 所示进行计算。 AN02-1 5 AN002 配置内部和外部振荡器 表表 2. 功率系数与功率系数与 XFCN 的关系(晶体方式)的关系(晶体方式) XFCN 功率系数 频率范围(*) 000 90(103) 15 kHz 400 kHz 001 280(103) 400 kHz 1 MHz 010 810(103) 1 MHz 2 MHz 011 2.30(106) 2 MHz 4 MHz 100 6.30(106) 4 MHz 6 MHz 101 20.4(106) 6 MHz 12 MHz 110 36.6(106) 12 MHz 20 MHz 111 110(106) 20 MHz 30 MHz * 对于负载电容为 20pF 的晶体 等效负载电容是 XTAL1 和 XTAL2 两端的总电容值。这一电容值主要由晶体的并联电容(在大多数的晶体数据手册中被称为CO ) 、外加的附载电容(CX1 和 CX2)和电路板导线与器件引脚(Cp1 和 Cp2)之间的寄生电容决定,见图 4。 XTAL1XTAL2Cx1Cx2Cp1Cp2X1图图4. 负载电容连接图负载电容连接图 从 XTAL1 和 XTAL2 引脚看,Co 与 CX1 和 CX2 的串连组合相并联,也与 Cp1、Cp2 的串连组合相并联。假设 CX1=CX2(在采用晶体的设计中通常如此)和 Cp1=Cp2(如果 PCB 布线具有相同的长度和形状) ,我们有: 方程方程 2负载电容负载电容 CL = * (Cx1 + Cp1) + Co 其中: CL 总负载电容,以 pF 为单位 Cx1= 以 pF 表示的外加电容值 Cp1= 以 pF 表示的寄生电容值 6 AN02-1 AN002 配置内部和外部振荡器 Co = 以 pF 表示的晶体并联电容值。 对于短的电路连线,Cp 的典型值为 2 到 5 pF。 我们通过几个例子来说明如何计算 PF: 晶体示例:晶体示例:11.0592 MHz 我们以 ECS(ECS p/n: ECS-110.5-20-1, http:/www.ecsxtal.com)的 11.0592MHz 晶体为例,数据手册中给出该器件最大 ESR 为 30,并联电容为7.0 pF。 该晶体要求接一个 20 pF 的负载电容。该“负载电容”被定义为晶体两端的总电容,不包括晶体本身的并联电容。 假设晶体两端的总寄生电容为 3 pF (Cp1 和 Cp2 均为 6 pF) , 则 Cx1 和 Cx2应为(20-3)*2 33 pF。 为了得到功率系数方程中的 CL,我们在晶体并联电容的基础上加入: CL = * (6 + 33) + 7 27 pF 功率系数方程变为: PF = 5 * 30 * (11.0592)2 * (27) 2 = 13 * 106我们的目的是将XFCN设置为最小功率系数,该系数应至少等于上述方程的计算值。在表2中我们发现两个相近的值:6.30E+6和20.4 E+6,根据上述原则将XFCN的值设为101 。 晶体示例:晶体示例:32.768 kHz 晶体振荡器驱动器能驱动适用于低功耗运用的低频音叉晶体。在本例中我们使用一个ECS(ECS p/n: ECS-.327.12.5-8)的32.768 MHz的时钟晶体。数据手册中给出的ESR为35k,负载电容为 12.5 pF,固有并联电容为1.6 pF。我们仍然假设寄生负载电容为3 pF。 CL = * (6 + 18) + 1.6 14 pF 功率系数方程变为: PF = 5 * 35000 * (0.032768) 2 * (14) 2 36.8 * 103 从表2中我们查到功率系数90*103是足够强的,这样XFCN值为000 。 晶体示例:晶体示例:20.00 MHz 使用一个 20 MHz 的晶体,ESR 为 30,负载电容为20 pF,并联电容为5pF。我们有: CL = * (6 + 33) + 5 25 pF PF = 5 * 30 * (20) 2 * (25)2 = 37.5 * 106从表2我们查出,对应于该功率系数的XFCN值为111 。 外部外部 RC 网络网络 图 5 给出了外部 RC 方式下连接图。注意串连 RC 的连接点位于模拟电源和模拟地之间。 方程 3 给出 RC 振荡方式下的振荡频率。 AN02-1 7 AN002 配置内部和外部振荡器 方程方程 3RC 方式下的振荡频率方式下的振荡频率 Fosc = (1.23 * 103 ) / (R * C) 其中: Fosc = 用MHz表示的振荡频率, R = 用k 表示的充电电阻 C = 用pF表示的电容值,包括寄生电容。 为了将器件配置为RC方式,XOSCMD必须被设置为100或101 。内部二分频器始终被允许。该二分频器已在方程3中被考虑到。还必须将XFCN设置为一个足够高的值来支持所选择的频率。表3列出XFCN值与所需频率的关系。 XFCN总是可以被设置为比表3中的数值大的值,但这样将导致较高的振荡器工作电流。如果XFCN设置得太低, 振荡器频率将低于上述方程所估计的值, 并且可能导致产生寄生时钟脉冲。 注:RC方式下外部振荡器的启动几乎是瞬时完成的。XTLVLD标志在这种方式下没有意义。 表表 3. 功率系数与功率系数与 XFCN 的关系(的关系(RC 方式)方式) XFCN 频率 000 FOSC 25 kHz 001 25 kHz FOSC 50 kHz 010 50 kHz FOSC 100 kHz 011 100 kHz FOSC 200 kHz 100 200 kHz FOSC 400 kHz 101 400 kHz FOSC 800 kHz 110 800 kHz FOSC 1.6 MHz 111 1.6 MHz FOSC 3.2 MHz 所提供的电容应在10 pF和100pF之间,注意,电容值越低,寄生电容将对最终频率的影响越大。我们通过下面几个例子来说明: RC示例:示例:100 kHz 设C=33 pF。总电容值(包括寄生电容值)为33+6,即39 pF。 假设我们需要的振荡频率为100 kHz,我们可以通过解方程3得到R: FOSC = (1.23 * 103 ) / (R * C) R = (1.23 * 103 ) / (FOSC * C) R = (1.23 * 103 ) / (0.1 * 39) R = 315 k 8 AN02-1 AN002 配置内部和外部振荡器 从表3中可以看出我们需要将XFCN设置为010 。 RC示例:示例:3.2 MHz 在RC方式下外部振荡器工作频率大于3.2 MHz是可能的,但是不建议这样做。当频率增高时,振荡频率与用方程所估计的频率之间会有较大的误差。特别是由于有固定的内部延迟存在,实际的振荡频率将低于预测值,振荡周期越短,这种现象就越明显。 使用一个33 pF的电容,使总电容值为39 pF,我们解方程3得到R: FOSC = (1.23 * 103 ) / (R * C) R = (1.23 * 103 ) / (FOSC * C) R = (1.23 * 103 ) / (3.2 * 39) R = 9.86 k 从表3中可以看出,我们应将XFCN设置为111 。 RC示例:示例:1 kHz 如果对A/D转换器的性能要求不是很高,则系统时钟频率可以随意降低,前提是时钟丢失检测器被禁止(MSCLKE0 ,OSCICN.7,这是它的复位状态) 。如果时钟丢失检测器被允许,在系统时钟降到10 kHz左右时将产生一个系统复位。 在本例中我们使用的C值为100 pF,导致总电容值为106 pF。解方程3得到R: FOSC = (1.23 * 103 ) / (R * C) R = (1.23 * 103 ) / (FOSC * C) R = (1.23 * 103 ) / (0.001 * 106) R = 11.6 根据表3,XFCN可以被设置为000 。 外部电容外部电容 图6给出了外部电容方式的连接图。注意XTAL1和XTAL2是接到一起的,电容是接在XTAL引脚与模拟地平面之间。 方程4给出外部电容方式下的振荡频率。 方程方程4外部电容方式下的振荡频率外部电容方式下的振荡频率 Fosc = KF / (C * AV+) 其中: Fosc = 用MHz表示的振荡频率, KF 表4中K因子 C 用pF表示的电容值,包括寄生电容 AV+ = 加到AV+引脚的模拟电源电压,单位为V AN02-1 9 AN002 配置内部和外部振荡器 表4列出了K因子与XFCN设置的关系。 表表 3. 功率系数与功率系数与 XFCN 的关系(的关系(RC 方式)方式) XFCN KF(K 因子) 000 0.74 001 2.4 010 7.1 011 21 100 61 101 230 110 770 111 2100 外部电容方式与外部RC方式相类似, 区别在于电容的充电电流由输出到XTAL2的可编程电流源提供。所使用的电容应在10 pF和100 pF之间,需要注意的是,电容值越低,寄生电容对最终频率的影响越大。 由于存在电容的容差、寄生电容以及内部电流源误差(大约在30) ,实际的振荡频率难以估算。 注意:RC方式下外部振荡器的启动几乎是瞬时完成的。XTLVLD标志在这种方式下没有定义。 我们通过几个例子对外部电容方式加以说明: 外部电容示例:外部电容示例:100 kHz 假设模拟电源电压为3.0V,外部电容为33 pF,加上寄生电容的总电容为39 pF,我们解方程4得到KF: KF = Fosc * (C * AV+) KF = 0.1 * (39 * 3) KF = 11.7 参考表4,最接近的KF值为7.1,该值将导致产生一个大约60 kHz的振荡频率。我们可以将电容值减小到18 pF(总电容为24 pF)使振荡频率达到99 kHz。我们将XFCN设置为010以选择KF值7.1。 相邻的XFCN值导致K因子有大约3倍的变化。例如,在上例中将XFCN增加到011 ,将导致振荡频率从100 kHz增加到大约300 kHz。 将XFCN设置为最大值111 ,则KF为2100。根据方程4的预测,使用该设置将导致振荡频率大约为30 MHz。与在外部RC方式一样,对于低于3 MHz的频率值方程是精确的,随着频率增 10 AN02-1 AN002 配置内部和外部振荡器 加,精度会越来越低。 外部电容示例:外部电容示例:3 MHz 使用上述的18 pF外部电容值(总值为24 pF)和3.0 V的AV+,我们解方程4得到KF: KF = Fosc * (C * AV+) KF = 3 * (24 * 3) KF = 216 表4中最接近的KF值为230,对应的XFCN为101 。这时的振荡频率大约在3.2 MHz。 振荡器寄存器定义 图图7. OSCICN:内部振荡器控制寄存器:内部振荡器控制寄存器 R/W R/W R/W R/W R/W R/W R/W R/W 复位值 MSCLKE - - IFRDYCLKSLIOSCENIFCN1 IFCN0 00000100 位7 位6 位5 位4 位3 位2 位1 位0 SFR 地址:0xB2 位7: MSCLKE:时钟丢失允许位 0:时钟丢失检测器禁止 1:时钟丢失检测器允许;如果检测到时钟丢失将产生复位 位6-5: 未使用。读=00B,写=无意义。 位4: IFRDY:内部振荡器频率准备好标志 0:内部振荡器频率未达到IFCN位设定的速度。 1:内部振荡器频率达到IFCN位指定的速度。 位3: CLKSL:系统时钟源选择位 0:使用内部振荡器作为系统时钟。 1:使用外部振荡器作为系统时钟。 位2: IOSCEN:内部振荡器允许位 0:内部振荡器禁止 1:内部振荡器允许 位1-0: IFCN1-0:内部振荡器频率控制位 00:内部振荡器典型频率值为1.9MHz. 01:内部振荡器典型频率值为3.8MHz. 10:内部振荡器典型频率值为7.5MHz. 11:内部振荡器典型频率值为15MHz. AN02-1 11 AN002 配置内部和外部振荡器 图图8. OSCXCN:外部振荡器控制寄存器:外部振荡器控制寄存器 R/W R/W R/W R/W R/WR/W R/W R/W 复位值 XTLVLD XOSCMD2 XOSCMD1 XOSCMD0- XFCN2XFCN1 XFCN0 00110000 位7 位6 位5 位4 位3位2 位1 位0 SFR 地址:0XB1 位7: XTLVLD:晶体振荡器有效标志(只有在XOSCMD=11X时有效) 0:晶体振荡器未使用或未稳定。 1:晶体振荡器正使用且已稳定。 位6-4: XOSCMD2-0:外部振荡器方式位 00x:关断。XTAL1脚内部接地。 010:系统时钟由XTAL1引脚上的外部CMOS时钟提供。 011:系统时钟由XTAL1引脚上的外部CMOS时钟2分频后提供。 10x:RC/C振荡器方式经过2分频。 110:晶体振荡器方式。 111:晶体振荡器方式经过2分频 位3:保留。读=未定义,写=无意义。 位2-0: XFCN2-0:外部振荡器频率控制位 000-111:见下表 XFCN 晶体(XOSCMD = 11x) RC(XOSCMD = 10x) C(XOSCMD = 10x)000 功率系数= 90(103) f 25 kHz K 因子= 0.741 001 功率系数= 280(103) 25 kHz f 50 kHz K 因子= 2.26 010 功率系数= 810(103) 50 kHz f 100 kHz K 因子= 7.10 011 功率系数= 2.30(106) 100 kHz f 200 kHz K 因子= 21.0 100 功率系数= 6.30(106) 200 kHz f 400 kHz K 因子= 60.8 101 功率系数= 20.4(106) 400 kHz f 800 kHz K 因子= 225 110 功率系数= 36.6(106) 800 kHz f 1.6 MHz K 因子= 773 111 功率系数= 110(106) 1.6 MHz 5*ESR*f 2*CL2,其中 ESR = 晶体的等效串联电阻,用欧姆表示 f = 晶体的频率,用MHz表示 CL = 负载电容(晶体的电容、寄生电容、补偿网络的电容) ,用pF表示 RC方式(XOSCMD=10X) 选择振荡频率范围: f = 1.23(103 ) / (R * C),其中 f = 振荡频率,用MHz表示。 C = 电容值,用pF表示, R = 上拉电阻值,用k表示。 外部电容方式(XOSCMD=10X) 选择K因子 (KF)以得到所需要的振荡频率: f =KF/(C*AV+), 其中:f = 振荡频率, 单位为MHz C = XTAL1,XTAL2引脚间的电容值,单位为pF AV+ = MCU的模拟电源电压,单位为V 12 AN02-1 AN002 配置内部和外部振荡器 软件示例软件示例 - ; CYGNAL INTEGRATED PRODUCTS, INC. ; ; ; 文件名: cryosc.ASM ; 目标MCU:C8051F000 ; 说明: 配置外部振荡器的示例源代码,使用外部11.0592 MHz 晶体,用XTLVLD中断从内 ; 部振荡器切换到外部振荡器。还展示了如何从内部振荡器的缺省频率值1.9 MHz切 ; 换到15MHz,以及如何通过查询IFRDY(内部振荡器频率准备好,OSCICN.4)等 ; 待内部振荡器稳定到其编程值。 ; ; 实现笔记: ;- ;- ; 等价定义 ;- $MOD8F000 ;- ;变量 ;- DSEG ;- ; 堆栈 org 0e8h ; 临时设置的堆栈地址(rev A,B 勘误) STACK_TOP: DS 1 ; 符号表中的占位符,表示硬件堆栈起始地址 ;- ; 宏定义 ;- ;- ; 复位和中断向量表 ;- CSEG org 00h ljmp Reset org 0abh ljmp XTLVLD_ISR ; 晶体振荡器有效中断 ;- ; 中断向量 ;- AN02-1 13 AN002 配置内部和外部振荡器 ; 复位向量 org 0b3h Reset: mov WDTCN, #0deh ; 禁止看门狗定时器 mov WDTCN, #0adh mov OSCXCN, #01100101b ; 允许晶体振荡,除1方式 ; 对于11.0592 MHz 晶体,XFCN = 101 ; 一旦晶体振荡器启动并稳定(几百个微秒之后) ; 通过XTLVLD中断处理程序选择外部振荡器。 orl OSCICN, #00000011b ; 允许内部振荡器,频率为15MHz. osc_wait: mov a, OSCICN ;等待新频率有效 jnb acc.4, osc_wait ; 注意:只有在对于后面的指令来说绝对频率是很 ; 重要的情况下才有必要查询。 这不是本例的情况, ; 我们只是将它作为一个例子来说明。频率改变只 ; 需要几个时钟周期。 orl EIE2, #10000000b ; 设置 EXVLD (XTLVLD 中断允许) anl EIP2, #NOT(10000000b) ; XTLVLD 是一个低优先级中断 mov SP, #STACK_TOP ; 初始化堆栈指针 setb EA ;允许全局中断 ljmp Main ;- ; XTLVLD 中断向量 ; ; 低优先级中断 ; ; 当外部晶体振荡器有效标志被置位时,该中断服务程序被调用。 ; 它将时钟切换到外部振荡器,然后显式禁止XTLVLD 中断(因为不存在中断标志并且 ; XTLVLD位是不可写的)。该例程还允许时钟丢失检测器,这样就会在振荡器由于任何理由 ; 停止工作时产生复位。 ; XTLVLD_ISR: orl OSCICN, #00001000b ; 选择外部振荡器作为时钟源 anl OSCICN, #NOT(00000100b) ; 禁止内部振荡器 orl OSCICN, #10000000b ; 允许时钟丢失检测器 ; 如果晶体频率低于 70 kHz,则必须 ; 在选择外部振荡器作为系统时钟源之 ; 完成这项工作。 anl EIE2, #NOT(10000000b) ; 禁止XTLVLD中断 reti ;- ; 主程序代码 ;- Main: 14 AN02-1 AN002 配置内部和外部振荡器 jmp $ ; 原地跳转 ;- ; END ;- END AN02-1 15
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号