2016-11-30 86 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