TMS320F2806X学习笔记(二)—— 时钟系统、看门狗、低功耗模式
系统时钟
系统时钟是绝大部分数字系统运行的基础,F2806X包含两个内部10MHz时钟,同时也支持外部时钟源、外部晶振,选定时钟经过一个可旁路的锁相环为系统提供时钟。

锁相环(PLL)
一个基于锁相环(PLL)的片上时钟模块可以为看门狗模块、内核和CPU定时器2提供时钟,锁相环输入可以是4个时钟源中的任意一个。PLL具有一个5位比率控制寄存器PLLCR[DIV],用于选择不同的CPU时钟频率。在写入PLLCR寄存器之前,应先禁用看门狗模块。在PLL模块稳定后(需要1毫秒),可以重新启用看门狗模块(如果需要)。输入时钟和PLLCR[DIV]位的选取应确保PLL的输出频率(VCOCLK)至少为50兆赫。

锁相环关闭
用户通过设置PLLSTS寄存器中的PLLOFF位来调用此模式。在此模式下,PLL模块被禁用。这对于降低系统噪声和实现低功耗运行非常有用。在进入此模式之前,必须先将PLLCR寄存器设置为0x0000(PLL旁路)。CPU时钟(CLKIN)直接来源于X1/X2、X1或XCLKIN上的输入时钟。
锁相环旁路
锁相环(PLL)旁路是上电或外部复位(XRS)后的默认PLL配置。当PLLCR寄存器设置为0x0000时,或者当PLLCR寄存器被修改后PLL锁定到新频率时,会选择此模式。在此模式下,PLL被旁路,但并未关闭。
锁相环使能
通过将非零值n写入PLLCR寄存器来实现。一旦向PLLCR写入数据,设备将切换至PLL旁路模式,直至PLL锁定。
锁相环2(PLL2)
除了主系统PLL外,这些设备还包含一个可用于为USB和HRCAP外设提供时钟的第二PLL(PLL2)。该PLL支持1到15的乘法器,且其输出端具有固定的二分频功能。USB外设需要60 MHz频率,为了确保USB模块正常运行,应将PLL2配置为生成120MHz的时钟。HRCAP支持最高120 MHz的时钟输入频率。
修改PLL2CTL寄存器中的PLL2CLKSRCSEL位,可以选择INTOSC2以外的三种时钟源作为PLL2时钟输入。且由于精度问题,INTOSC1作为PLL2时钟源时其输出只能用作HRCAP的时钟源不能用作USB的时钟源,且应频繁调用振荡器补偿程序。
时钟丢失检测
在PLL启用和PLL旁路模式下,如果PLL的输入时钟消失,PLL将在其输出端发出一个跛行模式时钟。该跛行模式时钟继续以1-5 MHz的典型频率为CPU和外围设备提供时钟。
当启用跛行模式时,会生成一个CLOCKFAIL信号,该信号会被锁定为非屏蔽中断(NMI)中断。根据NMIRESETSEL位的配置方式,设备可以立即触发重置,或者当NMI看门狗计数器溢出时发出重置。除此之外,还会设置缺失时钟状态(MCLKSTS)位。应用程序可以使用NMI中断来检测输入时钟故障,并启动必要的纠正措施,如切换到备用时钟源(如果可用)或启动系统关机程序。如果软件对时钟故障条件没有响应,非屏蔽中断(NMI)看门狗会在预编程的时间间隔后触发重置。

CPU看门狗
每当2806x设备上的CPU看门狗8位递增计数器达到其最大值时,该模块会生成一个512个振荡器时钟(OSCCLK)宽度的输出脉冲。为防止这种情况发生,用户必须禁用该计数器,或者软件必须定期向看门狗密钥寄存器写入0x55 + 0xAA序列,以重置看门狗计数器。

