参考哔站:链接: 铁头山羊
一、微控制器的高级定时与控制功能集合
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)
清除标志位。