[应用相关] 定时器回调函数只能执行一次

[复制链接]
 楼主| probedog 发表于 2024-5-29 15:15 | 显示全部楼层 |阅读模式

定时器做PWM输出时,初始化定时器时执行HAL_TIM_PWM_Init(&TIM1_Handler);时进入回调函数里初始化GPIO引脚;如果需要再重新初始化一次定时器时,在执行上面这行初始化时,程序并不再进入回调函数里执行,请问有没有大神知道是什么原因?谢谢!
lzmm 发表于 2024-6-4 10:40 | 显示全部楼层
通常与所使用的定时器实现有关。              
laocuo1142 发表于 2024-6-4 16:37 | 显示全部楼层
检查HAL库文档
powerantone 发表于 2024-6-4 16:38 | 显示全部楼层
重置定时器状态
stormwind123 发表于 2024-6-4 20:00 | 显示全部楼层
检查代码逻辑
benjaminka 发表于 2024-6-5 12:41 | 显示全部楼层
void TIM1_UP_TIM10_IRQHandler(void) {
    HAL_TIM_IRQHandler(&htim1);
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    if (htim == &htim1) {
        // 在这里处理定时器回调事件
    }
}
nomomy 发表于 2024-6-5 15:47 | 显示全部楼层
在中断处理函数中(中断服务例程ISR),除了执行你需要的代码逻辑外,还必须清除中断标志,通常是通过写1到相应的中断标志位(例如TIMx->SR = ~TIM_SR_UIF; 或使用 __HAL_TIM_CLEAR_IT(&htimx, TIM_IT_UPDATE);
pl202 发表于 2024-6-5 22:22 | 显示全部楼层
检查你的代码以确保没有其他软件错误(如数组越界、指针错误等)导致定时器中断系统崩溃。
chenjun89 发表于 2024-6-5 22:27 来自手机 | 显示全部楼层
不会啊,只要你再次调用了初始化函数,又会运行回调函数吧。
claretttt 发表于 2024-6-7 14:29 | 显示全部楼层
定时器只能触发一次,除非显式地重新设置或重置定时器。
sanfuzi 发表于 2024-6-8 21:30 | 显示全部楼层
中断处理函数正确实现,并且在处理完中断事件后,正确地清除中断标志。
maudlu 发表于 2024-6-9 10:29 | 显示全部楼层
检查是否有可能其他的代码在运行期间无意中禁用了定时器中断
sdlls 发表于 2024-6-9 13:55 | 显示全部楼层
可以让定时器在每次触发后自动重载。
xuanhuanzi 发表于 2024-6-9 18:11 | 显示全部楼层
没有清理标志位?
xuanhuanzi 发表于 2024-6-9 18:11 | 显示全部楼层
看一下HAL库自带的,是怎么处理的,应该的没有重启或者清理标志位吧
janewood 发表于 2024-6-10 17:51 | 显示全部楼层
可能存在软件逻辑错误,导致定时器在第一次触发后被错误地重置或配置。
uptown 发表于 2024-6-11 15:18 | 显示全部楼层
如果回调函数中发生了异常或错误,且没有被正确处理,可能会导致它无法再次执行。
earlmax 发表于 2024-6-11 19:05 | 显示全部楼层
定时器外设被正确初始化,包括中断优先级、中断服务函数等。
zerorobert 发表于 2024-6-11 22:24 | 显示全部楼层
可能在回调函数执行完毕后没有重新设置定时器
jimmhu 发表于 2024-6-12 15:57 | 显示全部楼层
可能是由于定时器配置或中断处理不正确导致的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

486

主题

3268

帖子

4

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