stm32CubeMx..........多數嵌入式編程人員可能已程習慣使用stm32的庫開發方式來實現功能,庫版本v3.5.0本人之前也一直使用,開始使用stm32CubeMx開發方式,發現和原先庫開發方式與很多不同,實現方法也有區別。本文旨在將個人在stm32CubeMx開發方式中總結的一些經驗寫出來,供大家參考。
對于看門狗而言,stm32中有兩種,分為獨立看門狗(IWDG)和窗口看門狗(WWDG),在此大概介紹下兩條警犬,本文重點介紹窗口看門狗。
獨立看門狗:獨立看門狗(IWDG)由專用的40kHz的低速時鐘驅動,即使主時鐘發生故障它也仍然有效。IWDG最適合應用于那些需要看門狗作為一個在主程序之外,能夠完全獨立工作,并且對時間精度要求較低的場合。
窗口看門狗:窗口看門狗通常被用來監測由外部干擾或不可預見的邏輯條件造成的應用程序背離正常的運行序列而產生的軟件故障。通俗說就是會產生兩個復位。復位條件:(1)當計數器的數值從0x40減到0x3F;(2)當刷新看門狗時計數器的數值大于窗口上限值時。滿足任何一條都可以產生復位信號。通常情況下設置窗口上限值為0x7F,下限值默認為0x40,計數器向下數到0x40就會產生中斷,下個910us后變為0x3F就會復位系統。也就是喂狗操作不能早喂,即大于窗口值時會發生復位;喂的晚了,即計數器的數值從0x40減到0x3F時沒有及時喂狗,也會產生復位。
實驗說明:板子型號為stm32F103VET6, 每次喂狗并通過串口打印出來
下面來看下在stm32CubeMx中窗口看門狗的實現。
1、在stm32cubemx中設值
我們設置分頻系數為8;窗口值為0x5f;計數值為0x7f;其中窗口默認下限值為0x40。并打開中斷,打開中斷后,會置1中斷位,如圖:
(2)寫WWDG初始化函數
void WWDG_Init(void)
{
__WWDG_CLK_ENABLE(); //使能WWDG時鐘
MX_WWDG_Init(); //調用系統初始化函數,也就是我們在圖形界面設置好值后,會將我們剛才設置的值轉化為代碼。在本函數里直接調用即可
__HAL_WWDG_CLEAR_FLAG(&hwwdg, WWDG_FLAG_EWIF); // 開啟中斷前,先清除中斷標志位
HAL_WWDG_Start_IT(&hwwdg); //設置中斷標志位,并開啟中斷,
}
(3)我們再來開下在中斷函數,cubemx的中斷函數處理和庫開發方式還是有區別的。
/**
* @brief This function handles Window watchdog interrupt.
*/
void WWDG_IRQHandler(void)
{
/* USER CODE BEGIN WWDG_IRQn 0 */
/* USER CODE END WWDG_IRQn 0 */
HAL_WWDG_IRQHandler(&hwwdg);
/* USER CODE BEGIN WWDG_IRQn 1 */
/* USER CODE END WWDG_IRQn 1 */
}
我們看到在它的中斷函數里調用了一個函數, HAL_WWDG_IRQHandler(&hwwdg); 我們再來看這個函數,在該函數里出現了一個在cubemx方式里獨有的,回調函數,當中斷開啟,并且中斷標志位滿足后將會調用該函數,而我們的操作將會在這里實現。
void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg)
{
/* Check if Early Wakeup Interrupt is enable */
if(__HAL_WWDG_GET_IT_SOURCE(hwwdg, WWDG_IT_EWI) != RESET)
{
/* Wheck if WWDG Early Wakeup Interrupt occurred */
if(__HAL_WWDG_GET_FLAG(hwwdg, WWDG_FLAG_EWIF) != RESET)
{
/* Early Wakeup callback */
HAL_WWDG_WakeupCallback(hwwdg);
/* Change WWDG peripheral state */
hwwdg->State = HAL_WWDG_STATE_READY;
/* Clear the WWDG Early Wakeup flag */
__HAL_WWDG_CLEAR_FLAG(hwwdg, WWDG_FLAG_EWIF);
/* Process Unlocked */
__HAL_UNLOCK(hwwdg);
}
}
}
(4)下面我們來討論看門狗的喂狗時間,很容易計算在stm32f103系列里窗口看門狗的最大喂狗時間也就58ms,在一些程序里我們沒必要這么密集的去喂狗。那么如何增大喂狗時間呢。搜集了網上的一些方法后,本人根據具體事例實現了一個增大看門狗喂狗時間的方法:就是在中斷函數中再做一個額外計數器,如果計數器沒有達到設定值,就就行喂狗操作,同時使設定值加1,當計數器達到設定值時,就不加載喂狗定時器初值,這時看門狗定時器就會從從0x40減到0x3F產生系統復位。使用這個方法可以將定時時間拓展到 58ms*額外計數器設定值,定個幾十秒都不是問題。 當達到計數值后如果我們清零計數值,那么看門狗系統就會復位,所以我們只要在主函數里定期的將該計數值清零,也就是變相的增大了喂狗時間。下面具體看事例:
每次產生看門狗中斷都會調用回調函數,我在回調函數里做如下操作:
/*****************************看門狗回調函數********************************/
void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
{
if(time <=50)
{
HAL_WWDG_Refresh(hwwdg, WWDG_CNT); //喂狗函數
printf("喂狗\r\n"); //每喂一次狗,打印一次,無實際作用
time++;
}
}
/**************************main函數中部分函數********************************/
while (1)
{
if(time > 50)
{
time = 0;
printf("time清零 \r\n");
}
}
我設置看門狗最大喂狗時間為58ms,那么計數50次,大概是2.9s時間,也就是我在主函數中必須在2.9s內,只要對計數器清零,系統就不會復位了。相應的可以把計數值設置更大,這就根據個人需要了。這樣是不是變相的增大喂狗時間了。
下面是我的串口打印效果:
大家看一下是不是每喂一次狗就會打印一個“喂狗”,同時在11點55分20秒有一次time清零,到11點55分23秒有一次time清零,是不是間隔大概3秒了。
好了,本人也是剛開始使用stm32CubeMx開發,如果內容中有問題,希望指出來,共同進步
上一篇:STM32看門狗 IWDG WWDG
下一篇:如何使用Stm32CubeMX和LL庫實現窗口看門狗
推薦閱讀
史海拾趣
AXTAL公司誕生于2003年,是由物理學家兼電子工程師Bernd Neubig創立的。Bernd Neubig從之前的TELEQUARZ公司分離出來,帶著豐富的石英晶體行業經驗和對未來技術的獨到見解,創立了AXTAL。公司的員工團隊擁有超過80年的石英晶體行業累積經驗和專業知識,為公司的起步奠定了堅實的基礎。
Datatronic公司深知人才是企業發展的核心。因此,公司一直注重人才的培養和引進。公司建立了完善的人才培訓體系,為員工提供廣闊的發展空間和機會。同時,公司還積極引進國內外優秀人才,為公司的技術創新和市場拓展提供了有力支持。這些舉措使得Datatronic公司在人才方面形成了競爭優勢。
隨著全球化趨勢的加速,Datatronic公司開始將目光投向國際市場。公司通過參加國際展覽、設立海外辦事處等方式,積極拓展海外市場。同時,公司還加強了與國際企業的合作,引進先進的技術和管理經驗。這些努力使得Datatronic公司在國際市場上逐漸獲得了認可,品牌影響力得到了提升。
隨著產品線的不斷豐富,Bellnix開始積極拓展市場。公司通過與各大電子廠商建立合作關系,將產品應用于手機、電腦、家電等多個領域。同時,Bellnix還加強品牌建設,通過參加國際電子展會、舉辦技術研討會等方式,提升品牌知名度和影響力。這些舉措有效地推動了公司的市場拓展,為公司的持續發展奠定了堅實基礎。
隨著技術的不斷進步和市場的不斷擴大,Datapro International Inc公司開始尋求新的市場機會。他們發現,隨著企業信息化程度的提高,對數據存儲和處理的需求也越來越大。于是,公司決定進軍企業市場,并開發了一系列針對企業的數據存儲解決方案。
在拓展企業市場的過程中,Datapro International Inc公司面臨著來自競爭對手的激烈競爭。然而,他們憑借卓越的產品質量、專業的技術服務和靈活的商業模式,成功贏得了客戶的信任和支持。隨著企業市場的不斷拓展,Datapro International Inc公司的業務規模也逐漸擴大。
為了進一步提升公司的知名度和影響力,淩志比高開始注重品牌建設和市場推廣。公司積極參與行業展會、舉辦產品發布會等活動,與客戶和合作伙伴建立了緊密的聯系。同時,淩志比高還通過廣告宣傳、社交媒體營銷等方式,提升了品牌知名度和美譽度。
三相變壓器如何把Y/Y-12聯接組改成Y/Y-6聯接組以及把Y/ -11改為Y/ -5聯接組 問一下如何把Y/Y-12聯接組改成Y/Y-6聯接組以及把Y/ -11改為Y/ -5聯接組… 查看全部問答∨ |
|
在網上下了個游戲的代碼,在arm的sdk下編譯好好的,到了x86平臺(模擬器)的sdk編譯就出一大堆問題了。首先,就是說頭文件沒包含,把設置的目錄都加上去,錯誤就更多了。而在arm下就沒問題。… 查看全部問答∨ |
|
我創建了一個線程 while(g_flag) { result = GetMessage(&Message, 0, 0, 0); if(result == 1) { &nb ...… 查看全部問答∨ |
職位介紹 硬件設計工程師 本公司正在做PDA項目的開發,使用的是ARM系統。已經完成第一版產品的開發和小批量生產。 現欲招聘一名兼職硬件工程師,負責后續的生產以及后續產品的設計,調試和生產工作。 PDA的硬件組成如下:單片機+ARM協處理器+K ...… 查看全部問答∨ |
因學習PIC單片機需要,想弄個下載器,網上查了不少資料,有很多個版本的下載器,有個PICKIT2的覺得不錯,比較簡單,支持的芯片也比較多!因此想自己做一個! 目前手上有一片PIC18F2525,但是,做的這個下載器,要用的是PIC18F2550,不知道這兩者有 ...… 查看全部問答∨ |
|
本帖最后由 dontium 于 2015-1-23 13:23 編輯 1.USB臺燈 USB臺燈電路圖如下圖所示.為避免可能的電磁輻射,電路的電源采用電容限流,再送到整流電路,給出控制電路所需的5V直流工作電壓。在電腦關斷不用時.即使控制電路有交流電源存在,由于IC2的 ...… 查看全部問答∨ |