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也沒加電容!)