|
今天配置定时器通道一捕获事件复位并启动计数器,配置如下 TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure); TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV4; TIM_TimeBaseInit(TIM1 , &TIM_TimeBaseInitStructure); TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Combined_ResetTrigger); TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1); TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInit(TIM1, &TIM_ICInitStructure); 调试发现寄存器值并不是预期结果,单步调试发现bug在TIM_SelectInputTrigger函数。
从参考手册查到复位并触发计数器需要把sms设为1000,关键在sms[3]。sms[3]又被TIM_SelectInputTrigger函数清掉了 void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource) { uint16_t tmpsmcr = 0; /* Check the parameters */ assert_param(IS_TIM_LIST2_PERIPH(TIMx)); assert_param(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource)); /* Get the TIMx SMCR register value */ tmpsmcr = TIMx->SMCR; /* Reset the TS Bits */ tmpsmcr &= (uint16_t)~TIM_SMCR_TS; /* Set the Input Trigger source */ tmpsmcr |= TIM_InputTriggerSource; /* Write to TIMx SMCR */ TIMx->SMCR = tmpsmcr; } 解决方法是调换一下函数顺序 又看了一下其他函数也发现了形如 reg=data的语句,像这种直接对寄存器赋值就有可能会出现误操作 |
没啥卵用!!!!因为标准库早就不支持更新了!!!![]() ![]() |
微信公众号
手机版