当前位置: 首页 > news >正文

TIM_ITConfig() 和 TIM_Cmd()

在STM32的定时器中断配置中,TIM_ITConfig() 和 TIM_Cmd() 是两个关键函数,它们分别控制中断使能定时器计数器的启停,作用层级不同。以下是详细解释:

1. TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE)

作用
  • 启用定时器的特定中断源(这里是更新中断 TIM_IT_Update)。

  • 该函数操作的是定时器的 中断使能寄存器 TIMx_DIER(DMA/Interrupt Enable Register)。

底层操作
TIMx->DIER |= TIM_IT_Update;  // 置位DIER的UIE位(Update Interrupt Enable)
  • TIM_IT_Update 对应 TIMx_DIER.UIE 位(Update Interrupt Enable)。

  • 当 UIE=1 时,若 TIMx_SR.UIF=1(更新标志位),则定时器会向 NVIC(嵌套向量中断控制器)发送中断请求。

中断流程中的位置
  • 配置阶段:在初始化时调用,告诉定时器“允许更新事件触发中断”。

  • 硬件行为
    当 CNT == ARR 时,硬件置 UIF=1 → 若 UIE=1,则触发中断;若 UIE=0,即使 UIF=1 也不会中断。

 2. TIM_Cmd(TIM2, ENABLE)

作用
  • 启动或停止定时器的计数器CNT 寄存器的计数)。

  • 该函数操作的是定时器的 控制寄存器 TIMx_CR1(Control Register 1)

底层操作

TIMx->CR1 |= TIM_CR1_CEN;  // 置位CR1的CEN位(Counter Enable)
  • CEN=1:启动计数器,CNT 开始根据时钟频率递增/递减。

  • CEN=0:停止计数器,CNT 冻结在当前值。

中断流程中的位置
  • 定时器的工作开关

    • 即使中断已使能(UIE=1),若 CEN=0(定时器未启动),CNT 不会变化,永远不会触发 UIF=1,因此也不会中断。

    • 只有 CEN=1 时,定时器才开始计数,并在 CNT == ARR 时触发中断

3. 两者在中断流程中的分工

完整中断触发条件

定时器中断的触发需要同时满足以下条件

  1. 定时器运行TIMx_CR1.CEN = 1(由 TIM_Cmd(ENABLE) 设置)。

  2. 中断使能TIMx_DIER.UIE = 1(由 TIM_ITConfig(ENABLE) 设置)。

  3. 事件发生:硬件检测到 CNT == ARR,置 TIMx_SR.UIF = 1

 

Q1:为什么需要分开两个函数?
  • 解耦控制

  • TIM_ITConfig() 管是否允许中断(逻辑控制)。

  • TIM_Cmd() 管是否启动定时器(物理控制)。
    例如:你可能需要定时器运行(CEN=1)但不触发中断(UIE=0),用于PWM生成。

 

Q2:调用顺序有要求吗?
  • 推荐顺序

    1. 先配置中断(TIM_ITConfig)。

    2. 再启动定时器(TIM_Cmd)。

    • 原因:避免定时器启动后立即触发中断,但中断尚未配置完成。

Q3:如果只调用其中一个函数会怎样?
情况结果
仅 TIM_ITConfig(ENABLE)定时器不计数(CEN=0),无中断触发。
仅 TIM_Cmd(ENABLE)定时器计数,UIF 会置位,但中断未使能(UIE=0),不会进入中断服务程序。

 

http://www.xdnf.cn/news/30583.html

相关文章:

  • 当HTTP遇到SQL注入:Java开发者的攻防实战手册
  • 实用电脑工具,轻松实现定时操作
  • 《目标检测双雄:YOLO与Faster R-CNN,谁主沉浮?》
  • dotnet core webapi 实现 异常处理中间件
  • [密码学基础]GMT 0002-2012 SM4分组密码算法 技术规范深度解析
  • LNA设计
  • spring Ai---向量知识库(一)
  • 43.[前端开发-JavaScript高级]Day08-ES6-模板字符串-展开运算符-ES7~ES11
  • PyTorch深度学习框架60天进阶学习计划 - 第46天:自动化模型设计(一)
  • 在RK3588上使用哪个流媒体服务器合适
  • 在swiftui项目中使用WKWebView加载自定义脚本文件
  • 【HDFS入门】HDFS性能调优实战:关键参数对吞吐量的影响深度解析
  • c++ 类的语法1
  • UI文件上传
  • 深入解析进程与线程:区别、联系及Java实现
  • 设计模式-桥接模式
  • 14.解码器的Mask
  • End-to-End从混沌到秩序:基于LLM的Pipeline将非结构化数据转化为知识图谱
  • 从GET到POST:HTTP请求的攻防实战与CTF挑战解析
  • EF Core中动态加载关联的导航属性
  • 直线轴承的正确安装方式是什么?
  • LeetCode 热题 100_乘积最大子数组(88_152_中等_C++)(动态规划)
  • 虚拟现实(VR)技术在教育领域的创新应用
  • QML中的3D功能--入门开发
  • Chat2DB创始人姬朋飞:AI在 text2sql应用领域的实践
  • Java从入门到“放弃”(精通)之旅——数组的定义与使用⑥
  • 进程程序替换
  • 【橘子大模型】初探rag知识库的构建
  • Linux基础IO(八)之硬链接
  • 完整游戏排行榜系统实现