Перековырял примеры, возможно, какую-то мелочь упустил.
Таймер настраиваю на две секунды.
Проблема в том, что прерывание срабатывает сразу, как только делаю инициализацию.
Код
#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. Но это приводит к двойному срабатыванию прерывания. Сейчас получается так, что при инициализации срабатывает один раз прерывание, потом все идет, как положено.