STM32F103多通道输入捕获初始化要注意的问题

本文介绍了在使用STM32F103ZeT6进行多通道输入捕获初始化时遇到的问题及解决方法。通过实例展示了初始化TIM2输入捕获参数时,一次性设置多个通道无效,而逐个通道单独设置才能正常工作的原因。分析了TIM_ICInit函数内部实现,指出其按通道逐一处理的特性,为读者提供了正确的初始化步骤。
摘要由CSDN通过智能技术生成

STM32F103多通道输入捕获初始化要注意的问题
CPU:STM32F103ZeT6,捕获4路按钮按下的时间,采用定时器TIM2,对应的GPIO:PA0~PA3。
初始化TIM2的输入捕获参数时,先是采用了下面的设置:
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1|TIM_Channel_2|TIM_Channel_3|TIM_Channel_4;
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM2_ICInitStructure.TIM_ICFilter = 0010;
TIM_ICInit(TIM2, &TIM2_ICInitStructure);
导致main函数的while(1)内的语句仅执行1次或最多3次后,就不在执行了。
后改为以下设置:
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM2_ICInitStructure.TIM_ICFilter = 0010;
TIM_ICInit(TIM2, &TIM2_ICInitStructure);
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM2_ICInitStructure.TIM_ICFilter = 0010;
TIM_ICInit(TIM2, &TIM2_ICInitStructure);
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_3;
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM2_ICInitStructure.TIM_ICFilter = 0010;
TIM_ICInit(TIM2, &TIM2_ICInitStructure);
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_4;
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM2_ICInitStructure.TIM_ICFilter = 0010;
TIM_ICInit(TIM2, &TIM2_ICInitStructure);
程序运行正常。

总结

这是对void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)函数没掌握造成的,
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)
{

if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1)
{

}
else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_2)
{
… }
else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_3)
{
… }
else
{
… }
}
其对形参TIM_ICInitTypeDef* TIM_ICInitStruct是按照== TIM_Channel_1、== TIM_Channel_2…来判断的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值