1. 程式人生 > >STM8關於IWDG看門狗和HSI高速時鐘和復位的坑

STM8關於IWDG看門狗和HSI高速時鐘和復位的坑

前言:我的第一篇部落格,快被逼瘋了。用的STM8S003F3,耗時5天,問題已解決,結局很坑!

但因為這一個問題,我似乎將stm8的時鐘,復位,看門狗,iar的使用幾乎全吃透了。

忠告:不要隨隨便便相信百度裡頭隨便找來的資料!

現象:主頻只在16MHz時,程式頻繁複位不可控,其他現象異常離奇不闡述了,防止傷腦。

正文:前因後果是這樣的:

1,我配置了16M的主頻

CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//內部高速時鐘,不分頻

或者:CLK->CKDIVR = 0x00;  //HSIDIV = 0 CPUDIV = 0   cpu時鐘 = 16Mhz

發現它頻繁自動復位,復位速度極快,找不到原因,問了老總,老總說復位和IWDG有關。

2,沒學過也沒設定過看門狗,那就配置吧

大體就是讓我配置一下,網上各種配置方法,精簡後,所有網上內容都統一為:

void IWDG_Init(void) //配置並啟動看門狗

    IWDG->KR = 0xCC;    //啟動獨立看門狗  
    IWDG->KR = 0x55;    //寫入解鎖  
    IWDG->PR = 0x06;    //256分頻
    IWDG->RLR = 0xFF;    //設定過載暫存器
    IWDG->KR = 0xAA;    //鎖定並重新整理
//    IWDG_Enable();      //使能看門狗 
//    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);    //寫使能
//    IWDG_SetPrescaler(IWDG_Prescaler_256);        //預分頻256,128KHZ/256 
//    IWDG_SetReload(0XFF);        //設定每次喂狗的計數值。
//    IWDG_ReloadCounter();        //喂狗

}

操作暫存器和庫函式都有了,而且是不出錯的

void WDT(void)//喂狗
{  
   IWDG->KR = 0xaa;

}

定期喂狗即可,LSI的256分頻大概1秒左右喂一次狗,不喂就復位,看起來就很簡單了

3我真心是為了解決問題把獨立喂狗IWDG都快吃透了,保證看門狗配置絕對沒問題了,復位問題還是沒解決!

正常情況,看門狗是可要可不要的,不是說開機就會自動初始化(老總的隱形誤導)。

如果我初始化看門狗了,看門狗也應該1秒復位一次,可我1秒復位n多次,那說明跟看門狗無關

4排查發現,又跟時鐘有關

CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);//內部高速時鐘,分頻2


分頻2,4,8,程式不再復位了,就是說16M會自動復位,8M以下就不復位了?可我就是要16M啊

手冊說,看門狗用LSI,我主頻用HSI,互相不影響吧?(互不影響)

5快瘋了,要交差,半路出現問題搞不定

把程式碼全刪了,只留了幾句話

 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//內部高速時鐘,不分頻

 GPIO_Init(Laser_V1_Port, (GPIO_Pin_TypeDef)Laser_V1_Pin, GPIO_MODE_OUT_PP_LOW_SLOW);    //燈亮

 int i=1000;
 GPIO_WriteHigh(Laser_V1_Port,Laser_V1_Pin);
 while(i--);

 GPIO_WriteLow(Laser_V1_Port,Laser_V1_Pin);

 while(1) { }

按照邏輯,開機亮一下啊,可我現在一直會亮,(因為它復位了)

找了個別人的demo試試,還是一樣,但是用別的STM8開發板試了就沒事!

6最終發現while(1){}去掉,則不再復位了,while(1){}不去掉,燈還是不停的閃

靠,這根本不是復位,而是燈閃的操作被莫名迴圈了,不是復位導致的!!!!靠,拍電影啊,這麼彎彎繞!

7問題沒發現,但是問題已解決,那就是:

main()函式中,如果while(1)是空的,會執行while(1)意外的程式碼?不要讓while(1)空著就行

這TM什麼鬼,明明技術貼,搞得跟走近科學一樣(中間過程忽略)

8最後一天,都快放棄了,最後猜想是不是硬體問題?!內心思路:跟硬體有毛關係啊!


最終:Vcap將它的電容從103改為105,復位問題奇蹟般不再發生了(1uF)。

為什麼我就選了103?!啊?因為我特麼從網上百度隨便找了個百度文庫照抄的!坑啊!(NRST也沒加電容!)