|
这个任务是在IO口的基本控制的基础上进行的,我们直接在之前的工程上进行修改,主要加入的是定时器并开启中断。这里我们添加的是定时器8,并配置定时时间为1ms: 主要修改的参数是Prescaler和Counter period,当然和时钟也是有关系的,定时器的频率是144M。选择144*1000的参数正好配置为定时1ms。 我们还要开启定时器中断: 接下来就是对工程程序的修改了,主要涉及到定时器的启动: - if (HAL_TIM_Start_IT(hTIM8) != HAL_OK)
- {
- return (-1);
- }
定时器中断回调函数的LED翻转的编写: - void HAL_TIM_UpdateCallback(hal_tim_handle_t *htim)
- {
- uint32_t rate_x10 = s_blink_rate_x10;
- (void)htim;
- /* 兜底:档位异常时回落到 1Hz,避免分频数退化为 0 导致 LED 以 1kHz 抖动 */
- if (rate_x10 == 0U)
- {
- rate_x10 = BLINK_RATE_1HZ_X10;
- }
- /* 检测到按键切换了频率:更新分频节拍数并重新开始计数 */
- if (rate_x10 != s_led_applied_rate_x10)
- {
- s_led_applied_rate_x10 = rate_x10;
- s_led_div_ticks = (uint16_t)(BLINK_HALF_PERIOD_TICKS_DIV / rate_x10);
- s_led_tick_count = 0U;
- }
- /* 累计到分频节拍数后翻转 LED */
- if (++s_led_tick_count >= s_led_div_ticks)
- {
- s_led_tick_count = 0U;
- HAL_GPIO_TogglePin(PA5_PORT, PA5_PIN);
- }
- }
这了我们设计了和之前任务不一样的节拍,分别为1Hz,2Hz,4Hz,效果如下:
|