STM32F4 HAL库开发 -- 独立看门狗(IWDG)
之前講過看門狗,參看:STM32開發 – 看門狗詳解
一、HAL庫配置獨立看門狗步驟
1、取消寄存器寫保護,設置看門狗預分頻系數和重裝載值。
首先我們必須取消 IWDG_PR和 IWDG_RLR寄存器的寫保護,這樣才可以設置寄存器IWDG_PR和 IWDG_RLR的值。取消寫保護和設置預分頻系數以及重裝載值載HAL庫中是通過函數HAL_IWDG_Init實現的。
該函數聲明為:
該函數只有一個入口參數hiwdg,該參數是HAL_StatusTypeDef 結構體指針類型。
接下來我們看看結構體HAL_StatusTypeDef 定義:
成員變量Instance用來設置看門狗寄存器基地址,實際上在HAL庫中已經通過標識符定義了,這里對于獨立看門狗直接設置為標識符IWDG即可。
成員變量Init是一個IWDG_InitTypeDef結構體類型,該結構體只有2個成員變量,分別用來設置獨立看門狗的預分頻系數和重裝載值,定義如下:
HAL_IWDG_Init 函數使用的一般方法為:
IWDG_HandleTypeDef hiwdg; //獨立看門狗句柄void MX_IWDG_Init(void) {hiwdg.Instance = IWDG; //獨立看門狗hiwdg.Init.Prescaler = IWDG_PRESCALER_64; //設置IWDG分頻系數hiwdg.Init.Reload = 4095; //重裝載值if (HAL_IWDG_Init(&hiwdg) != HAL_OK){Error_Handler();} }上面程序的作用是初始化IWDG,設置分頻系數64,重裝載值為4095。設置玩預分頻系數和重裝載值后,我們就可以知道看門狗的喂狗時間(也就是看門狗溢出時間),該時間的計算方式為:
Tout=((4×2^prer) ×rlr) /32其中:
#define IWDG_PRESCALER_64 IWDG_PR_PR_2 /*!< IWDG prescaler set to 64 */ #define IWDG_PR_PR_2 (0x4UL << IWDG_PR_PR_Pos) /*!< 0x00000004 */Tout 為看門狗溢出時間(單位為 ms); prer 為看門狗時鐘預分頻值( IWDG_PR 值),范圍為 0~7; rlr 為看門狗的重裝載值( IWDG_RLR 的值);
比如我們設定prer值為4(4 代表的是 64 分頻, HAL 庫中可以使用宏定義標識符IWDG_PRESCALER_64),rlr值為4095,那么就可以得到Tout=64×4095/32=8190ms。這樣,看門狗的溢出時間就是8190ms。只要你在一秒鐘之內,有一次寫入 0XAAAA 到 IWDG_KR,就不會導致看門狗復位(當然寫入多次也是可以的)。這里需要提醒大家的是,看門狗的時鐘不是準確
的 32Khz,所以在喂狗的時候,最好不要太晚了,否則,有可能發生看門狗復位。
下圖為STM32F407的獨立看門狗時鐘 32KHz。
下圖為STM32F105的獨立看門狗時鐘 40KHz。
2、重載計數值喂狗(向IWDG_KR 寫入 0XAAAA)
在HAL中重載計數值得函數是HAL_IWDG_Refresh,該函數聲明為:
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg);該函數有一個入口參數為前面講解的HAL_StatusTypeDef 結構體類型指針,它的作用是把值0xAAAA寫入到IWDG_KR 寄存器,從而觸發計數器重載,即實現獨立看門狗的喂狗操作。
//喂獨立看門狗 void IWDG_Feed(void) { HAL_IWDG_Refresh(&hiwdg); } #define __HAL_IWDG_RELOAD_COUNTER(__HANDLE__) WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_RELOAD) #define IWDG_KEY_RELOAD 0x0000AAAAu /*!< IWDG Reload Counter Enable */HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg) {/* Reload IWDG counter with value defined in the reload register */__HAL_IWDG_RELOAD_COUNTER(hiwdg);/* Return function status */return HAL_OK; }3、啟動看門狗(向IWDG_KR寫入0xCCCC)
HAL 庫函數里面啟動獨立看門狗的函數是 HAL_IWDG_Start:
HAL_StatusTypeDef HAL_IWDG_Start(IWDG_HandleTypeDef *hiwdg);通過上面3個步驟,我們就可以啟動STM32F4的獨立看門狗了,使能了看門狗,在程序里面就必須間隔一定時間喂狗,否則將導致程序復位。
二、STM32CubeMX配置IWDG
在 Pinout 界面的 Peripherals 一欄選擇 IWDG,然后勾選上 Activated 選項即可使能 IWDG。依次配置 IWDG 的預分頻系數和自動裝載值。
總結
以上是生活随笔為你收集整理的STM32F4 HAL库开发 -- 独立看门狗(IWDG)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年中国电商SaaS行业研究报告
- 下一篇: 学微信,抖音也上线PC版