[STM32C5] 【STM32C5 开发板评测】任务2-定时器中断实验:通过定时器实现 IO 翻转输出

[复制链接]
38|1
wld立冬的夏 发表于 2026-11-2 22:35 | 显示全部楼层 |阅读模式
这个任务是在IO口的基本控制的基础上进行的,我们直接在之前的工程上进行修改,主要加入的是定时器并开启中断。这里我们添加的是定时器8,并配置定时时间为1ms:
1.jpg
主要修改的参数是Prescaler和Counter period,当然和时钟也是有关系的,定时器的频率是144M。选择144*1000的参数正好配置为定时1ms。
我们还要开启定时器中断:
2.jpg
接下来就是对工程程序的修改了,主要涉及到定时器的启动:
  1. if (HAL_TIM_Start_IT(hTIM8) != HAL_OK)
  2.     {
  3.       return (-1);
  4.     }
定时器中断回调函数的LED翻转的编写:
  1. void HAL_TIM_UpdateCallback(hal_tim_handle_t *htim)
  2. {
  3.   uint32_t rate_x10 = s_blink_rate_x10;

  4.   (void)htim;

  5.   /* 兜底:档位异常时回落到 1Hz,避免分频数退化为 0 导致 LED 以 1kHz 抖动 */
  6.   if (rate_x10 == 0U)
  7.   {
  8.     rate_x10 = BLINK_RATE_1HZ_X10;
  9.   }

  10.   /* 检测到按键切换了频率:更新分频节拍数并重新开始计数 */
  11.   if (rate_x10 != s_led_applied_rate_x10)
  12.   {
  13.     s_led_applied_rate_x10 = rate_x10;
  14.     s_led_div_ticks        = (uint16_t)(BLINK_HALF_PERIOD_TICKS_DIV / rate_x10);
  15.     s_led_tick_count       = 0U;
  16.   }

  17.   /* 累计到分频节拍数后翻转 LED */
  18.   if (++s_led_tick_count >= s_led_div_ticks)
  19.   {
  20.     s_led_tick_count = 0U;
  21.     HAL_GPIO_TogglePin(PA5_PORT, PA5_PIN);
  22.   }
  23. }
这了我们设计了和之前任务不一样的节拍,分别为1Hz,2Hz,4Hz,效果如下:





Undshing 发表于 2026-11-3 13:09 | 显示全部楼层
定时器中断设置不错,注意Prescaler和Counter period配合好,否则可能不精确。检查中断优先级,防止阻塞。频率切换逻辑要确保不会引起异常中断。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

164

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部