独立看门狗的使用
独立看门狗基于低速内部RC振荡器(LSI)运行。
若LSI运行正常,当主程序发生错误时,无法重置看门狗计数器,独立看门狗将会产生复位标志位并重启。
由于独立看门狗基于LSI运行,与主程序、大部分外设相独立,这能最大限度保证独立看门狗的功能正常运行。
1、使能独立看门狗
/* 使能独立看门狗 (低速内部RC振荡器(LSI)将会被硬件使能)
*/ IWDG-》KR = (uint8_t)0xCC;
注意!一旦独立看门狗被使能将无法禁用! 如果你需要使用stm8s的低功耗模式,同时需要使用看门狗复位功能,请选择窗口看门狗!
2、配置分频因子与重装载值
解除PR、RLR寄存器写保护
/* PR、RLR寄存器有写保护,通过向KR寄存器写入0x55解除写保护。 */
IWDG-》KR = (uint8_t)0x55;
/* 通过写入0xAA恢复写保护。 */
IWDG-》KR = (uint8_t)0xAA;
设置IWDG分频
/* 4分频 */ IWDG-》PR = (uint8_t)0x00;
/* 8分频 */ IWDG-》PR = (uint8_t)0x01;
/* 16分频 */ IWDG-》PR = (uint8_t)0x02;
/* 32分频 */ IWDG-》PR = (uint8_t)0x03;
/* 64分频 */ IWDG-》PR = (uint8_t)0x04;
/* 128分频 */ IWDG-》PR = (uint8_t)0x05;
/* 256分频 */ IWDG-》PR = (uint8_t)0x06;
设置IWDG自动重装载值
/* IWDG_Period为需要设置的自动重装载值 */
IWDG-》RLR = (uint8_t)(IWDG_Period);
IWDG计时触发公式
IWDG_Period= (time * IWDG_Counter_Clock - 1);
IWDG_Period为设置的自动重装载值
time 为IWDG触发所需时间(s)
IWDG_Counter_Clock 为IWDG频率,等于LSI/IWDG分频值(hz)
3、初始化案例
__IO uint32_t LsiFreq = 128000;
/* Enable IWDG (the LSI oscillator will be enabled by hardware) */
IWDG-》KR = (uint8_t)0xCC;
/* IWDG timeout equal to 250 ms (the timeout may varies due to LSI frequency dispersion) */
/* Enable write access to IWDG_PR and IWDG_RLR registers */
IWDG-》KR = (uint8_t)0x55;
/* IWDG counter clock: LSI(128KHZ)/128 = 1000 */
IWDG-》PR = (uint8_t)0x05;
/* Set counter reload value to obtain 250ms IWDG Timeout.
Counter Reload Value = 250ms/IWDG counter clock period = 250ms / (LSI/128) = 0.25s / (LsiFreq/128) = LsiFreq/(128 * 4) = LsiFreq/512
*/ IWDG-》RLR = ((uint8_t)(LsiFreq / 512));
/* Reload IWDG counter */
IWDG-》KR = (uint8_t)0xAA;
主函数
void main(void)
{
/** * 省略 * */ while (1)
{
/** * 省略 *
*/
/* Reload IWDG counter */
IWDG_ReloadCounter();
}
}
独立看门狗的使用
独立看门狗基于低速内部RC振荡器(LSI)运行。
若LSI运行正常,当主程序发生错误时,无法重置看门狗计数器,独立看门狗将会产生复位标志位并重启。
由于独立看门狗基于LSI运行,与主程序、大部分外设相独立,这能最大限度保证独立看门狗的功能正常运行。
1、使能独立看门狗
/* 使能独立看门狗 (低速内部RC振荡器(LSI)将会被硬件使能)
*/ IWDG-》KR = (uint8_t)0xCC;
注意!一旦独立看门狗被使能将无法禁用! 如果你需要使用stm8s的低功耗模式,同时需要使用看门狗复位功能,请选择窗口看门狗!
2、配置分频因子与重装载值
解除PR、RLR寄存器写保护
/* PR、RLR寄存器有写保护,通过向KR寄存器写入0x55解除写保护。 */
IWDG-》KR = (uint8_t)0x55;
/* 通过写入0xAA恢复写保护。 */
IWDG-》KR = (uint8_t)0xAA;
设置IWDG分频
/* 4分频 */ IWDG-》PR = (uint8_t)0x00;
/* 8分频 */ IWDG-》PR = (uint8_t)0x01;
/* 16分频 */ IWDG-》PR = (uint8_t)0x02;
/* 32分频 */ IWDG-》PR = (uint8_t)0x03;
/* 64分频 */ IWDG-》PR = (uint8_t)0x04;
/* 128分频 */ IWDG-》PR = (uint8_t)0x05;
/* 256分频 */ IWDG-》PR = (uint8_t)0x06;
设置IWDG自动重装载值
/* IWDG_Period为需要设置的自动重装载值 */
IWDG-》RLR = (uint8_t)(IWDG_Period);
IWDG计时触发公式
IWDG_Period= (time * IWDG_Counter_Clock - 1);
IWDG_Period为设置的自动重装载值
time 为IWDG触发所需时间(s)
IWDG_Counter_Clock 为IWDG频率,等于LSI/IWDG分频值(hz)
3、初始化案例
__IO uint32_t LsiFreq = 128000;
/* Enable IWDG (the LSI oscillator will be enabled by hardware) */
IWDG-》KR = (uint8_t)0xCC;
/* IWDG timeout equal to 250 ms (the timeout may varies due to LSI frequency dispersion) */
/* Enable write access to IWDG_PR and IWDG_RLR registers */
IWDG-》KR = (uint8_t)0x55;
/* IWDG counter clock: LSI(128KHZ)/128 = 1000 */
IWDG-》PR = (uint8_t)0x05;
/* Set counter reload value to obtain 250ms IWDG Timeout.
Counter Reload Value = 250ms/IWDG counter clock period = 250ms / (LSI/128) = 0.25s / (LsiFreq/128) = LsiFreq/(128 * 4) = LsiFreq/512
*/ IWDG-》RLR = ((uint8_t)(LsiFreq / 512));
/* Reload IWDG counter */
IWDG-》KR = (uint8_t)0xAA;
主函数
void main(void)
{
/** * 省略 * */ while (1)
{
/** * 省略 *
*/
/* Reload IWDG counter */
IWDG_ReloadCounter();
}
}
举报