STM32再复习(六)7.24晚7.25早

文章目录

      • 输入捕获实验(初级)
      • 输入捕获实验(进阶)

输入捕获实验(初级)

STM32再复习(六)7.24晚7.25早_第1张图片

简而言之:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。
STM32再复习(六)7.24晚7.25早_第2张图片

信号通过滤波器向下计数器,产生一个Tl1F的一个滤波,通过边沿检测器,判断其是上升沿还是下降沿,通过选择器(好像是门)变成Tl1FP1,再进行选择器,变成IC1,然后再分频,分屏的意思就是将几个上升沿触发一次,然后再产生一个IC1PS,最后装载到捕获比较寄存器。所以说的稍微官方点的就是1.设置输入捕获滤波器(正常情况TI1,TI1F相等,但是为了防止抖动,可以控制FDTS,如果它检测到8次高电平,才会发生一个中断,这样就会过滤掉除那些高电平脉宽的低于8个采样周期的脉冲信号)2.设置输入捕获极性(检测上升沿跟下降沿,用一个边沿检测器)3.设置输入捕获映射通道4.设置输入捕获分频器5.捕获到有效信号可以开启中断。
输入捕获通道初始化函数:void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); 这个函数是整体的,不需要对每个通道都要配置。
而上面相关过程用代码的形展示的话是,初始化输入捕获通道:STM32再复习(六)7.24晚7.25早_第3张图片
那输入捕获的一般过程为:
1)开启 TIM5 时钟,配置 PA0 为复用功能(AF2),并开启下拉电阻。
1.初始化定时器和通道对应IO的时钟。
2. 初始化IO口,模式为复用:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
3.设置引脚复用映射:
GPIO_PinAFConfig();
4.初始化定时器ARR,PSC
TIM_TimeBaseInit();
5.初始化输入捕获通道
TIM_ICInit();
6.如果要开启捕获中断,
TIM_ITConfig();
NVIC_Init();
7.使能定时器:TIM_Cmd();
8.编写中断服务函数:TIMx_IRQHandler();

输入捕获实验(进阶)

TIM5的单通道实现的,通过先捕获上升沿,清除计数器值,再更改捕获极性为下降沿,第二次进中断时读出高电平脉宽,一次捕获过程完成。

extern u8  TIM5CH1_CAPTURE_STA; //输入捕获状态
extern u32 TIM5CH1_CAPTURE_VAL;//输入捕获值

在正点原子中,捕获状态TIM5CH1_CAPTURE_STA这个寄存器是作者自己定义的一个,stm32中无硬件对应,无相应硬件置位复位。这个寄存器大家可以把它当做两个标志位flag1+flag2+一个存次数的数length。
flag1(or2)=1有一次成功捕获过程完成或已经捕获到高电平。
flag1(or2)=0未有一次成功捕获过程完成或未捕获到高电平。

现在我们来介绍一下,捕获高电平脉宽的思路:首先,设置 TIM5_CH1 捕获上升沿,这在TIM5_Cap_Init 函数执行的时候就设置好了,然后等待上升沿中断到来,当捕获到上升沿中断,此时如果 TIM5CH1_CAPTURE_STA 的第 6 位为 0,则表示还没有捕获到新的上升沿,就先把TIM5CH1_CAPTURE_STA、TIM5CH1_CAPTURE_VAL 和计数器值 TIM5->CNT 等清零,然后再设TIM5CH1_CAPTURE_STA 的第 6 位为 1,标记捕获到高电平,最后设置为下降沿捕获,等待下降沿到来。如果等待下降沿到来期间,定时器发生了溢出(对 32 位定时器来说,很难溢出),就在 TIM5CH1_CAPTURE_STA 里面对溢出次数进行计数,当最大溢出次数来到的时候,就强制标记捕获完成(虽然此时还没有捕获到下降沿)。**当下降沿到来的时候,先设置TIM5CH1_CAPTURE_STA 的第 7 位为 1,标记成功捕获一次高电平,**然后读取此时的定时器值到 TIM5CH1_CAPTURE_VAL 里面,最后设置为上升沿捕获,回到初始状态。这样,我们就完成一次高电平捕获了,只要 TIM5CH1_CAPTURE_STA 的第 7 位一直为 1,那么就不会进行第二次捕获,我们在main函数处理完捕获数据后,将TIM5CH1_CAPTURE_STA置零,就可以开启第二次捕获。

TIM5CH1_CAPTURE_VAL=0XFFFFFFFF//计数器,如果发生溢出及更新事件的话,计数器就计数到最大

你可能感兴趣的:(STM32再复习(六)7.24晚7.25早)