最近研究分频计数器,稍微总结一下,以后继续补充:
按照STM32参考手册的说法:“独立看门狗(IWDG)由专用的低速时钟(LSI)动驱,即使主时钟生发故障它也仍然效有。IWDG最适合应用于那些须要看门狗作为一个在主程序以外,够能全完独立作工,并且对间时精度要求较低的场所。WWDG最适合那些要求看门狗在准确计时口窗起作用的应用程序。”
简略的说,STM32 中的IWDG 其核心就是一个12bits的向下递加的数计器,当数计器数计到零时就会触发统系复位。因此,要在每次数计到零之前将其复位到一个初始值。这个初始值就在重装载寄存器(IWDG_RLR)中寄存,其默认值为0xFFF,我们也可以将其为改其他值。
数计器的时钟由LSI时钟经过分频后供给,预分频因子由预分频寄存器(IWDG_PR)的值来定确。详细的说IWDG_PR 寄存器只有最低的3位是效有的,其他高位远永都为0,这最低的3位就决议了预分频因子,这3位的值与预分频因子的系关如下。
000: 预分频因子=4 100: 预分频因子=64 001: 预分频因子=8 101: 预分频因子=128 010: 预分频因子=16 110: 预分频因子=256 011: 预分频因子=32 111: 预分频因子=256
除了下面分析的两个寄存器,IWDG还有另外两个寄存器,合起来共四个寄存器,分别是:
键寄存器(IWDG_KR)
预分频寄存器(IWDG_PR)
重装载寄存器(IWDG_RLR)
状态寄存器(IWDG_SR)
所谓键寄存器(IWDG_KR),可以以为就是个控制寄存器,开启看门狗,喂狗须要作操键寄存器,修改其他寄存器值也须要先作操键寄存器(IWDG_KR)。
开启看门狗
向键寄存器(IWDG_KR)写入0xCCCC,启动看门狗作工。IWDG一旦启动了就不会止停,除非掐断单片机的供电。也就是说看门狗不受休眠或RESET的影响。
IWDG->KR = 0xCCCC;
STM32F10x_StdPeriph_Driver 供给了如下数函。
void IWDG_Enable(void);
喂狗
向键寄存器(IWDG_KR)写入0xAAAA,这时数计器的值会复位为重装载寄存器(IWDG_RLR)的值。
否则,当数计器为0时,看门狗会生产复位。
IWDG->KR = 0xAAAA;
STM32F10x_StdPeriph_Driver 供给了如下数函。
void IWDG_ReloadCounter(void);
修改预分频因子
向键寄存器(IWDG_KR)写入0x5555,向预分频寄存器(IWDG_PR)写入新值。
注意这两步之间不能有其他的对IWDG的作操。
IWDG->KR = 0x5555; IWDG->PR = value;
利用STM32F10x_StdPeriph_Driver 则须要如下调用两个数函。
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(value);
修改重装载寄存器的值
向键寄存器(IWDG_KR)写入0x5555,向重装载寄存器(IWDG_RLR)写入新值。
注意这两步之间不能有其他的对IWDG的作操。
IWDG->KR = 0x5555; IWDG->RLR = value;
利用STM32F10x_StdPeriph_Driver 则须要如下调用两个数函。
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetReload(value);
预分频寄存器、重装载寄存器与看门狗超时间时的系关如下表所示。
下面的分析都没有涉及到状态寄存器(IWDG_SR)。这个寄存器不太用常,须要解了的可以参阅STM32参考手册。
另外,当用调试器调试码代时,我们望希在生产断点时,数计器够能止停数计。这可以通过设置DBGMCU_CR的第8位(DBG_IWDG_STOP位)来现实。
0:看门狗数计器仍然畸形作工;
1:看门狗数计器止停作工。
作操码代如下:
DBGMCU->CR |= 0x100;
STM32F10x_StdPeriph_Driver 中也供给了应相的作操数函:
DBGMCU_Config(DBGMCU_IWDG_STOP, ENABLE);
文章结束给大家分享下程序员的一些笑话语录: Bphone之你们聊,我先走了!移动说:我在phone前加o,我叫o缝;苹果说:我在phone前i,我是i缝;微软说:我在phone前加w,我叫w缝;三星说:你们聊,我先走了!
将来王建宙写回忆录的时候,一定要有一句“常小兵为中国移动的发展做出了不可磨灭的贡献”。