2016-03-25 12:14 PM
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