之前我们分享过使用STM32的模拟看门狗监测ADC阈值的方法,今天和大家分享一下STM32的独立看门狗试验;
我们先查看一下STM32手册上面的知识介绍:
独立监视器基于8位预分辨率和12位下计数器,带有用户定义的刷新窗口。它由独立的32kHz内部RC(LSI)钟动。
独立于主时钟,它可以在停止和待机模式下运行。它既可以用作看门狗,在出现问题时重置设备,也可以用作自由运行的定时器,用于应用程序超时管理。它可以通过选项字节进行硬件或软件配置。其计数器可以在调试模式下冻结。
一:使用的硬件:
STM32u083RC 开发板(已经板载了ST-link 调试器),使用keil进行编译
二:软件部分:
基于STM32 HAL 库 STM32cube MX 配置工具(主要是生成驱动底层库文件)
三:软件编写的过程经验分享:
3.1:打开STM32CubeMX,选择你的STM32型号。
3.2:在“Pinout & Configuration”选项卡中,找到“IWDG”并启用它。
3.3:配置看门狗的预分频器(Prescaler)和重装载值(Reload Value),以设置看门狗的超时时间。
例如,预分频器设置为32,重装载值设置为1000,超时时间大约为1秒。
3.4:配置定时器16:
TIM16 定时器配置为在 LSI 内部连接到 TIM16 CH1 时测量 LSI 频率,以调整 IWDG 时钟。
具体配置:
配置 TIM16 以在内部将 TIM16 CH1 输入捕获重新映射到 LSI 时钟输出。
启用 TIM16 Input Capture 中断:在 LSI 时钟的一个周期后,周期值存储在变量中,并与 HCLK 时钟进行比较以获得其实际值。
3.4:生成代码并打开工程。
四:STM32 cubeMX 软件配置如下所示:
4.1 看门狗软件代码:
hiwdg.Instance = IWDG; hiwdg.Init.Prescaler = IWDG_PRESCALER_32; hiwdg.Init.Window = IWDG_WINDOW; hiwdg.Init.Reload = IWDG_RELOAD; hiwdg.Init.EWI = 0; if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { Error_Handler(); }
4.2:定时器16配置
/* Connect internally the IWDG_CH1 Input Capture to the LSI clock output */ HAL_TIMEx_TISelection(&htim16, TIM_TIM16_TI1_LSI, TIM_CHANNEL_1 ); /* Connect internally the MCO to LSI */ HAL_RCC_MCOConfig(RCC_MCO, RCC_MCO1SOURCE_LSI, RCC_MCO1DIV_1); /* Configure the Input Capture of channel 1 */ TIMInput_Config.ICPolarity = TIM_ICPOLARITY_RISING; TIMInput_Config.ICSelection = TIM_ICSELECTION_DIRECTTI; TIMInput_Config.ICPrescaler = TIM_ICPSC_DIV8; TIMInput_Config.ICFilter = 0; if(HAL_TIM_IC_ConfigChannel(&htim16, &TIMInput_Config,TIM_CHANNEL_1) != HAL_OK) { /* Initialization Error */ Error_Handler(); }
为了方便验证看门狗试验,我们在按键中断函数中,执行一句错的代码,使程序进入硬件错误处理部分:
void EXTI4_15_IRQHandler(void) { /* Failure is generated by user, turn LED4 off */ BSP_LED_Off(LED4); *(__IO uint32_t *) 0x00040001 = 0xFF; }
当程序进入错误中断后,不再继续进行喂狗,等待一段时间后,程序执行复位操作。
程序执行如下所示:
IWDG 重新加载计数器在主程序无限循环中每 990 ms 刷新一次,以防止 IWDG 复位。
LED4 还每 990 毫秒切换一次,表示程序正在运行。
EXTI Line 连接到 GPIO 引脚,配置为在按下用户按钮 (PC.13) 时产生中断。
EXTI Line 用于模拟软件故障:一旦按下用户按钮 (PC.13) 发生 EXTI Line 事件,就会提供相应的中断。
在 ISR 中,写入无效地址会生成一个 Hardfault 异常,其中包含一个无限循环并阻止返回主程序(IWDG 重新加载计数器不会刷新)。因此,当 IWDG 计数器达到 0 时,将发生 IWDG 重置。
如果生成 IWDG 复位,则系统从复位恢复后,LED4 亮起 4 秒。
如果 EXTI Line 事件没有发生,则 IWDG 计数器将在主程序无限循环中无限刷新,并且不会发生 IWDG 复位。
如果发生任何错误,LED4 将关闭。