Страницы

Страницы

суббота, 26 декабря 2015 г.

STM32F4 HAL Timer& Interrupt Init

/* TIM5 init function */
void MX_TIM5_Init(void)
{
  htim5.Instance = TIM3; 
  htim5.Init.Prescaler = 16800-1; // делим 168 МГц на 16800 получаем 10000 Гц или 10 мс
  htim5.Init.CounterMode = TIM_COUNTERMODE_UP; // таймер считает вверх
  htim5.Init.Period = 5000-1; // считать будет до 5000, т.е. через 500 мс произойдет прерывание
  htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // частоту входную не делим - нам хватает
  HAL_TIM_Base_Init(&htim5);
  /* Start the TIM Base generation in interrupt mode */
  /* Start Channel1 */
  HAL_TIM_Base_Start_IT(&htim5); // включаем прерывание таймера 5
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
}





==========================Without HAL==================================

//=============================================================================
// TIM5 Interrupt Handler
//=============================================================================
void TIM5_IRQHandler(void)
{
    if(TIM5->SR & TIM_SR_UIF) // if UIF flag is set
    {
      TIM5->SR &= ~TIM_SR_UIF; // clear UIF flag
      GPIOA->ODR ^=GPIO_ODR_1;
    }
}    

int main(void)
{
  //HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* System interrupt init*/
  //HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

 /* GPIOB Periph clock enable */
  RCC->AHBENR |= RCC_AHBENR_GPIOAEN; 
  GPIOA->MODER |= (GPIO_MODER_MODER1_0 | GPIO_MODER_MODER0_0) ;    /* Configure PB0 and PB1 output  mode  */
  GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_0 | GPIO_OTYPER_OT_1) ;   // Ensure push pull mode selected--default
  GPIOA->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR0|GPIO_OSPEEDER_OSPEEDR1);    //Ensure maximum speed setting (even though it is unnecessary)
  GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR0|GPIO_PUPDR_PUPDR1);    //Ensure all pull up pull down resistors are disabled  
  GPIOA->BSRRL = GPIO_BRR_BR_1;     // Set
  /* TIM5 clock enable */
  RCC->APB1ENR |= RCC_APB1ENR_TIM5EN;
  TIM5->PSC = 168000 - 1;       // Set prescaler to 16800 = 168 000 000Hz/16800 = 100000 Hz = 10 ms
  TIM5->ARR = 5000 - 1;         // Auto reload value 5000 = 500mS
  TIM5->DIER = TIM_DIER_UIE; // Enable update interrupt (timer level)
  TIM5->CR1 = TIM_CR1_CEN;   // Enable timer
  NVIC_EnableIRQ(TIM5_IRQn); // Enable interrupt from TIM5 (NVIC level) 
   
  while (1)
  {
  }
}



===================================================================

TIM_HandleTypeDef TIM_Handle;
int main(void)
{
    __TIM4_CLK_ENABLE();
    TIM_Handle.Init.Prescaler = 671;
    TIM_Handle.Init.CounterMode = TIM_COUNTERMODE_UP;
    TIM_Handle.Init.Period = 62499;
    TIM_Handle.Instance = TIM4;   //Same timer whose clocks we enabled
    HAL_TIM_Base_Init(&TIM_Handle);     // Init timer
    HAL_TIM_Base_Start_IT(&TIM_Handle); // start timer interrupts
    HAL_NVIC_SetPriority(TIM4_IRQn, 0, 1);
    HAL_NVIC_ClearPendingIRQ(TIM4_IRQn);
    HAL_NVIC_EnableIRQ(TIM4_IRQn);
    while(1)
    {
    }
}
void TIM4_IRQHandler(void)
{
    if (__HAL_TIM_GET_FLAG(&TIM_Handle, TIM_FLAG_UPDATE) != RESET)      //In case other interrupts are also running
    {
        if (__HAL_TIM_GET_ITSTATUS(&TIM_Handle, TIM_IT_UPDATE) != RESET)
        {
            __HAL_TIM_CLEAR_FLAG(&TIM_Handle, TIM_FLAG_UPDATE);
            /*put your code here */
        }
    }
}


Комментариев нет:

Отправить комментарий