禁用定时器时出现硬故障?

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 的情况下尝试与第二个计时器一起玩。

【讨论】:

以上是关于禁用定时器时出现硬故障?的主要内容,如果未能解决你的问题,请参考以下文章

STM32 尝试打印数字 >= 10 时出现硬故障

在 STM32 上调用 memset 时出现硬故障异常

STM32F030 启动时出现硬故障,__libc_init_array

暂时禁用定时器中断

STM32 禁用和启用由定时器控制的 DMA 和 PWM

使用动态参数在 setInterval 函数中禁用计时器