реклама на сайте
подробности

 
 
> stm32, hal, timer, Прерывание в момент инициализации
AlexMad
сообщение Feb 13 2016, 12:48
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 262
Регистрация: 18-02-05
Из: SPb
Пользователь №: 2 743



Перековырял примеры, возможно, какую-то мелочь упустил.
Таймер настраиваю на две секунды.
Проблема в том, что прерывание срабатывает сразу, как только делаю инициализацию.

Код
#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. Но это приводит к двойному срабатыванию прерывания. Сейчас получается так, что при инициализации срабатывает один раз прерывание, потом все идет, как положено.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 1)
AlexMad
сообщение Feb 13 2016, 15:22
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 262
Регистрация: 18-02-05
Из: SPb
Пользователь №: 2 743



Разобрался. Надо сбрасывать флаг прерывания перед запуском.
Был уверен, что он по умолчанию сброшен.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.0134 секунд с 7
ELECTRONIX ©2004-2016