stm32 独立看门狗学习
STM32F10xxx內置兩個看門狗,提供了更高的安全性、時間的精確性和使用的靈活性。兩個看門狗設備(獨立看門狗和窗口看門狗)可用來檢測和解決由軟件錯誤引起的故障。
獨立看門狗(IWDG)由專用的低速時鐘(LSI)驅動,即使主時鐘發生故障它也仍然有效。IWDG最適合應用于那些需要看門狗作為一個在主程序之外,能夠完全獨立工作,并且對時間精度要求較低的場合。
我們的實驗這樣設計,主函數開始的時候,向串口輸出“Hello World”,然后啟動看門口(溢出時間設定為3秒鐘)。在按下按鍵的時候喂狗,同時串口打印“喂狗”。
預期結果:如果不按按鍵,則約每三秒重啟一次,現象是串口隔三秒就會打印“Hello World”;如果在啟動后的3秒內按鍵,則顯示“喂狗”,再在3秒內按鍵……這樣保證不重啟。
看一下代碼吧。
獨立看門狗的初始化:
void IWDG_Init(u8 prer,u16 rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能對寄存器 IWDG_PR 和 IWDG_RLR的寫操作IWDG_SetPrescaler(prer); //設置預分頻值IWDG_SetReload(rlr); //設置重裝載值IWDG_ReloadCounter(); //按照重裝載值裝載IWDG計數器IWDG_Enable(); //看門狗使能 }這個函數有兩個參數:prer 和 rlr
PRER 就是表格中的PR[2:0],取值范圍是0-7;
RLR就是表格中的RL[11:0],取值范圍是0x000-0xFFF;
注意:這里的時間是粗略計算的,不是那么準確。
溢出時間 =?2^PR*(RL+1)/10 ?
單位:ms?
如果我們定時3秒鐘,那么應該是:
IWDG_Init(4,1874); ?// 2^4 * (1874+1) / 10 (ms)= 16*1875/10 (ms)= 3000(ms) = 3s
主函數代碼:
int main(void) { delay_init(); //延時函數初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(9600); //串口初始化printf("Hello World ! \r\n");IWDG_Init(4,1874); // 看門狗初始化并使能key_init(); //按鍵IO初始化EXTIX_Init(); // 按鍵中斷初始化while(1){;} }
喂狗的操作是:
void IWDG_Feed(void) { IWDG_ReloadCounter();//reload }
我們在按鍵中斷處理中喂狗:
void EXTI0_IRQHandler(void) {delay_ms(10); //消除抖動if(KEY3==1) //WK_UP{ printf("喂狗......\r\n");IWDG_Feed();}EXTI_ClearITPendingBit(EXTI_Line0); //清除中斷標志位 }
實驗結果如圖。
如果不喂狗,那么大約3秒鐘就會重啟。
如果喂狗,效果如下。
總結
以上是生活随笔為你收集整理的stm32 独立看门狗学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32 外部中断学习
- 下一篇: 中国汽车产业数字化服务商研究报告及TOP