c-STM32中的定时器输入捕获模式出现问题



我想用每1ms发生一次的外部信号触发一个计时器。然后,计时器必须在外部信号的每个上升沿计数到90us。问题是,我可以使用配置为"输入比较"的通用计时器吗?我不知道该用哪个回调。

我正在STM32F446微控制器中使用HAL库和TIM2外围设备。

这就是我如何配置我的定时器外围

void TIMER2_Config(void)
{
TIM_IC_InitTypeDef timer2IC_Config;
htimer2.Instance = TIM2;
htimer2.Init.CounterMode = TIM_COUNTERMODE_UP;
htimer2.Init.Period = 89; //Fck=50MHz, Timer period = 90us
htimer2.Init.Prescaler = 49;
if ( HAL_TIM_IC_Init(&htimer2) != OK)
Error_handler();
timer2IC_Config.ICPolarity = TIM_ICPOLARITY_RISING; 
timer2IC_Config.ICPrescaler = TIM_ICPSC_DIV1;
if (HAL_TIM_IC_ConfigChannel(&htimer2, &timer2IC_Config, TIM_CHANNEL_1) != OK)
Error_handler();
}

您所要求的完全在这个外设的功能范围内,但您必须记住,HAL库无法使用芯片的全部功能。有时您必须直接使用访问寄存器(LL库是另一种方法(。

要让外部信号启动计时器,您需要使用触发模式,而不是输入捕获。输入捕获意味着记录已经启动的计时器的值。您需要将字段TIMx_CCMRx_CCxS设置为0b11(3(以使输入成为触发器,然后将字段TIMx_SMCR_TS设置为选择您正在使用的信道,将字段TIM_xSMCR_SMS设置为0b110(6(以选择触发启动模式。

接下来,将预分频器和重新加载寄存器设置为,以计数所需的90微秒延迟,并将TIMx_CR1_OPM设置为1,以在计数器达到极限时停止包装。

接下来,将TIMx_CR2_MMS设置为0b010,以输出更新事件的触发器。

最后,您可以将ADCx_CR2_EXTSEL位设置为0b00110,以触发TIM2_TRGO触发输出。

这一切都有点复杂,但参考手册非常详尽,你应该通读整章,并检查寄存器描述部分的每个字段。我建议不要将HAL库与直接寄存器访问混合,这可能会干扰您的操作。

最新更新