STMCU小助手
发布时间:2021-12-14 10:52
|
正点原子 STM32F7 HAL库教程实验九——输入捕获实验一章,用输入捕获测量高电平的长度,输入捕获中断回调函数 HAL_TIM_IC_CaptureCallback 和更新中断回调函数 HAL_TIM_PeriodElapsedCallback 的逻辑让人费解,而且原子有的注释不是很准确。现分析如下,以备遗忘。 1.输入捕获原理 用输入捕获测量一段高电平持续时间的原理如图,先设置上升沿触发中断,当捕获到上升沿时,让定时器重新计数,并设置下降沿触发中断。当下降沿到来时,记录下此时定时器的值CCRx2。在高电平期间,定时器可能有N次溢出,所以总共计数次数为N ∗ A R R + C C R x 2 N*ARR+CCRx2N∗ARR+CCRx2,再乘以一次计数的时间就得到高电平长度。
2.输入捕获中断回调函数 正点原子在输入捕获中断回调函数中用到了两个很重要的变量,如下,这里的注释和原子的不一样,我认为原子的注释写错了。
测量高电平长度一定是有两次输入捕获中断,第一次是上升沿触发,第二次是下降沿触发,所以在回调函数 HAL_TIM_IC_CaptureCallback 中要判断是上升沿触发还是下降沿触发。变量 TIM5CH1_CAPTURE_STA 位[6]的作用就是记录是否捕获到上升沿,若位[6]为1,说明当前进入中断是下降沿触发;若位[6]为0,说明当前进入中断是上升沿触发。 正点原子输入捕获中断回调函数的流程图如下
这里为什么要判断是否已经捕获了一段高电平呢?我的理解是,在main()函数要计算已经捕获的高电平的时间,必须要用到 TIM5CH1_CAPTURE_STA 的位[7]进行判断,如果高电平的频率很高,main()函数中还没执行到这一步,上升沿又触发了输入捕获中断,这时 TIM5CH1_CAPTURE_STA 被清零,那么main()函数中下面的代码就不会执行了。所以要判断是否已经捕获了一段高电平。
现在把原子的回调函数贴上
3.更新中断回调函数 理解了输入捕获中断回调函数后,理解更新中断回调函数就会容易许多。我们要明白,更新中断回调函数的目的是记录在上升沿和下降沿之间计时器溢出的次数。更新中断回调函数的流程图如下,若溢出次数达到 TIM5CH1_CAPTURE_STA 低六位能记录次数的上限,则不能继续记录高电平的长度,我们就强制结束,也就是令 TIM5CH1_CAPTURE_STA 的位[7]等于1,main()函数就会执行输出高电平的时间。
下面将原子的代码贴上
|
STM32F745 USART1 Bootloader启动失败排查与解决的流程分析
STM32芯片命名规则
STM32 引脚到底有多少?为什么一个引脚能当好几个用?
入门嵌入式,为什么STM32是“优选起步”?
嵌入式-单片机-STM32 EXTI中断
STM32单片机进行除零运算,为何程序不崩溃?
STM32 LL为什么比HAL高效?
STM32时钟详解
2025国庆中秋活动体验报告2——TouchGFX的UI设计
2025国庆中秋活动体验报告1——TouchGFX环境配置
微信公众号
手机版