STM8和STM32都配备了独立看门狗,其作用之大不言而喻。以下为STM8及STM32的独立看门狗使用例:
对于STM32单片机:
#define SYS_IWDG_OPEN IWDG->KR=0xCCCC; #define SYS_IWDG_FEED IWDG->KR=0xAAAA; void SystemIWDG_Config(uint32 OverTime) { RCC->CSR|=RCC_CSR_LSION; while((RCC->CSR&RCC_CSR_LSIRDY)==0); IWDG->KR=0x5555; //使能模块访问 while(IWDG->SR&IWDG_SR_PVU); IWDG->PR=0x0006; //256分频 40000/256=156HZ T=6.4ms while(IWDG->SR&IWDG_SR_RVU); IWDG->RLR=(OverTime*10)>>6; //溢出时间 IWDG->KR=0xAAAA; //装载IWDG->RLR }
对于STM8单片机:
#define SYS_IWDG_OPEN IWDG_KR=0xCC; #define SYS_IWDG_FEED IWDG_KR=0xAA; <pre class="cpp" name="code">void SystemIWDG_Config(void) { CLK_ICKCR|=S3; while((CLK_ICKCR&S4)==0); //STM8单片机需先执行0xCC指令,即先打开IWDG模块,否则IWDG工作不正常 IWDG_KR=0xCC; //启动看门狗 IWDG_KR=0x55; //使能模块访问 IWDG_RLR=0xFF; //溢出时间 IWDG_PR=0x06; //256分频 38000/256=148HZ T=6.7ms IWDG_KR=0xAA; //装载IWDG->RLR }
使用:先在主程序中打开看门狗,在主循环或任务中喂狗,但千万别在中断中喂狗。
void main() { ...... SYS_IWDG_OPEN ...... while(1){ ...... SYS_IWDG_FEED ------ } }
操作系统OS中喂狗一般安排在最高优先级任务中,并且保证此线程不断循环。