2019-09-25 01:31 PM
I configured a simple CubeMX project targeting the nucleo-f302r8, which I am using as a development board.
My project uses TIM1 CH1N (PB13) as a PWM output and TIM17 as the systick source. I chose TIM17 arbitrarily as I don't anticipate using it in the final project. FREERTOS/CMSIS-V1 middleware is enabled as well.
TIM1 and TIM17 share an interrupt vector. The auto-generated IRQHandler looks like this:
/**
* @brief This function handles TIM1 trigger, commutation and TIM17 interrupts.
*/
void TIM1_TRG_COM_TIM17_IRQHandler(void)
{
/* USER CODE BEGIN TIM1_TRG_COM_TIM17_IRQn 0 */
/* USER CODE END TIM1_TRG_COM_TIM17_IRQn 0 */
HAL_TIM_IRQHandler(&htim1);
HAL_TIM_IRQHandler(&htim17);
/* USER CODE BEGIN TIM1_TRG_COM_TIM17_IRQn 1 */
/* USER CODE END TIM1_TRG_COM_TIM17_IRQn 1 */
}
The initialization sequence configures TIM17 as the systick source before configuring TIM1. This causes the interrupt handler to fire before htim1 is initialized. HAL_TIM_IRQHandler does not properly handle the case that htim1.Instance is uninitialized.
Pre-configuring htim1.Instance in main.c works around this issue:
int main(void)
{
/* USER CODE BEGIN 1 */
//workaround for initialization bug when using TIM1 with TIM17 as systick timebase
htim1.Instance = TIM1;
/* USER CODE END 1 */
...