【STM32嵌入式系统设计与开发拓展】——14_定时器之输入捕获

参考哔站:链接: 铁头山羊

一、微控制器的高级定时与控制功能集合

1、时基单元
2、输入捕获
3、输出比较
4、从模式控制器
5、高级定时器的输出控制
在这里插入图片描述

二、问题集合

1、什么是定时器
定时器是一种专门负责定时功能的片上外设GPI0AFI0EXTIUSART RCC I2C)
在这里插入图片描述
2、定时器基本结构框图
在这里插入图片描述
在这里插入图片描述

什么是通道?
在这里插入图片描述
在这里插入图片描述
CCRx:(Capture/Compare Register 捕获/比较寄存器

三、输入捕获

什么是输入捕获(就像通过获取通道的输入,进行拍照并存储到CCRx这个寄存器中)
在这里插入图片描述

拍照?
在这里插入图片描述
输入捕获的环节
1、输入滤波 ----> 边沿检测 ----> 信号选择 ---->分频
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
什么是输入滤波?
在这里插入图片描述
只有采集到一定次数的才能检测确定为高低电平,否则过滤掉
在这里插入图片描述
什么是边缘检测?
在这里插入图片描述

信号选择是什么?
在这里插入图片描述
分频是什么?
检测到N个信号变化拍一次照。
在这里插入图片描述
什么是CCx事件?
在这里插入图片描述

四、代码实现步骤

在这里插入图片描述

在这里插入图片描述

    /* TIM配置 */ 
    TIM_TimeBaseStructure.TIM_Period = arr;                          // 自动重装值 
    TIM_TimeBaseStructure.TIM_Prescaler = psc;                       // 时钟预分频器   
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;          // 时钟分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;      // 向上计数
    TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);                  // 初始化TIM5输入捕获

在这里插入图片描述

    /* 输入捕获配置 */ 
    TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1;                // IC1映射到TI1上
    TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;    // 下降沿捕获
    TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 映射到TI1
    TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;	         // 不分频 
    TIM5_ICInitStructure.TIM_ICFilter = 0x00;                        // 不滤波
    TIM_ICInit(TIM5, &TIM5_ICInitStructure);	                       // 初始化TIM5输入捕获

    /* 允许中断 */
    TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);              // 允许更新中断、CC1IE捕获中断	
    
    /* 使能TIMx */
    TIM_Cmd(TIM5,ENABLE); 	

在这里插入图片描述

    /* NVIC 配置 */
    NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;                  // 中断向量表为TIM5
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;        // 先占优先级2
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;               // 从优先级0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                  // 使能中断
    NVIC_Init(&NVIC_InitStructure);                                  // 初始化NVIC

中断服务函数

在这里插入图片描述

步骤 1:检查是否成功捕获
通过 if((TIM5CH1_CAPTURE_STA&0X80)==0) ,若未成功捕获则继续。
例:如果 TIM5CH1_CAPTURE_STA 的值是 0011 0010 ,与 1000 0000 进行按位与运算的结果是 0 ,就表示捕获未成功。
如果 TIM5CH1_CAPTURE_STA 的值是 1011 0010 ,按位与运算结果不为 0 ,就表示捕获成功。

步骤 2:检查更新中断标志位
TIM_GetITStatus(TIM5,TIM_IT_Update)!= RESET 且已捕获低电平,进行后续处理。

if(TIM5CH1_CAPTURE_STA&0X40) // 如果已经捕获到低电平
如: TIM5CH1_CAPTURE_STA 的值是 0011 0010,与 0100 0000 按位与运算结果为 0,表明未捕获到低电平。
TIM5CH1_CAPTURE_STA 的值是 0111 0010,按位与运算结果不为 0,就表示已经捕获到低电平。

步骤 3:处理低电平持续情况
若低电平过长((TIM5CH1_CAPTURE_STA&0X3F)==0X3F),标记捕获成功并设捕获值最大;否则累加低电平时间。

步骤 4:检查捕获 1 事件
TIM_GetITStatus(TIM5, TIM_IT_CC1)!= RESET ,根据捕获沿情况处理。

步骤 5:处理已捕获上升沿
若已捕获上升沿和下降沿,标记捕获成功、记录值并设为下降沿捕获。

步骤 6:处理首次捕获下降沿
若首次捕获下降沿,进行初始化,包括清空状态和值、清计数器、标记下降沿并设为上升沿捕获。

步骤 7:清除中断标志位
通过 TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update) 清除标志位。

主函数实现

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值