内部时钟源
1、内部时钟源结构介绍
该单片机的内部时钟源模块(ICS,The internal clock source)是比较有特色的,除了一般单片机所具有的外部时钟配置(时钟或低成本晶体振荡器)、可编程内部时钟参考(32kHz)之外,还有一个锁频环(FLL, frequency-locked loop),锁频环的输入信号可以来自外部,也可以来自内部参考,锁频环的输出与外部时钟和内部参考时钟三者之一通过一个可编程分频器(BDIV , reduced bus divider)最终得到内部时钟源模块的最主要输出ICSOUT,总线时钟为ICSOUT的二分频。时钟源模块内部结构以及输出时钟的应用情况参考图1和图2。
对时钟源模块的控制与配置离不开特殊功能寄存器,需要用到的寄存器中的一些位(bits)在图中也已经标出来了,通过这些控制位的选择,时钟模块的输出可以来自外部、内部参考或者锁频环的输出。即使时钟源的输出不经过锁频环FLL,锁频环既可以使能,也可以关闭(省电),种种情况归纳起来,时钟源模块有7种工作模式:
FEI:FLL engaged internal mode;
FEE:FLL engaged external mode;
FBI:FLL bypasd internal mode;
FBILP:FLL bypasd internal low power mode;
FBE:FLL bypasd external mode
创建文明校园标语FBELP:FLL bypasd external low power mode
stop:
这7种工作模式中,前两个字母FE或者FB表示最终ICSOUT是否来自于锁频环,FE表示是,而FB表示FLL被跳过去了,ICSOUT可能来自外部也可能来自内部参考,取决于第三个字母是I(内部)还是E(外部)。有的模式中包含LP表示低功耗,也就是带LP的模式下锁频环被禁止,此时可以给BDC模块供电的,来自于FLL二分频输出的ICSLCLK不再存在。
2、内部时钟源控制寄存器介绍
对内部时钟源的控制与配置是通过2个控制寄存器、一个内部参考时钟调节寄存器以及一个
状态与控制寄存器来实现的,对这些控制位的定义建议参考上述内部时钟源结构图。
内部时钟源控制寄存器1 (ICSC1)
域 | 功能描述 |
7:6 CLKS | ICSOUT时钟源选择 00-选择FLL输出. 01-选择内部参考时钟. 10-选择外部参考时钟. 11-保留,默认为00. |
5:3 RDIV | 锁频环输入信号的分频数,由于锁频环将输入信号固定512倍频输出,要求锁频环输入信号范围是31.25kHz到39.0625kHz.该参数主要针对采用外部时钟的情形,因为内部时钟大约就是31.25kHz,缺省1分频就行。由于39.0625k * 128 = 5M,因此要求外部时钟不超过5MHz。 | 000—1分频(复位缺省) 001—2分频 010—4分频 011—8分频 100—16分频 101—32分频 110—64分频 111—128分频 |
2 IREFS | 选择FLL的输入时钟源:1-选择内部参考时钟; 0-选择外部参考时钟 |
1 IRCLKEN | 内部参考时钟ICSIRCLK的使能控制 1-顾此失彼ICSIRCLK允许;0-ICSIRCLK停止 |
0 IREFSTEN | 控制当ICS进入停止状态时内部参考时钟是否保持使能. 1-如果IRCLKEN设置或者ICS在进入停止前为FEI,FBI或者FBILP模式时,内部参考时钟保持使能. 0-ICS进入停止状态时,内部参考时钟也禁止。 |
| | |
内部时钟源控制寄存器2 (ICSC2)
域 | 功能描述 |
7:6 BDIV | ICSOUT输出前的分频数: 00—1分频; 01—2分频(复位时缺省状态); 10—4分频; 11—8分频. |
5 RANG | 外部振荡器频率范围选择: 1—外部振荡器为高频范围;0—外部振荡器为低频范围 |
4 HGO | 控制外部振荡器电路工作在高增益状态还是低功耗状态: 1—高增益模式;0—低功耗模式。 |
3 LP | 控制FLL旁路模式中,FLL是否禁止(低功耗). 1—FLL在旁路状态中被禁止(BDM背景调试模式除外); 0—FLL在旁路状态反抗强权的中仍然活动。 |
2 EREFS | 外部参考源模式选择: 1—外部参考源为振荡器; 0—外部参考源为整形后的时钟; |
1 ERCLKEN | 外部参考时钟信号ICSERCLK(可用于RTI模块)的使能控制 1—ICSERCLK活动;0—ICSERCLK停止 |
0 EREFDTEN | 控制当在ICS进入停止状态时外部参考时钟是否保持使能: 1—如果ERCLKEN设置或者ICS在进入停止前汽车主要有哪些保养为FEI,FBI或者FBILP模式时,外部参考时钟保持使能;nba暂停 0—在停止中禁止外部参考时钟。 |
| |
内部参考时钟调节寄存器(ICSTRM)
该寄存器与下一个状态与控制寄存器ICSSC的最低位,一共九位,用于调节内部参考时钟的周期,ICSSC的最低位FTRIM也是这九位的最低位。TRIM值越大,周期越长,频率越低。经过测试并调节好的TRIM值建议存储在非易失FLASH的寄存器区中,比如0xFFAE用于存储TRIM的最低位,而0xFFAF则存储高8位。存储在FLASH寄存器区中的部分参数在上电时会自动拷贝到零页相应的寄存器中,但这里的TRIM数值需要在初始化阶段手工操作,比如:
extern volatile byte NVICSTRM @0x0000FFAF;
if (NVICSTRM != 0xFF) {
ICSTRM = NVICSTRM; // load trim value if location not blank
}
内部参考时钟状态与控制寄存器(ICSSC)
域 | 描述 |
7:4 | 保留位,保持为0。 |
3:2 CLKST | 时钟源选择指示,稳定后应该与ICSC1寄存器中的CLKS一致,由于内部时钟同步延时的问题,建议修改CLKS后等待一定时间再读取CLKST的状态。 00—选择FLL输出. 01—FLL旁路,选择内部参考时钟. 10—FLL旁路,选择外部参考时钟. 11—保留. |
1 OSCINIT | 外部振荡器稳定状态指示,一般与ICSC2中的EREFS配合使用。如果ERCLKEN值位,或者ICS工作于模式FEE,FBE或FBELP(也就是选择外部时钟模式),并且EREFS值位(即选择振荡器模式,该模式需要稳定时间),则当振荡器稳定后,OSCINIT值位。该状态位只有当ERCLKEN或者EREFS清除时,才被清除。 |
0 FTRIM | ICS内部参考调整精度控制,置位FTRIM使得TRIM的调节刻度变大,相反刻度变小,如需要微调,应该清除该位。 |
| |
3、内部时钟源工作模式切换
内部时钟源一共有七种工作模式,这些工作模式之间的切换状态图见图3,其中主要四种模式FEI、FEE、FBI、FBE之间是可以随意切换的,其中的两种低功耗模式FBILP、FBELP只能与之对应的非低功耗模式之间才能随意切换。在这些模式之间切换时,需要注意如下问题:
1〉 如果要使用FLL,需要配置RDIV位,以保证FLL的输入范围在31.25 kHz到39.0625 kHz之间;
2〉 CLKS与IREFS之间存在一定的联动关系,如果CLKS怎样种葫芦为00(即FLL被选择为时钟源),IREFS可能为1或为0;但如果CLKS为01,IREFS就应该为1;CLKS为10,IREFS就应该为0。
3〉 低功耗除了受LP控制之外,还必须保证BDM不活动,因为BDM需要用到FLL的输出。
4〉 进入停止模式时,如果IRCLKEN和IREFSTEN置位,则ICS的输出ICSIRCLK仍然活动;相同地如果ERCLKEN和EREFSTEN置位,则ICS的输出ICSERCLK也仍然活动。
5〉 在不同模式之间进行切换时,如果新选择的时钟不存在,则单片机会工作在切换前的状态下。
6〉 在FLL被跳过的模式下,如果某时刻需要切换到FLL模式,因为FLL锁定需要时间,建议FLL不要工作于低功耗模式,即LP不要置位,以保证切换迅速、稳定。
7〉 ICS将FLL的输入时钟(31.25 kHz到39.0625 kHz之间)以名字ICSFFCLK输出,该信号可被外设如定时器使用。ICS同时提供一个指示信号ICSFFE(控制Fixed Frequency Clock的输出,见图2),表示主输出ICSOUT是否为信号ICSFFCLK的四倍以上。针对FLL被使能的情形下,由于锁频环将输入信号ICSFFCLK固定512倍频,即使经过BDIV分频(最大8分频),ICSOUT也一定是ICSFFCLK的64倍以上,此时指示信号ICSFFE恒定为“1”,对于FLL被跳过的情形下,则信号完美的生活ICSFFE受两个分频器RDIV和BDIV的控制,下列情形可以保证ICSFFE为高电平:
BDIV=00 (1分频) | RDIV ≥ 010(4分频) |
BDIV=01 (2分频) | RDIV ≥ 011(8分频) |
BDIV=10 (4分频) | RDIV ≥ 100(16分频) |
BDIV=11 (8分频) | RDIV ≥ 101(32分频) |
| |
4、内部时钟源模块的初始化
ICS在上电复位后进入FEI模式,且BDIV设置为缺省的2分频。上电复位后,应对内部参考进行调整,建议使用FLASH存储器地址0xFFAE备份调整数据FTRIM,地址0xFFAF则用于备份8bit的ICSTRM数据。当然从FLASH中读取数据并覆盖零页寄存器的工作要在初始化
阶段手工进行。下面介绍几个时钟初始化与切换的例子。
1〉 初始化,并从内部时钟(FEI或FBI)切换到外部时钟(FEE或FBE):
a> 设置寄存器ICSC2中的相关位,以允许外部时钟,如果打算采用FBE模式,对LP的设置也应该此时进行;
b> 等待一段时间,以使外部时钟稳定,一般振荡器的稳定时间可参考相关技术手册。如果上一步设置了EREFS,即选择了外部振荡器模式,当振荡器稳定后,寄存器ICSSC中的OSCINIT会置位。
c> 给ICSC1赋值,以选择时钟模式。如果选择FEE模式,设置合适的RDIV数值并清除IREFS控制位,此时通过设置IRCLKEN位,使内部参考时钟保持运行,这在内外部时钟需要切换的场合很有用,如果不用切换,则应该关闭内部参考时钟以节省电源。
d> 通过检测寄存器ICSSC中的CLKST位,以观察时钟切换是否完成。如果选择了FEE模式,总线时钟经过数毫秒(由器件参数tAcquire 决定)后达到稳定,但如果是从早安文案FEI模式切换到FEE模式的情形,CLKST中的指示位不会改变。
2〉 从外部时钟(FEE或FBE)模式切换到内部时钟(FEI或FBI)模式初始化:
a> 从FLASH中拷贝备份数据到TRIM和FTRIM中,该过程只在上电复位操作一次;
b> 设置寄存器ICSC1中的相应位以允许内部参考时钟(设置CLKS = 01选择FBI或者设置CLKS = 00,RDIV = 000,并且IREFS = 1以选择FEI模式);