Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32, hal, timer
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
AlexMad
Перековырял примеры, возможно, какую-то мелочь упустил.
Таймер настраиваю на две секунды.
Проблема в том, что прерывание срабатывает сразу, как только делаю инициализацию.

Код
#define TIMx                           TIM3
#define TIMx_CLK_ENABLE                __HAL_RCC_TIM3_CLK_ENABLE
#define TIMx_IRQn            TIM3_IRQn
#define TIMx_IRQHandler            TIM3_IRQHandler

TIM_HandleTypeDef    TimHandle;
uint16_t uwPrescalerValue = 0;


void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
   /*##-1- Enable peripherals and GPIO Clocks #################################*/
   /* TIMx Peripheral clock enable */
   TIMx_CLK_ENABLE();

   /*##-2- Configure the NVIC for TIMx ########################################*/
   /* Set the TIMx priority */
   HAL_NVIC_SetPriority(TIMx_IRQn, 0, 1);

   /* Enable the TIMx global Interrupt */
   HAL_NVIC_EnableIRQ(TIMx_IRQn);
}


/* ----------------------- Initialize Timer -----------------------------*/
BOOL
xMBPortTimersInit( USHORT usTim1Timerout50us )
{
   uwPrescalerValue = (uint32_t) (SystemCoreClock / 20000) - 1;

   /* Set TIMx instance */
   TimHandle.Instance = TIMx;


   /* Initialize TIM3 peripheral as follows:
        + Period = 10000 - 1
        + Prescaler = ((SystemCoreClock/2)/10000) - 1
        + ClockDivision = 0
        + Counter direction = Up
   */
   TimHandle.Init.Period = (uint16_t) usTim1Timerout50us;
   TimHandle.Init.Prescaler = uwPrescalerValue;
   TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;//0;
   TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
   TimHandle.Instance->CNT = 0x0000;
   if(HAL_TIM_Base_Init(&TimHandle) != HAL_OK)
   {
     /* Initialization Error */
//    Error_Handler();
   }

   if(HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK) // если это перенести в функцию старта таймера, прерывание будет вызываться два раза - при старте и при окончании счета
     {
//    Error_Handler();
     }

   HAL_TIM_Base_Stop(&TimHandle);

     return TRUE;
}

/* ----------------------- Enable Timer -----------------------------*/
inline void
vMBPortTimersEnable(  )
{
   /* Restart the timer with the period value set in xMBPortTimersInit( ) */
   TimHandle.Instance->CNT = 0x0000;
   if(HAL_TIM_Base_Start(&TimHandle) != HAL_OK)
     {
       /* Starting Error */
       //    Error_Handler();
     }
}


По идее, нужно HAL_TIM_Base_Start_IT вызывать из vMBPortTimersEnable. Но это приводит к двойному срабатыванию прерывания. Сейчас получается так, что при инициализации срабатывает один раз прерывание, потом все идет, как положено.
AlexMad
Разобрался. Надо сбрасывать флаг прерывания перед запуском.
Был уверен, что он по умолчанию сброшен.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.