cancel
Showing results for 
Search instead for 
Did you mean: 

STM32CubeMx: how to change the 1ms period used for system timer interrupt

Katzenberger.Michael
Associate III
Posted on March 25, 2016 at 20:14

Hi all !

I try to configure my software using STM32CubeMx for a Nucleo-F411RE board. For my own (very lightweight OS) I need a cyclic interrupt of 10ms. But currently I'm not able to find any setting options to choose a period for the system timer. The generated code uses always 1ms which seems to be a default value from the HAL. Implementation using SysTick as timebase source:

/** System Clock Configuration
*/
void
SystemClock_Config(
void
)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
__PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

Implementation using Tim11 as timebase source:

/**
* @brief This function configures the TIM11 as a time base source. 
* The time source is configured to have 1ms time base with a dedicated 
* Tick interrupt priority. 
* @note This function is called automatically at the beginning of program after
* reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). 
* @param TickPriority: Tick interrupt priorty.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
RCC_ClkInitTypeDef clkconfig;
uint32_t uwTimclock = 0;
uint32_t uwPrescalerValue = 0;
uint32_t pFLatency;
/*Configure the TIM11 IRQ priority */
HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM11_IRQn, TickPriority ,0); 
/* Enable the TIM11 global Interrupt */
HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM11_IRQn); 
/* Enable TIM11 clock */
__HAL_RCC_TIM11_CLK_ENABLE();
/* Get clock configuration */
HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
/* Compute TIM11 clock */
uwTimclock = HAL_RCC_GetPCLK2Freq();
/* Compute the prescaler value to have TIM11 counter clock equal to 1MHz */
uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000) - 1);
/* Initialize TIM11 */
htimInstance = TIM11;
/* Initialize TIMx peripheral as follow:
+ Period = [(TIM11CLK/1000) - 1]. to have a (1/1000) s time base.
+ Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
+ ClockDivision = 0
+ Counter direction = Up
*/
htimInit.Period = (1000000 / 1000) - 1;
htimInit.Prescaler = uwPrescalerValue;
htimInit.ClockDivision = 0;
htimInit.CounterMode = TIM_COUNTERMODE_UP;
if
(HAL_TIM_Base_Init(&htim11) == HAL_OK)
{
/* Start the TIM time Base generation in interrupt mode */
return
HAL_TIM_Base_Start_IT(&htim11);
}
/* Return function status */
return
HAL_ERROR;
}

I'm new to ARM and STM32CubeMx so any help is appreciated - thanks ! Best regards, Michael. #stm32cube-systim-1ms-period
0 REPLIES 0