我正在尝试通过GPIO获得每秒4次的100us脉冲。我这样做的方式是有两个基于定时器的中断;一个每秒触发4次,另一个在第一次之后触发100us。
在第一定时器的中断处理器内,目标引脚被设置为高电平,第二定时器被复位,并且第二定时器上的中断被使能。在第二中断处理程序内,目标引脚设置为低电平,并且中断被禁用。下面是我的代码:
First timer的ISR:
void TIM4_IRQHandler(void)
{
{
TIM4 -> SR = ~(TIM_SR_UIF); // clear UIF flag
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_HIGH); // target pin
endTrigger->restartTimer();
endTrigger->enableInterrupts();
}
}秒定时器的ISR:
void TIM5_IRQHandler(void)
{
{
TIM5 -> SR = ~(TIM_SR_UIF); // clear UIF flag
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_LOW); // target pin
endTrigger->disableInterrupts();
}
}重新启动计时器功能:
void Timer::restartTimer() {
myhTim->CR1 &= ~TIM_CR1_CEN; // disable the timer
myhTim->CNT = 0; // reset count
myhTim->SR = 0; // clear any interrupt flags
myhTim->CR1 = TIM_CR1_CEN; // re-engage timer
}不管是什么原因,当我给CR1写信的那一秒,我就收到了一个严重的错误...知道为什么吗?我知道还有其他方法可以获得100us的脉搏,但这似乎是我们需要的最简单的方法……我们不需要额外的定时器,我们需要半频繁地将脉冲同步到外部硬件。
发布于 2021-04-02 04:46:56
定时器中断在初始化第一个定时器后立即发生。我不得不在我的第二个IRQ中添加一行代码,这样它只会在第二个计时器不是nullptr的情况下尝试使用它。
https://stackoverflow.com/questions/66911004
复制相似问题