关于STM32输入捕获定时器未启动就进入捕获中断的问题

测试芯片:STM32L151RCT6

问题描述:

       当我初始化完成输入捕获定时器后,我在未使能这个定时器的时候,在输入捕获引脚输入PWM脉冲,这是发现捕获定时器的捕获标志(CC1IF)置位了,同时也进入了中断。参考附在后面。

问题分析:

        这个现象开始我很困惑,我还未使能这个捕获定时器怎么还能进入捕获中断呢?网上找相关问题的资料也没有,那就只能从手册上面找答案了,找了许久手册也没有直接说为什么会这样,但是我看定时器使能位CEN时,我大概明白了,CEN位叫计数器使能,置1后计数器TIMx_CNT开始递增或递减,可以看出这个位主要是让定时器计数器开始工作的,这对于大多数应用来说这个CEN位没有置1,很多功能是不能运行的,但是定时器的捕获就不是这样了,当你配置好了捕获参数之后,即将这个通道使能后(TIMx->CCER相应通道置位后),捕获通道其实就已经开始工作了,当捕获通道检测到了上升沿或者下降沿后就会置位相关标志,也就是说这部分电路是独立工作的,CEN置位与否影响的是进入捕获中断后读取的捕获值(TIMx->CCR1)是否正确,CEN为0时,由于计数器没有工作次数采集到的数据为0。

 参考代码:

/**
  * 说明 : 用来捕获上升沿
  * 参数 : 无
  * 返回 : 无
  */
void Cap_Timer_Init(void)
{
    LL_TIM_IC_InitTypeDef TIM_IC_InitStruct = {0};	
    LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
	
	LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);	
    LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2);
	
	/** CAP_CH1->PA0->TIM2_CH1 */
	GPIO_InitStruct.Pin=LL_GPIO_PIN_0;
	GPIO_InitStruct.Mode=LL_GPIO_MODE_ALTERNATE;
	GPIO_InitStruct.Speed=LL_GPIO_SPEED_FREQ_HIGH;
	GPIO_InitStruct.Pull=LL_GPIO_PULL_NO;
	GPIO_InitStruct.Alternate=LL_GPIO_AF_1;
	LL_GPIO_Init(GPIOA, &GPIO_InitStruct);	
	
	/** Cap_IN->PA1->TIM2_CH2 */
	GPIO_InitStruct.Pin=LL_GPIO_PIN_1;	
	LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	/** 定时器时基配置 */
	LL_TIM_SetPrescaler(TIM2, 0);
	LL_TIM_SetAutoReload(TIM2, 65535);	
	LL_TIM_SetCounterMode(TIM2, LL_TIM_COUNTERMODE_UP);
    LL_TIM_EnableARRPreload(TIM2);
    LL_TIM_SetClockSource(TIM2, LL_TIM_CLOCKSOURCE_INTERNAL);
	
	/** 输入捕获参数设置 */
	TIM_IC_InitStruct.ICActiveInput = LL_TIM_ACTIVEINPUT_DIRECTTI;
	TIM_IC_InitStruct.ICFilter = LL_TIM_IC_FILTER_FDIV1;
	TIM_IC_InitStruct.ICPolarity = LL_TIM_IC_POLARITY_RISING;
	TIM_IC_InitStruct.ICPrescaler = LL_TIM_ICPSC_DIV1;
	LL_TIM_IC_Init(TIM2, LL_TIM_CHANNEL_CH1, &TIM_IC_InitStruct);
	/** 使能通道 */
	LL_TIM_CC_EnableChannel(TIM2, LL_TIM_CHANNEL_CH1);

	/** 配置中断 */
    LL_TIM_EnableIT_CC1(TIM2);
	LL_TIM_EnableIT_UPDATE(TIM2);
    NVIC_EnableIRQ(TIM2_IRQn); 
	NVIC_SetPriority(TIM2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 2, 0));
	
	LL_TIM_GenerateEvent_UPDATE(TIM2);
	LL_TIM_ClearFlag_CC1(TIM2);	
	LL_TIM_ClearFlag_UPDATE(TIM2);
//	LL_TIM_EnableCounter(TIM2);	/** 不使能 */

}

/**
  * 说明 : 定时器2中断服务函数(捕获)
  * 参数 : 无
  * 返回 : 无
  */ 
void TIM2_IRQHandler(void)
{
	if(LL_TIM_IsActiveFlag_CC1(TIM2) != RESET)
	{
		Debug.cap = LL_TIM_IC_GetCaptureCH1(TIM2); 
		LL_TIM_DisableCounter(TIM2);
		PC10_Toggle();
		Debug.status=0xAA;
	}
	if(LL_TIM_IsActiveFlag_UPDATE(TIM2) != RESET)
	{
		LL_TIM_ClearFlag_UPDATE(TIM2);
		LL_TIM_DisableCounter(TIM2);
		PC11_Toggle();
		Debug.status=0xFF;
	}
}


测试结果:

给PA0输入PWM,会产生捕获中断,但是读取到的捕获值为0。并且从结果看,捕获发生的时刻并不是上升沿(这点很奇怪,根我上面讲的有点对不上,我认为应该在上升沿捕获才对),所以针对这个问题,以上的分析仅限我个人看法。

时序波形如下:

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值