日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32F4 HAL库开发 -- 独立看门狗(IWDG)

發布時間:2025/3/15 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32F4 HAL库开发 -- 独立看门狗(IWDG) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前講過看門狗,參看:STM32開發 – 看門狗詳解

一、HAL庫配置獨立看門狗步驟

1、取消寄存器寫保護,設置看門狗預分頻系數和重裝載值。

首先我們必須取消 IWDG_PR和 IWDG_RLR寄存器的寫保護,這樣才可以設置寄存器IWDG_PR和 IWDG_RLR的值。取消寫保護和設置預分頻系數以及重裝載值載HAL庫中是通過函數HAL_IWDG_Init實現的。
該函數聲明為:

HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);

該函數只有一個入口參數hiwdg,該參數是HAL_StatusTypeDef 結構體指針類型。
接下來我們看看結構體HAL_StatusTypeDef 定義:

typedef struct {IWDG_TypeDef *Instance; /*!< Register base address */IWDG_InitTypeDef Init; /*!< IWDG required parameters */ } IWDG_HandleTypeDef;

成員變量Instance用來設置看門狗寄存器基地址,實際上在HAL庫中已經通過標識符定義了,這里對于獨立看門狗直接設置為標識符IWDG即可。
成員變量Init是一個IWDG_InitTypeDef結構體類型,該結構體只有2個成員變量,分別用來設置獨立看門狗的預分頻系數和重裝載值,定義如下:

typedef struct {uint32_t Prescaler; /*!< Select the prescaler of the IWDG.This parameter can be a value of @ref IWDG_Prescaler */uint32_t Reload; /*!< Specifies the IWDG down-counter reload value.This parameter must be a number between Min_Data = 0 and Max_Data = 0x0FFF */} IWDG_InitTypeDef;

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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。