禁用定时器时出现硬故障?
Posted
技术标签:
【中文标题】禁用定时器时出现硬故障?【英文标题】:Hard Fault When Disabling Timer? 【发布时间】:2021-06-28 20:02:08 【问题描述】:我试图通过 GPIO 使 100us 的脉冲每秒发生 4 次。我这样做的方法是使用两个基于计时器的中断;一个每秒触发 4 次,另一个在第一次触发 100us 后触发。
在第一个定时器的中断处理程序中,目标引脚设置为高电平,第二个定时器复位,第二个定时器的中断被使能。在第二个中断处理程序中,目标引脚设置为低电平并禁用中断。这是我的代码的样子:
第一个计时器的 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 脉冲,但这似乎是满足我们需求的最简单方法......我们不需要额外的计时器,我们需要半频繁地同步脉冲到外部硬件。
【问题讨论】:
那么,myhTim->CR1 = TIM_CR1_CEN;
是否产生了硬故障?
myhTim 指向的地址是否有效?
我想我明白了!我在初始化时钟后立即发生了定时器中断!因为那时我还没有初始化第二个计时器,所以发生了一个硬故障。感谢您为我指明正确的方向!
【参考方案1】:
在初始化第一个定时器后立即发生定时器中断。我必须在我的第二个 IRQ 中添加一行代码,这样它只会在第二个计时器不是 nullptr
的情况下尝试与第二个计时器一起玩。
【讨论】:
以上是关于禁用定时器时出现硬故障?的主要内容,如果未能解决你的问题,请参考以下文章