STM32開發,使用HAL庫函數實現獨立看門狗功能
1 概述
1.1 資源概述
開發板:ST官方NUCLEO-F103RB開發板
CUBEMX版本:1.3.0
MDK版本:5.23
主控芯片型號:STM32F103RBT6
1.2 引腳資源分配
序號 | 引腳 | 資源 | 備註 |
---|---|---|---|
1 | PA13 | SWDIO | SWD輸入輸出信號 |
2 | PA14 | SWDCLK | SWD時鐘信號 |
3 | PC13 | BUTTON | 用戶按鍵 |
4 | PA5 | LED2 | 指示燈 |
1.3 獨立看門狗概述
獨立看門狗可用來檢測和解決由軟件錯誤引起的故障;當計數器達到給定的超時值時,產生系統復位。獨立看門狗(IWDG)由專用的低速時鐘(LSI)驅動,即使主時鐘發生故障它也仍然有效。IWDG最適合應用於那些需要看門狗作爲一個在主程序之外,能夠完全獨立工作,並且對時間精度要求較低的場合。
IWDG的主要性能
● 自由運行的遞減計數器 ;
● 時鐘由獨立的RC振盪器提供(可在停止和待機模式下工作);
● 看門狗被激活後,則在計數器計數至0x000時產生復位。
1.4 實現功能
1、上電初始化後,LED2燈亮;
2、在While(1)中進行按鍵檢測,若檢測到按鍵,餵狗,將燈熄滅;
3、若未檢測到按鍵,系統自動復位;
4、採用內部LSI時鐘,16分頻,預裝載值4096(0xFFF)。
2 軟件開發
2.1 CUBEMX配置
時鐘配置
激活IDWG,分頻係數改爲16,預裝載值設爲4096。
獨立看門狗由LSI提供時鐘
這裏可以計算得到看門狗復位時間如下,這個時間足夠我們操作按鍵餵狗。
t=1/(400000Hz/16)×4096=1.638S
2.2 代碼編寫
1、使用CUBEMX生成代碼後,會自動生成前面配置的獨立看門狗的初始化函數(分頻係數和預裝載值)。
MX_IWDG_Init();//看門狗初始化程序
下面是這個函數的定義。
void MX_IWDG_Init(void)
{
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_16;
hiwdg.Init.Reload = 4095;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
Error_Handler();
}
}
我們需要在main函數中初始化LED2燈,點亮。
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET);//初始化時將LED2燈點亮
2、在while(1)中增加按鍵檢測和餵狗操作。當檢測到按鍵時,執行餵狗以及將LED2燈熄滅。
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(HAL_GPIO_ReadPin(BUTTON_GPIO_Port,BUTTON_Pin)==RESET)//假設檢測到按鍵操作
{
HAL_Delay(20);//按鍵抖動檢測
if(HAL_GPIO_ReadPin(BUTTON_GPIO_Port,BUTTON_Pin)==RESET)//假設檢測到按鍵操作
{
HAL_IWDG_Refresh(&hiwdg);//執行餵狗操作
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET);//LED熄滅
}
}
}
這裏的HAL_IWDG_Refresh函數的功能是在鍵寄存器IWDG_KR中寫入0xAAAA,也就是餵狗操作。
這裏的按鍵檢測,是不嚴謹的,因爲按鍵會抖動,所以這裏可能存在餵狗多次,下面是按鍵檢測的函數,加入了while();循環,只有在按鍵彈起時才返回數據。
在初始化按鍵的IO口,切記要注意上下拉操作,如果是低電平有效就上拉,如果是高電平有效就下拉,不配置或者配置相反,都有可能導致按鍵不可用,或者不符合邏輯。
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
/*檢測是否有按鍵按下 */
if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON )
{
/*等待按鍵釋放 */
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON )
{
while(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON);
return KEY_ON;
}
}
return KEY_OFF;
}
3 實驗結果
實驗結果:未檢測到按鍵時,LED2燈常亮,當在規定的時間內按鍵操作,LED2燈熄滅。