2016-11-30 103 views
0

我的目标是有中断38KHZ和切换一个LED,但不管如何我设置为预分频器和周期为什么我的STM32F7每43秒只中断一次?

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秒切换无论什么分频器和期间设定为。

我必须错过一些东西,但我无法弄清楚。任何有中断经验的人都可以帮忙?

+0

因为这不是所有的代码,我们需要问,如果HAL :: initTim实际上是调用,以及是否有其他的代码重用 - 在某处编程你的计时器。 – nos

+0

什么是系统时钟和定时器的源时钟? (频率) –

+0

这将有助于查看更多的代码,特别是时钟,中断和计时器的启动。 – staringlizard

回答

2

好吧。定时器非常简单。你刚刚通过使用魔方变得很难。

__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(); 
0

与STM32F469I-DISCOVERY不同的项目,但我遵循Jeroen3的答案。我不确定你会在哪里得到__HAL_RCC ...和__NOP();的代码,但它没有它。我计算了预分频器和周期是一些因素。例如,要获得一个闪烁的LED 1Hz,我需要预分频器'* period'=我学到的timer_clock是core_clock/2。

所以180MHz的的core_clock和以1Hz的期望中断会给

(预分频器+ 1)*(周期+ 1)= 180MHz的/ 2/1Hz的= 90M

其可以分为9000和10000.我不确定预分频器,但16位定时器的周期不能超过2 1?1。这意味着这些因素不可能是90000和1000,因为90000超过2×1-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_TimeBase/Src/main.c

相关问题