2016-11-30 8 views
0

내 목표는 상관없이 나는 그것이 대상으로 깜박 언제 프리스케일러 및 기간왜 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){} 

로 설정 어떤 인터럽트 38KHZ이 없습니다와 LED를 전환 만하는 것입니다, LED가에 상관없이 모든 43초을 전환하지 무엇 프리스케일러와 기간은로 설정됩니다.

나는 뭔가를 놓치고 있어야하지만, 나는 그것을 이해할 수 없다. 도움이 될 수있는 인터럽트 경험이있는 사람은 누구입니까?

+0

을, 하나는 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(); 코드를 가지고 있을지 모르지만, 그것 없이는 작동했습니다. 나는 prescaler와 기간을 몇 가지 요인으로 계산했다. 예를 들어 깜박임 LED 1Hz를 얻으려면 prescaler 'period'= timer_clock을 core_clock/2로 배웠 으면됩니다. 그래서 된 180MHz의 core_clock 및 1Hz로에서 소정의 인터럽트 줄수

(프리스케일러 + 1) * (기간 + 1) = 된 180MHz/2/1Hz의 = 90M

9000과 10000으로 나눌 수 있습니다. 프리스케일러에 대해서는 잘 모르겠지만 16 비트 타이머의주기는 2¹6-1 이상이 될 수 없습니다. 이것은 90000이 2 -16-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