新手上路
- 积分
- 44
- 金钱
- 44
- 注册时间
- 2018-7-19
- 在线时间
- 13 小时
|
在使用定时器中断时候,中断有更新中断和捕获中断(即TIM_IT_Update 和 TIM_IT_CC1- TIM_IT_CC4)的区别,我大致理解为更新中断是计时器溢出的标志,捕获中断是捕获事件发生的标志。
于是我利用上升沿捕获写了一个简单的测频率的中断服务函数,函数思想是计算一个计时器周期(开始计数到溢出)内上升沿的次数,以固定的计数器溢出时间和次数计算频率。中断服务函数如下
u8 TIM5CH1_CAPTURE_STA=0; //输入捕获状态
uint32_t time; //计数次数值
//定时器5中断服务程序
void TIM5_IRQHandler(void)
{
if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) !=RESET)//捕获1发生捕获事件,上升沿到来
{
if(TIM5CH1_CAPTURE_STA&0x40) //先判断是否已经捕获到上升沿
{
time++; //如果已经捕获到上升沿,那么后边捕获到上升沿后只需给计数器加一
if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) //定时器溢出中断是否发生
{
TIM5CH1_CAPTURE_STA|=0X80; //标记成功,捕获到一个计数器周期的高电平
}
}
else //还未开始,第一次捕获上升沿
{
time=0; //计数器归零
TIM_SetCounter(TIM5,0); //计时器归零
TIM5CH1_CAPTURE_STA|=0x40; //标记捕获到了上升沿
}
}
}
TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}
主函数部分代码如下:
TIM5_Cap_Init(49999,72-1); //将重装载值设置为49999,以1Mhz的频率计数 ,则计满一次为50ms
while(1)
{
delay_ms(10);
if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿
{
printf("\r time= %d ci\r\n",time); //一个定时器周期计数次数
printf("\r F= %f Hz\r\n",time/50.0f);
delay_ms(500);
}
}
问题是,无论信号源多少评率,这边只是显示,一个定时器周期内只捕获到一次上升沿,串口打印值如下图
我不知道是定时器捕获中断理解错误,还是代码编写错误,希望哪位大神给我指导一下,感激不尽!!!!
|
-
|