输入时钟故障会使CPU看门狗计数器停止工作,跛行模式时钟不会对CPU看门狗生效。
看门狗可以在IDLE/STANDBY模式下唤醒CPU,在HALT模式下复位系统。
低功耗模式
F2806X支持三种低功耗模式:IDLE / STANDBY / HALT。在尝试将设备置于HALT或STANDBY状态之前,CPU时钟(OSCCLK)和看门狗时钟源应来自同一时钟源。
空闲(IDLE)
将CPU置于低功耗模式。可选择性地关闭外设时钟,仅保留那些在空闲状态下必须运行的外设继续运行。来自活动外设或看门狗定时器的已启用中断会将处理器从空闲模式中唤醒。
待机(STANDBY)
关闭CPU和外围设备的时钟。此模式保留振荡器和PLL的功能。外部中断事件会唤醒处理器和外围设备。在检测到中断事件后的下一个有效周期,程序执行将开始
暂停(HALT)
此模式基本上会关闭设备,并将其置于最低功耗模式。如果内部零引脚振荡器用作时钟源,则HALT模式默认会将其关闭。为了防止这些振荡器关闭,可以使用CLKCTL寄存器中的INTOSCnHALTI位。因此,在此模式下,零引脚振荡器可用于为CPU看门狗提供时钟。如果片上晶体振荡器用作时钟源,则在此模式下会被关闭。复位、外部信号(通过GPIO引脚)或CPU看门狗可以将设备从该模式唤醒。
时钟和PLL寄存器
配置设备时钟域(CLKCTL)
| CLKCTL | |||
| 位 | 域 | 说明 | |
| 15 | NMIRESETSEL | NMI复位选择位。该位用于选择当VCOCLK计数器因时钟缺失条件而溢出时的操作。注意:无论选择哪种模式,都会产生CLOCKFAIL信号。 | |
| 0 | MCLKRS 在驱动时无任何延迟(复位时默认为此状态) | ||
| 1 | NMI看门狗复位(NMIRS)会启动MCLKRS。 | ||
| 14 | XTALOSCOFF | 晶体振荡器关闭位。若不使用晶体振荡器,可通过此位将其关闭。 | |
| 0 | 晶体振荡器开启(复位默认) | ||
| 1 | 晶体振荡器关闭 | ||
| 13 | XCLKINOFF | 此位用于关闭外部XCLKIN振荡器输入。注意:您需要通过XCLK寄存器中的XCLKINSEL位选择XCLKIN GPIO引脚源。如果使用XCLKIN,则XTALOSCOFF必须设置为1。 | |
| 0 | XCLKIN振荡器输入开启(复位默认) | ||
| 1 | XCLKIN振荡器输入关闭 | ||
| 12 | WDHALTI | 用于选择HALT模式是否自动关闭看门狗。此功能可用于在HALT模式激活时,允许所选看门狗时钟源继续为看门狗计时。这将使看门狗能够定期唤醒设备。 | |
| 0 | HALT模式自动关闭(复位默认) | ||
| 1 | 看门狗在HALT模式下继续运行 | ||
| 11 | INTOSC2HALTI | 内部振荡器2的HALT模式忽略位。此位用于选择HALT模式是否自动关闭内部振荡器2。此功能可用于在HALT模式激活时,允许内部振荡器继续提供时钟。这将实现从HALT模式更快的唤醒。 | |
| 0 | 内部振荡器2在HALT模式下自动关闭(复位默认) | ||
| 1 | 内部振荡器2在HALT模式下继续工作。此功能可用于在 HALT 模式激活时,让内部振荡器继续计时。这将实现从 HALT 模式更快的唤醒。 | ||
| 10 | INTOSC2OFF | 关闭内部振荡器2 | |
| 0 | 内部振荡器2开启(复位默认) | ||
| 1 | 内部振荡器2关闭 | ||
| 9 | INTOSC1HALTI | 内部振荡器1的HALT模式忽略位。此位用于选择HALT模式是否自动关闭内部振荡器1。此功能可用于在HALT模式激活时,允许内部振荡器继续提供时钟。这将实现从HALT模式更快的唤醒。 | |
| 0 | 内部振荡器1在HALT模式下自动关闭(复位默认) | ||
| 1 | 内部振荡器1在HALT模式下继续工作。此功能可用于在 HALT 模式激活时,让内部振荡器继续计时。这将实现从 HALT 模式更快的唤醒。 | ||
| 8 | INTOSC1OFF | 关闭内部振荡器1 | |
| 0 | 内部振荡器1开启(复位默认) | ||
| 1 | 内部振荡器1关闭 | ||
| 7~5 | TMR2CLKPRESCALE | CPU定时器2时钟预分频值。这些位用于为CPU定时器2所选的时钟源选择预分频值。此选择不受缺失时钟检测电路的影响。 | |
| 000 | /1(复位默认) | ||
| 001 | /2 | ||
| 010 | /4 | ||
| 011 | /8 | ||
| 100 | /16 | ||
| 预留 | 预留 | ||
| 4~3 | TMR2CLKSRCSEL | 选择CPU定时器2的时钟源,此选择不受时钟丢失检测电路的影响。 | |
| 00 | 选择SYSCLKOUT(复位时默认为此状态,预分频器被旁路) | ||
| 01 | 选择外部振荡器 | ||
| 10 | 选择内部振荡器1 | ||
| 11 | 选择内部振荡器2 | ||
| 2 | WDCLKSRCSEL | 选择看门狗时钟的来源。在XRS为低电平时以及XRS变为高电平后,默认选择内部振荡器1。在初始化过程中,用户需要选择外部振荡器或内部振荡器2。如果丢失时钟检测电路检测到丢失时钟,则该位会被强制置为0,并选择内部振荡器1。用户更改该位不会影响PLLCR的值。 | |
| 0 | 选择内部振荡器1(复位默认) | ||
| 1 | 选择外部振荡器或内部振荡器2 | ||
| 1 | OSCCLKSRC2SEL | 选择内部振荡器2或外部振荡器。此选择不受时钟缺失检测电路的影响。 | |
| 0 | 选择外部振荡器(复位默认) | ||
| 1 | 选择内部振荡器2 | ||
| 0 | OSCCLKSRCSEL | 选择OSCCLK的源。在XRS为低电平时且XRS变为高电平后,默认选择内部振荡器1。用户需要在初始化过程中选择外部振荡器或内部振荡器2。 每当用户使用这些位更改时钟源时,PLLCR寄存器将自动被强制清零。这可以防止潜在的PLL过冲。然后,用户必须写入PLLCR寄存器以配置适当的PLL倍频值。如有必要,用户还可以使用PLLLOCKPRD寄存器配置PLL锁定周期以减少锁定时间。如果缺失时钟检测电路检测到缺失时钟,则该位将自动被强制清零,并选择内部振荡器1。同时,PLLCR寄存器也将自动被强制清零,以防止任何潜在的过冲。 注意:如果用户希望使用振荡器2或外部振荡器为CPU提供时钟,则应先配置OSCCLKSRC2SEL位,然后再写入OSCCLKSRCSEL位。 | |
| 0 | 选择内部振荡器1(复位默认) | ||
| 1 | 选择外部振荡器或内部振荡器2 | ||
锁相环状态寄存器(PLLSTS)
| PLLSTS | |||
| 位 | 域 | 说明 | |
| 15 | NORMRDYE | 选择当VREG失调时,是否允许来自VREG的NORMRDY信号阻止PLL开启。在进入和退出HALT模式时,可能需要保持PLL关闭,而此信号可用于此目的.当VREG失调时,来自VREG的NORMRDY信号为低,而当VREG处于调节范围内时,此信号将变为高。 | |
| 0 | 来自VREG的NORMRDY信号不会阻止PLL(PLL忽略NORMRDY) | ||
| 1 | 来自VREG的NORMRDY信号会阻止PLL(当NORMRDY为低时,PLL关闭) | ||
| 14~9 | 预留 | 预留 | |
| 8 | DIVSEL | 选择CPU的CLKIN的分频比,可选值为/4、/2和/1。 | |
| 00 | CLKIN选择除以4 | ||
| 01 | |||
| 10 | CLKIN选择除以2 | ||
| 11 | CLKIN选择除以1 | ||
| 6 | MCLKOFF | 缺失时钟检测关闭位 | |
| 0 | 主振荡器故障检测逻辑已启用(默认) | ||
| 1 | 主振荡器故障检测逻辑已禁用,且PLL不会发出跛行模式时钟。当代码必须不受检测电路影响时,请使用此模式。例如,如果外部时钟已关闭。 | ||
| 5 | OSCOFF | 振荡器时钟关闭位 | |
| 0 | 来自X1/X2或XCLKIN的OSCCLK信号被馈送到PLL模块(默认设置) | ||
| 1 | 来自X1/X2或XCLKIN的OSCCLK信号未被馈送到PLL模块。这并不会关闭内部振荡器。OSCOFF位用于测试缺失时钟检测逻辑。 当OSCOFF位被置位时,请勿进入HALT或STANDBY模式,也不要对PLLCR进行写入操作,因为这些操作可能会导致不可预测的行为。 当OSCOFF位被设置时,看门狗的行为会因所使用的输入时钟源(X1、X1/X2或XCLKIN)的不同而有所差异:• X1/X2:看门狗不起作用。 • XCLKIN:看门狗功能正常,在设置OSCOFF之前应将其禁用。 | ||
| 4 | MCLKCLR | 时钟缺失清零 | |
| 0 | 写入0没有任何效果。该位始终读取为0 | ||
| 1 | 强制清除并重置缺失时钟检测电路。如果OSCCLK仍然缺失,检测电路将再次向系统发出复位信号,设置缺失时钟状态位(MCLKSTS),并且CPU将以PLL在跛行模式频率下运行来获取时钟。 | ||
| 3 | MCLKSTS | 时钟状态位缺失。复位后检查该位的状态,以确定是否检测到振荡器缺失的情况。在正常情况下,该位应为0。对该位的写入操作将被忽略。通过写入MCLKCLR位或强制外部复位,可将该位清零。 当缺失时钟检测电路在检测到OSCCLKSRC2故障后自动从OSCCLKSRC2切换到OSCCLKSRC1时,该位将自动清零,且缺失时钟检测电路将重新启用。对于所有其他情况,用户需要通过向MCLKCLR位写入1来重新启用此模式。 | |
| 0 | 正常运行 | ||
| 1 | 检测到OSCCLK缺失。主振荡器故障检测逻辑已重置设备,CPU现在由运行在应急模式频率下的PLL提供时钟。 | ||
| 2 | PLLOFF | PLL关闭位。此位用于关闭PLL。这对于系统噪声测试非常有用。此模式仅在PLLCR寄存器设置为0x0000时使用。 当 PLLOFF 位被设置时,PLL 模块将保持断电状态。 在向PLLOFF写入1之前,设备必须处于PLL旁路模式(PLLCR = 0x0000)。当PLL关闭时(PLLOFF = 1),请勿向PLLCR写入非零值。 当PLLOFF = 1时,待机(STANDBY)和暂停(HALT)低功耗模式将按预期工作。从暂停或待机状态唤醒后,PLL模块将保持断电状态。 | |
| 0 | PLL开启(默认设置) | ||
| 1 | PLL关闭。 | ||
| 1 | 预留 | 预留 | |
| 0 | PLLLOCKS | 锁相环锁定状态 | |
| 0 | PLLCR 寄存器已被写入,且当前 PLL 正在锁定。在 PLL 锁定之前,CPU 的时钟频率为 OSCCLK/2。 | ||
| 1 | 锁相环(PLL)已完成锁定,目前处于稳定状态。 | ||
时钟配置代码示例
/* 系统时钟为90MHz = 10MHz * 18 / 2 */
#define SYSTEM_PLL_DIV 18
#define SYSTEM_PLL_DIVSEL 2
/* 系统时钟设置 */
void system_clock_setup(void)
{
/* 选择内部振荡器1作为系统时钟源并关闭其他时钟源 */
EALLOW;
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL=0; // Clk Src = INTOSC1
SysCtrlRegs.CLKCTL.bit.XCLKINOFF=1; // Turn off XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF=1; // Turn off XTALOSC
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF=1; // Turn off INTOSC2
EDIS;
/* 写PLLCR寄存器前确认PLLSTS中DIVSEL为0,即CPU时钟为1/4 CLKIN */
if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0) {
EALLOW;
SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;
EDIS;
}
/* PLLCR寄存器配置 */
if (SysCtrlRegs.PLLCR.bit.DIV != SYSTEM_PLL_DIV) {
/* 关闭主时钟丢失检测并写入新的DIV参数 */
EALLOW;
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;
SysCtrlRegs.PLLCR.bit.DIV = SYSTEM_PLL_DIV;
EDIS;
/* 等待PLL锁定 */
while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1) {
}
/* 重启主时钟失效检测 */
EALLOW;
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;
EDIS;
}
/* 设置PLL分频 */
EALLOW;
SysCtrlRegs.PLLSTS.bit.DIVSEL = SYSTEM_PLL_DIVSEL;
EDIS;
}
更多推荐
所有评论(0)