一、IWDG簡介
看門狗其實(shí)就是一個(gè)定時(shí)器蕊爵,從功能上說它可以讓微控制器在程序發(fā)生意外(程序進(jìn)入死循環(huán)或跑飛)的時(shí)候浊闪,能重新回復(fù)到系統(tǒng)剛上電狀態(tài),以保障系統(tǒng)出問題的時(shí)候可以重啟一次概荷。說的復(fù)雜一點(diǎn)秕岛,看門狗就是能讓程序出問題是能重新啟動(dòng)系統(tǒng)。
STM32 有兩個(gè)看門狗误证,一個(gè)是獨(dú)立看門狗另外一個(gè)是窗口看門狗继薛,獨(dú)立看門狗號稱寵物狗,窗口看門狗號稱警犬雷厂。獨(dú)立看門狗用通俗一點(diǎn)的話來解釋就是一個(gè) 12 位的遞減計(jì)數(shù)器惋增,當(dāng)計(jì)數(shù)器的值從某個(gè)值一直減到 0 的時(shí)候,系統(tǒng)就會(huì)產(chǎn)生一個(gè)復(fù)位信號改鲫,即 IWDG_RESET诈皿。如果在計(jì)數(shù)沒減到 0 之前林束,刷新了計(jì)數(shù)器的值的話,那么就不會(huì)產(chǎn)生復(fù)位信號稽亏,這個(gè)動(dòng)作就是我們經(jīng)常說的喂狗壶冒。看門狗功能由 VDD 電壓域供電截歉,在停止模式和待機(jī)模式下仍能工作胖腾。
二、新建工程
1. 打開 STM32CubeMX 軟件瘪松,點(diǎn)擊“新建工程”
2. 選擇 MCU 和封裝
3. 配置時(shí)鐘
RCC 設(shè)置咸作,選擇 HSE(外部高速時(shí)鐘) 為 Crystal/Ceramic Resonator(晶振/陶瓷諧振器)
選擇 Clock Configuration,配置系統(tǒng)時(shí)鐘 SYSCLK 為 72MHz
修改 HCLK 的值為 72 后宵睦,輸入回車记罚,軟件會(huì)自動(dòng)修改所有配置
4. 配置調(diào)試模式
非常重要的一步,否則會(huì)造成第一次燒錄程序后續(xù)無法識別調(diào)試器
SYS 設(shè)置壳嚎,選擇 Debug 為 Serial Wire
三桐智、IWDG
3.1 參數(shù)配置
在 System Core
中選擇 IWDG
設(shè)置,并勾選 Activated
激活
IWDG counter clock prescaler
預(yù)分頻器值設(shè)為 64
IWDG down-counter reload value
重裝載寄存器值設(shè)為 625
超時(shí)時(shí)間 Tout = (4*2^prv) / LSI * rlv (s) prv是預(yù)分頻器寄存器的值烟馅,rlv是重裝載寄存器的值
由圖知 LSI 為 40 KHz说庭,當(dāng) prv 取 IWDG_ PRESCALER_64 ,rlv 取 625 時(shí)郑趁,Tout=64/40*625=1s刊驴。
即設(shè)置 1s 的超時(shí)溢出。
3.2 生成代碼
輸入項(xiàng)目名和項(xiàng)目路徑
選擇應(yīng)用的 IDE 開發(fā)環(huán)境 MDK-ARM V5
每個(gè)外設(shè)生成獨(dú)立的
’.c/.h’
文件不勾:所有初始化代碼都生成在 main.c
勾選:初始化代碼生成在對應(yīng)的外設(shè)文件穿撮。 如 GPIO 初始化代碼生成在 gpio.c 中缺脉。
點(diǎn)擊 GENERATE CODE 生成代碼
3.3 添加喂狗函數(shù)
因?yàn)樵O(shè)置超時(shí)溢出為 1 秒,所以這里每隔 800 毫秒喂狗一次 HAL_IWDG_Refresh(&hiwdg);
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_USART1_UART_Init();
MX_IWDG_Init();
/* USER CODE BEGIN 2 */
printf("\n\r***** IWDG Test Start *****\n\r");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
printf("\n\r Refreshes the IWDG !!!\n\r");
HAL_IWDG_Refresh(&hiwdg);
HAL_Delay(800);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
3.4 查看打印
串口打印功能查看 STM32CubeMX學(xué)習(xí)筆記(6)——USART串口使用
當(dāng)去掉
HAL_IWDG_Refresh(&hiwdg);
悦穿,也就是不喂狗時(shí)攻礼,系統(tǒng)約 1 秒重啟一次。3.5 HAL庫與標(biāo)準(zhǔn)庫代碼比較
STM32CubeMX 使用 HAL 庫生成的代碼:
/**
* @brief IWDG Initialization Function
* @param None
* @retval None
*/
static void MX_IWDG_Init(void)
{
/* USER CODE BEGIN IWDG_Init 0 */
/* USER CODE END IWDG_Init 0 */
/* USER CODE BEGIN IWDG_Init 1 */
/* USER CODE END IWDG_Init 1 */
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
hiwdg.Init.Reload = 625;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN IWDG_Init 2 */
/* USER CODE END IWDG_Init 2 */
}
HAL_IWDG_Refresh(&hiwdg);
使用 STM32 標(biāo)準(zhǔn)庫的代碼:
IWDG_Config(IWDG_PRESCALER_64 ,625);
void IWDG_Config(uint8_t prv ,uint16_t rlv)
{
// 使能 預(yù)分頻寄存器PR和重裝載寄存器RLR可寫
IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );
// 設(shè)置預(yù)分頻器值
IWDG_SetPrescaler( prv );
// 設(shè)置重裝載寄存器值
IWDG_SetReload( rlv );
// 把重裝載寄存器的值放到計(jì)數(shù)器中
IWDG_ReloadCounter();
// 使能 IWDG
IWDG_Enable();
}
// 喂狗
void IWDG_Feed(void)
{
// 把重裝載寄存器的值放到計(jì)數(shù)器中栗柒,喂狗礁扮,防止IWDG復(fù)位
// 當(dāng)計(jì)數(shù)器的值減到0的時(shí)候會(huì)產(chǎn)生系統(tǒng)復(fù)位
IWDG_ReloadCounter();
}
HAL_IWDG_Init();
對應(yīng) IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);IWDG_SetPrescaler(prv);IWDG_SetReload(rlv);IWDG_Enable();
HAL_IWDG_Refresh(&hiwdg);
對應(yīng) IWDG_ReloadCounter();
六、注意事項(xiàng)
用戶代碼要加在 USER CODE BEGIN N
和 USER CODE END N
之間瞬沦,否則下次使用 STM32CubeMX 重新生成代碼后太伊,會(huì)被刪除。
? 由 Leung 寫于 2021 年 1 月 28 日
? 參考:STM32CubeMX系列教程15:看門狗(WDG)
【STM32】HAL庫 STM32CubeMX教程五----看門狗(獨(dú)立看門狗,窗口看門狗)