这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » NUCLEO-U083RC学习历程33-STM32U083看门狗知识分享

共2条 1/1 1 跳转至

NUCLEO-U083RC学习历程33-STM32U083看门狗知识分享

助工
2025-02-18 13:32:33     打赏

之前我们分享过使用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  软件配置如下所示:

0218-3.png

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 将关闭。




关键词: NUCLEO-U083RC     看门狗知识    

专家
2025-02-18 20:37:21     打赏
2楼

学习一下


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]