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

、1はHAL :: initTimが実際に呼び出された場合に依頼する必要があり、他のコードの再があるかどうどこかであなたのタイマーをプログラミングする。 – nos

+0

システムクロックとタイマーのソースクロックとは何ですか? (周波数) –

+0

あなたのコード、特にクロック、割り込み、タイマーの開始をもう少し見るのに役立ちます。 – staringlizard

答えて

2

タイマーは非常に簡単です。あなたはちょうどキューブを使ってそれを難し​​くしました。 ISRで

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

:余談として

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を得るには、prescaler '* period' = timer_clockをcore_clock/2として学習させます。したがって、180MHzののcore_clockとは1Hzで所望の割込みが与える

(プリスケーラ+ 1)*(ピリオド+ 1)= 180MHzの/ 2/1Hzの= 90M

でき

9000と10000に分割することができます。私はプリスケーラについてはわかりませんが、16ビットタイマの周期は2×16-1以上ではありません。これは、90000が216-1以上であるため、要因が90000と1000になることができないことを意味します。どちらも、それは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

関連する問題