【问题标题】: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 指向的地址是否有效?
  • 我想我明白了!我在初始化时钟后立即发生了定时器中断!因为那时我还没有初始化第二个计时器,所以发生了一个硬故障。感谢您为我指明正确的方向!

标签: c++ timer embedded stm32 interrupt


【解决方案1】:

在初始化第一个定时器后立即发生定时器中断。我必须在我的第二个 IRQ 中添加一行代码,这样它只会在第二个计时器不是 nullptr 的情况下尝试与第二个计时器一起玩。

【讨论】:

    猜你喜欢
    • 2014-12-22
    • 1970-01-01
    • 2022-01-21
    • 2014-12-07
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    相关资源
    最近更新 更多