为什么我的STM32F7仅每43秒中断一次

Why does my STM32F7 only interrupt every 43 seconds?

本文关键字:一次 中断 我的 STM32F7 仅每 43秒 为什么      更新时间:2023-10-16

我的目标是中断38kHz并切换一个LED,但是无论我设置为预定器和周期

static TIM_HandleTypeDef s_TimerInstance = { 
        .Instance = TIM2,
    };
void Hal::initTim()
{
    __TIM2_CLK_ENABLE();
    s_TimerInstance.Init.Prescaler = 96;                         // This does nothing
    s_TimerInstance.Init.CounterMode = TIM_COUNTERMODE_UP;
    s_TimerInstance.Init.Period = 26;                            // This does nothing
    s_TimerInstance.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_Base_Init(&s_TimerInstance);
    HAL_TIM_Base_Start_IT(&s_TimerInstance);

    HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM2_IRQn);
}
extern "C" void TIM2_IRQHandler()
{
    HAL_TIM_IRQHandler(&s_TimerInstance);
}
extern "C" void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    HAL_GPIO_TogglePin(GPIOI, GPIO_PIN_1);     // Happens every 43 seconds for some reason
}
extern "C" void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim){}
extern "C" void HAL_TIMEx_CommutationCallback(TIM_HandleTypeDef *htim){}

当我将其刷新到目标时,LED每43秒切换一次,无论将预定器和周期设置为什么。

我一定缺少一些东西,但我无法弄清楚。任何有可以帮助您的中断经验的人?

很好。计时器超级简单。您刚刚使用Cube很难。

__TIM2_CLK_ENABLE();
TIM2->PSC = 96;                           // prescaler (note that 0 is /1)
TIM2->ARR = 0xFFFF-26;                    // reload on overflow
TIM2->DIER = TIM_DIER_UIE;                // overflow isr
TIM2->CR1 |= TIM_CR1_CEN;                 // enable timer
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);

在ISR中:

if(TIM2->SR & TIM_SR_UIF){
    TIM2->SR &= ~TIM_SR_UIF;
}

旁边。我喜欢在Init上保证重置条件。

__HAL_RCC_TIM2_FORCE_RESET();
__NOP();
__HAL_RCC_TIM2_RELEASE_RESET();

带有STM32F469I划分的不同项目,但我遵循Jeroen3的答案。我不确定您在哪里拥有__HAL_RCC ...和__NOP();代码,但是它没有它。我计算了预定器和时期是某些因素。例如,要获得眨眼LED 1Hz,我将拥有Prescaler' * ofere'= timer_clock,我了解到的是core_clock/2。

因此,一个180MHz的Core_clock和1Hz的所需中断会给出

(Prescaler 1)*(周期 1)= 180MHz/2/1Hz = 90m

可以分为9000和10000。我不确定预定器,但是16位计时器上的周期可能不超过2⁶-1。这意味着这些因素不能为90000和1000,因为90000超过2⁶-1。也不能是900和100000。

extern "C"
{
    #include "stm32f4xx_hal.h"
    #include "stm32f4xx_hal_tim.h"
    #include "stm32469i_discovery.h" //Needed for LED
    /* User can use this section to tailor TIMx instance used and associated
    resources */
    /* Definition for TIMx clock resources */
    #define TIMx                           TIM3
    #define TIMx_CLK_ENABLE()              __HAL_RCC_TIM3_CLK_ENABLE()

    /* Definition for TIMx's NVIC */
    #define TIMx_IRQn                      TIM3_IRQn
    #define TIMx_IRQHandler                TIM3_IRQHandler
    void TIM3_IRQHandler()
    {
        if(TIMx->SR & TIM_SR_UIF){
            TIMx->SR &= ~TIM_SR_UIF;
            BSP_LED_Toggle(LED2);
        }
    }
    void initTimer()
    {
        TIMx_CLK_ENABLE();
        //SystemCoreClock = 180MHz
        //PSC = 180/2/10000-1 = 9000-1
        TIMx->PSC = (uint32_t)((SystemCoreClock / 2) / 10000) - 1;// prescaler (note that 0 is /1)
        TIMx->ARR = 10000-1;                    // reload on overflow
        TIMx->DIER = TIM_DIER_UIE;                // overflow isr
        TIMx->CR1 |= TIM_CR1_CEN;                 // enable timer
        HAL_NVIC_SetPriority(TIMx_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(TIMx_IRQn);
    }
}
#include "gui/model/Timer.hpp"
void Timer::init()
{
    initTimer();
}

其他灵感:https://github.com/paxinstruments/stm32cubef4/blob/master/projects/stm32469i-discovery/examples/tim/tim/tim_timebase/src/src/main.c/main.c

相关文章: