ST意法半导体
直播中

小黑羊

13年用户 1151经验值
擅长:31274
私信 关注
[问答]

如何利用STM32H723ZG的LPTIM1模块产生1ms的中断呢

大家好,
我想利用 STM32H723ZG 的 LPtiM1 模块来产生 1ms 的中断。
时钟频率使用 64Mhz (HSI)。
环境:Nucleo 144 STM32H723ZG
预分频器:除以 128
自动重载寄存器值:500u
下面是init函数的代码片段:
void Timer_driver_init(void)
{
        // 启用 LPTIM1 的外设时钟
         RCC->APB1LENR = RCC_APB1LENR_LPTIM1EN;

        // NVIC 初始化
        NVIC_EnableIRQ(LPTIM1_IRQn);

        // 配置 LPTIM
        定时器->CFGR |= TIMER_INTERNAL_CLK | TIMER_COUNTERSOURCE_INTERNAL|
                                        TIMER_SOFTWARE_TRIGGER | TIMER_UPDATE_IMMEDIATE ;

        // 更新预分频器
        TIMER->CFGR |= TIMER_PRESCALER ;

        // 更新自动重载寄存器
        TIMER->ARR = TIMER_PERIOD;

        //启用自动重载匹配中断
        定时器->IER |= LPTIM_IER_ARRMIE;

        // 启用 LPTIM 模块
        定时器->CR |= LPTIM_CR_ENABLE;

        // 等待定时器计数器被启用
        while ((TIMER->CR & LPTIM_CR_ENABLE) != LPTIM_CR_ENABLE);

        //启用后启动计数器
        定时器->CR |= LPTIM_CR_CNTSTRT;
}

中断处理程序回调:

void Timer_driver_irqHandler(void)
{
        静态 uint16_t HwTimer_tick_count_l_u16 = 0U;

  如果(定时器->ISR & LPTIM_ISR_ARRM)
  {
    // 自动重载匹配清除标志
          定时器->ICR |= LPTIM_ICR_ARRMCF;

    d_HwTimer_counter_mS_u16++; // 递增 mS 计数器
    HwTimer_tick_count_l_u16++;

    如果(HwTimer_tick_count_l_u16 == 1000U)
    {
            d_HwTimer_counter_S_u16++; //递增S计数器
            HwTimer_tick_count_l_u16 = 0;
    }
  }
}

问题:定时器中断太频繁,不是1ms产生。


回帖(1)

马念

2022-12-26 16:29:43
在这两个例子中似乎不太可能 CNT=0。如果你重新加载寄存器,你能看到它改变值吗?

> TIMER->ARR = TIMER_PERIOD;
> 定时器->CR |= LPTIM_CR_ENABLE;

您在启用计数器之前触摸 ARR,这是不允许的。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分