STM32定时器不按设定超时产生中断

1. 引言

某客户设计需要启动定时器在 3ms 后产生中断,其后定时器不再运行,直至下一次软件要求再次启动定时器产生中断,实测代码后发现定时器启动后立即产生了超时中断。

2. 调研

客户通过 STM32CubeMX 配置 TIM7 并生成工程,在主循环中添加定时器启动代码;
在定时器中断处理函数处理 update event 回调时停止定时器,并翻转一个 I/O 脚指示定时器启停,代码如下:
图1.启动定时器
在这里插入图片描述
图2.定时器中断回调
在这里插入图片描述
客户期待的结果是启动定时器时 I/O 拉高并保持 3ms,当 3ms 到达后产生中断拉低I/O,但实测时发现,定时器启动后立即产生了超时中断(高电平持续时间约 2us):

3. 分析

应用代码在初始化定时器时会调用 HAL_TIM_Base_Init( )接口,此接口会调用TIM_Base_SetConfig( ) 配置定时器,并产生更新事件(TIMx->EGR = TIM_EGR_UG)加载寄存器,此事件标志 UIF 会被置位,在调用 HAL_TIM_Base_Start_IT( ) 启动定时器,在此使能定时器中断时,由于 UIF 已经置位,所以会立即触发并进入中断处理函数,中断回调函数会停止定时器计数,并禁止定时器中断;但当从中断处理函数返回继续执行HAL_TIM_Base_Start_IT( )时,此接口会使能定时器开始计数,进而在下一次调用HAL_TIM_Base_Start_IT( )时又会立即产生中断,循环往复,详细时序和具体代码如下:
图4.问题产生时序描述
在这里插入图片描述
图5.定时器启动代码
在这里插入图片描述

4. 处理

修改代码,在启动定时器前强制停止定时器计数、清除中断位、清除 NVIC 挂起的中断后,再启动定时器,详见下图红框内代码;
图6.问题修正代码
在这里插入图片描述
图7.修正 BUG 后的运行结果
在这里插入图片描述

5. 小结

在碰到这类定时器异常问题时,可以利用 I/O 口指示运行状态,结合代码分析找到原因并加以解决。

文档中所用到的工具及版本

IAR 8.50.6
LAT 中的附件
LAT1299 定时器不按设定超时产生中断_v0.2.7z


本文档参考ST官方的《【应用笔记】LAT1299+定时器不按设定超时产生中断(PDF)》文档。
参考下载地址:https://download.csdn.net/download/u014319604/89003463

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-21 13:26:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-21 13:26:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-21 13:26:04       82 阅读
  4. Python语言-面向对象

    2024-03-21 13:26:04       91 阅读

热门阅读

  1. 【逆向】fridaAPI_如何hook一个静态方法和实例方法

    2024-03-21 13:26:04       47 阅读
  2. 后端异常处理:全局异常处理器

    2024-03-21 13:26:04       48 阅读
  3. 亚信安慧AntDB全景观察:数据库领域的创新者

    2024-03-21 13:26:04       41 阅读
  4. FPGA_AD9361

    2024-03-21 13:26:04       43 阅读
  5. 力扣126双周赛

    2024-03-21 13:26:04       45 阅读
  6. electron-builder打包

    2024-03-21 13:26:04       46 阅读
  7. 物理设计概念 -- 物理层次结构

    2024-03-21 13:26:04       34 阅读
  8. [Open3d]: 知识记录

    2024-03-21 13:26:04       40 阅读
  9. mybatis---->tx中weekend类

    2024-03-21 13:26:04       43 阅读
  10. Mac传文件到云服务器

    2024-03-21 13:26:04       45 阅读