STM32独立看门狗
时间: 2018-01-04来源:OSCHINA
前景提要
1. 取消寄存器写保护(也即是先IWDG_KR中写入0x5555)
目的:取消IWDG_PR和IWDG_RLR寄存器写保护,从而可以操作这两个寄存器
库函数:void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
2. 设置预分频系数
设置预分频寄存器(IWDG_PR)的预分频因子(IWDG_Prescaler),也就设置了计数器的时钟频率
例如:IWDG_Prescaler_256,就是设置计数器时钟频率为LSI_FREQ/256​
库函数:void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
3. 设置重装载值
向重装载寄存器(IWDG_RLR) 写入重装载值Reload​,最大0xFFF
超时时间TimeOut = Reload * 计数周期 = Reload / 计数频率
= ​Reload / IWDG_Prescaler
Reload = TimeOut * ​IWDG_Prescaler
例如:​IWDG_Prescaler = IWDG_Prescaler_256 = LSI_FREQ/256​
​Reload = LSI_FREQ/128
​​TimeOut = Reload / IWDG_Prescaler = (LSI_FREQ/256​)/(LSI_FREQ/128) = 0.5s = 500ms
库函数:void IWDG_SetReload(uint16_t Reload);
4. 重载计数值喂狗(向IWDG_KR写入0xAAAA)
向IWDG_KR寄存器写入0xAAAA时,重装载值会被传送到计数器中
库函数:void IWDG_ReloadCounter(void);
5. 启动看门狗(向IWDG_KR 写入0xCCCC)
写入0xCCCC,启动看门狗工作(若选择了硬件看门狗则不受此命令字限制)。
库函数:void IWDG_Enable(void);
6. 喂狗(向IWDG_KR写入0xAAAA)
喂狗,其实就是重载计数值喂狗(向IWDG_KR写入0xAAAA)
向IWDG_KR寄存器写入0xAAAA时,重装载值会被传送到计数器中
在看门够复位前,再次把数值写入;​
库函数:void IWDG_ReloadCounter(void);
#define LSI_FREQ 37000 // LSI频率约37KHz #define IWDG_RELOAD LSI_FREQ/32 //范围0-0xFFF() #define IWDG_CLOCK_PRECALER IWDG_Prescaler_256 //如果使用的是LSI,则时钟频率是LSI_FREQ/256 //IWDG_Prescaler_4 //IWDG_Prescaler_8 //IWDG_Prescaler_16 //IWDG_Prescaler_32 //IWDG_Prescaler_64 //IWDG_Prescaler_128 //IWDG_Prescaler_256 /** * @brief 初始化独立看门狗 * @param IWDG_CLOCK_PRECALER, IWDG_RELOAD * IWDG_CLOCK_PRECALER, IWDG_Prescaler: specifies the IWDG Prescaler value. * This parameter can be one of the following values: * @arg IWDG_Prescaler_4: IWDG prescaler set to 4 * @arg IWDG_Prescaler_8: IWDG prescaler set to 8 * @arg IWDG_Prescaler_16: IWDG prescaler set to 16 * @arg IWDG_Prescaler_32: IWDG prescaler set to 32 * @arg IWDG_Prescaler_64: IWDG prescaler set to 64 * @arg IWDG_Prescaler_128: IWDG prescaler set to 128 * @arg IWDG_Prescaler_256: IWDG prescaler set to 256 * @retval None */ void IWDG_init(void) { /* IWDG timeout equal to 1s (the timeout may varies due to LSI frequency dispersion) */ /* Enable write access to IWDG_PR and IWDG_RLR registers */ IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); /* IWDG counter clock: LSI/256 */ IWDG_SetPrescaler(IWDG_CLOCK_PRECALER); /* Set counter reload value to obtain 1s IWDG TimeOut. TimeOut = 1s Counter Reload Value = TimeOut/IWDG counter clock period = TimeOut * IWDG counter clock Frequence = 1 * (LSI_FREQ/256) = LSI_FREQ/256 */ IWDG_SetReload(IWDG_RELOAD); /* Reload IWDG counter */ IWDG_ReloadCounter(); /* Enable IWDG (the LSI oscillator will be enabled by hardware) */ IWDG_Enable(); } /** * @brief 独立看门狗喂狗函数 * @param None * @retval None */ void IWDG_feed(void) { /* Reload IWDG counter */ IWDG_ReloadCounter(); }

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行