19_STM32定时器Capture捕获

本文详细介绍了STM32定时器的Capture功能,包括Capture通道的工作原理、中断标志位与中断/DMA的设置,以及在TI1通道信号上升沿捕获计数器值的实例。通过设置输入滤波器、触发边沿、预分频器等参数,实现信号变化满足条件时的计数值捕获,并讨论了中断和DMA请求的启用。
摘要由CSDN通过智能技术生成

STM32定时器Capture捕获

1.Capture捕获通道

理解定时器的功能,看懂图很关键
在这里插入图片描述

上图里小框图,细分为下面两图
在这里插入图片描述
上图与下图通过IC1PS信号连接。标叉号的数据箭头没有触发条件,也就是不会发生,我这样想。
在这里插入图片描述

捕获/比较通道 围绕capture/compare register (包含一个preload预加载寄存器和shadow影子寄存器) 搭建

就捕获通道而言,preload和shadow中的值始终一致,当Capture产生时,Counter中计数值传输到shadow和preload寄存器。(preload寄存器为TIMx_CCRx, 读取该寄存器获得Counter传输来的计数值)

注:捕获是指信号变化满足设定的分频、滤波、极性等条件时,触发对当前计数器值的捕获。Capture捕获与Campare比较没有直接逻辑联系,经常记错成“比较之后,捕获信号。。”

2.中断标志位、中断、DMA

Capture产生时,TIMx_SR CCXIF flag 被设置。如Capture产生时,TIMx_SR CCXIF flag 已经被设置,TIMx_SR over-capture flag CCxOF 被设置。CCXIF flag清除,软件清除该flag或读取TIMx_CCRx。CCxOF flag只能软件清除

如使能中断TIMx_DIER CC1IE bit,则产生中断。如使能DMA请求TIMx_DIER CC1DE bit,则产生DMA请求。

3.举例:在TI1通道信号上升沿,捕获计数器值

1.选择方向(capture/compare作为输出还是输入)和通道(TI1 or TI2)。TIMx_CCMR1 CC1S bit 设置为01, 即CC1 channel配置为输入, IC1 映射到 TI1 。CC1S 一旦不为00(CC1(capture/compare)通道不配置为output ),TIMx_CCR1 就变为只读
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
2.设置输入滤波器。假设输入信号翻转时,需要5个内部时钟周期后才变稳定。设置TIMx_CCMRx ICxF 为 0011,即设置fSAMPLING=fCK_INT, N=8。连续8次采样值一致时,认为信号稳定。数字滤波器由一个事件计数器组成,用N个连续事件来验证输出上转换。
在这里插入图片描述
3.选择触发边沿位。设置TIMx_CCER CC1P 和 CC1NP bit为0,即选择上升沿(non-inverted 不反相 TI1FP1与TI1F同相)
在这里插入图片描述
4.设置输入prescaler预分频器。设置TIMx_CCMR1 IC1PS bits 为 00,即不分频,直接输入
在这里插入图片描述
5.设置TIMx_CCER CC1E bit 使能Capture
在这里插入图片描述
6.如需要,设置TIMx_DIER CC1IE bit 使能中断,设置TIMx_DIER CC1DE bit 使能DMA请求

再强调一下,捕获是指信号变化满足设定的分频、滤波、极性等条件时,触发对当前计数器值的捕获

参考

  • STM32参考手册

希望能帮助到朋友们 和 将来忘了的自己,如有错误,欢迎批评指正!

好的,以下是基于RT-Thread实现的STM32定时器输入捕获程序: ```c #include <rtthread.h> #include "stm32f4xx.h" /* 定时器输入捕获配置结构体 */ TIM_ICInitTypeDef TIM_ICInitStructure; /* 定时器中断处理函数 */ void TIMx_IRQHandler(void) { if (TIM_GetITStatus(TIMx, TIM_IT_CCx) != RESET) { /* 获取输入捕获的值 */ uint16_t capture_value = TIM_GetCapturex(TIMx, TIM_Channel_x); /* 对输入捕获的值进行处理 */ // TODO: 处理输入捕获的值 /* 清除中断标志位 */ TIM_ClearITPendingBit(TIMx, TIM_IT_CCx); } } /* 定时器初始化函数 */ void TIMx_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* 使能定时器时钟 */ RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE); /* 定时器初始化 */ TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 65535; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure); /* 配置输入捕获通道 */ TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_x; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInit(TIMx, &TIM_ICInitStructure); /* 使能输入捕获中断 */ TIM_ITConfig(TIMx, TIM_IT_CCx, ENABLE); /* 使能定时器 */ TIM_Cmd(TIMx, ENABLE); /* 注册定时器中断处理函数 */ rt_hw_interrupt_install(TIMx_IRQn, TIMx_IRQHandler, RT_NULL, "TIMx"); } /* 应用程序入口函数 */ int main(void) { /* 初始化定时器 */ TIMx_Init(); while(1) { // TODO: 应用程序代码 } } ``` 其中,需要根据具体的应用场景来调整以下参数: - TIMx:使用的定时器号,例如TIM2、TIM3等。 - TIM_Channel_x:使用的输入捕获通道,例如TIM_Channel_1、TIM_Channel_2等。 - TIM_IT_CCx:使用的中断类型,例如TIM_IT_CC1、TIM_IT_CC2等。 - TIM_ICPolarity:输入捕获的触发极性,例如TIM_ICPolarity_Rising、TIM_ICPolarity_Falling等。 - TIM_ICSelection:输入捕获的触发源,例如TIM_ICSelection_DirectTI、TIM_ICSelection_IndirectTI等。 需要注意的是,在定时器中断处理函数中,需要根据具体的需求对输入捕获的值进行处理,这部分代码需要根据具体应用场景来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值