STM32開發,使用HAL庫函數實現獨立看門狗功能

1 概述

1.1 資源概述

開發板:ST官方NUCLEO-F103RB開發板
CUBEMX版本:1.3.0
MDK版本:5.23
主控芯片型號:STM32F103RBT6
NUCLEO開發板

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燈熄滅。
獨立看門狗實驗結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章