初级会员

- 积分
- 188
- 金钱
- 188
- 注册时间
- 2015-4-20
- 在线时间
- 32 小时
|
20金钱
本帖最后由 gongpeng192 于 2022-3-9 22:18 编辑
我把系统时钟更改为64M,输入捕获频率改为64M 会出现漏记1次定时器溢出次数的现象,我怀疑是定时器更新中断跟输入捕获中断同时发生了,然后把定时器更新中断漏掉了,有没有这种可能?求大神解释下,谢谢。
int main(void)
{
long long temp=0;
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(RCC_PLL_MUL8); //设置时钟,72M
delay_init(64); //初始化延时函数
uart_init(115200); //初始化串口
LED_Init(); //初始化LED
// TIM3_PWM_Init(500-1,64-1); //72M/72=1M的计数频率,自动重装载为500,那么PWM频率为1M/500=2kHZ
TIM5_CH1_Cap_Init(0XFFFF,0); //以64Mhz的频率计数
while(1)
{
// delay_ms(10);
// TIM_SetTIM3Compare2(TIM_GetTIM3Capture2()+1);
// if(TIM_GetTIM3Capture2()==300)TIM_SetTIM3Compare2(0);
if(TIM5CH1_CAPTURE_STA&0X8000) //成功捕获到了一次高电平
{
temp=TIM5CH1_CAPTURE_STA&0X3FFF;
temp*=65536; //溢出时间总和
temp+=TIM5CH1_CAPTURE_VAL; //得到总的高电平时间
printf("%lld ",temp);//打印总的高点平时间
TIM5CH1_CAPTURE_STA=0; //开启下一次捕获
}
}
}
//定时器更新中断(计数溢出)中断处理回调函数, 该函数在HAL_TIM_IRQHandler中会被调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//更新中断(溢出)发生时执行
{
if((TIM5CH1_CAPTURE_STA&0X8000)==0) //还未成功捕获
{
if(TIM5CH1_CAPTURE_STA&0X4000) //已经捕获到高电平了
{
if((TIM5CH1_CAPTURE_STA&0X3FFF)==0X3FFF) //高电平太长了
{
TIM5CH1_CAPTURE_STA|=0X8000; //标记成功捕获了一次
TIM5CH1_CAPTURE_VAL=0XFFFF;
}else TIM5CH1_CAPTURE_STA++;
}
}
}
//定时器输入捕获中断处理回调函数,该函数在HAL_TIM_IRQHandler中会被调用
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获中断发生时执行
{
if((TIM5CH1_CAPTURE_STA&0X8000)==0) //还未成功捕获
{
if(TIM5CH1_CAPTURE_STA&0X4000) //捕获到一个下降沿
{
TIM5CH1_CAPTURE_STA|=0X8000; //标记成功捕获到一次高电平脉宽
TIM5CH1_CAPTURE_VAL=HAL_TIM_ReadCapturedValue(&TIM5_Handler,TIM_CHANNEL_1);//获取当前的捕获值.
TIM_RESET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1); //一定要先清除原来的设置!!
TIM_SET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);//配置TIM5通道1上升沿捕获
}
else //还未开始,第一次捕获上升沿
{
TIM5CH1_CAPTURE_STA=0; //清空
TIM5CH1_CAPTURE_VAL=0;
TIM5CH1_CAPTURE_STA|=0X4000; //标记捕获到了上升沿
__HAL_TIM_DISABLE(&TIM5_Handler); //关闭定时器5
__HAL_TIM_SET_COUNTER(&TIM5_Handler,0);
TIM_RESET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1); //一定要先清除原来的设置!!
TIM_SET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//定时器5通道1设置为下降沿捕获
__HAL_TIM_ENABLE(&TIM5_Handler); //使能定时器5
}
}
}
|
最佳答案
查看完整内容[请看2#楼]
你要关定时器那就没办法了,你可以全局只关捕获中断啊,溢出中断就让它一直进中断,看你的逻辑应该是计算频率之类的,溢出中断加个判断捕获有效的条件,占用不了多少周期,你的输入捕获频率要是大于定时器时钟的1/5,建议你换主频更高的IC
|