cancel
Showing results for 
Search instead for 
Did you mean: 

Timer Interrupts on M4 core - STM32MP157C

shane mattner
Senior

I'm trying to get TIM7 interrupts working with the STM32MP157C-DK2 kit. I've added the necessary configuration to the DTS file:

&m4_timers7 {
	pinctrl-names = "rproc_default";
	pinctrl-0 = <&timer7_pins>;
	status = "okay";
};

Do I need to enable the interrupt in the DTS file as well? I see in the M4 example DTS there is some configuration for a GPIO interrupt:

&m4_rproc {
	m4_system_resources {
		status = "okay";
 
		button {
			compatible = "rproc-srm-dev";
			interrupt-parent = <&gpioa>;
			interrupts = <14 2>;
			interrupt-names = "irq";
			status = "okay";
		};
 
		m4_led: m4_led {
			compatible = "rproc-srm-dev";
			pinctrl-names = "rproc_default", "rproc_sleep";
			pinctrl-0 = <&leds_orange_pins>;
			pinctrl-1 = <&leds_orange_sleep_pins>;
			status = "okay";
		};
	};
};

On the M4 side: I've configured TIM7 in CubeMX (prescalar: 10000, period: 100, interrupt enabled). The only configuration I see for TIM7 comes from MX_TIM7_Init():

void MX_TIM7_Init(void)
{
  TIM_MasterConfigTypeDef sMasterConfig = {0};
 
  htim7.Instance = TIM7;
  htim7.Init.Prescaler = 10000;
  htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim7.Init.Period = 100;
  htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim7) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
 
}

But I don't see anything about interrupts here. There is another function HAL_TIM_Base_MspInit() that I've tried to use without success. I tried calling this function after the init function above was called.

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
 
  if(tim_baseHandle->Instance==TIM7)
  {
  /* USER CODE BEGIN TIM7_MspInit 0 */
 
  /* USER CODE END TIM7_MspInit 0 */
    /* TIM7 clock enable */
    __HAL_RCC_TIM7_CLK_ENABLE();
 
    /* TIM7 interrupt Init */
    HAL_NVIC_SetPriority(TIM7_IRQn, 5, 0);
    HAL_NVIC_EnableIRQ(TIM7_IRQn);
  /* USER CODE BEGIN TIM7_MspInit 1 */
 
  /* USER CODE END TIM7_MspInit 1 */
  }
}

Anyone have an idea what might be going on that the interrupt isn't firing?

1 ACCEPTED SOLUTION

Accepted Solutions
PatrickF
ST Employee

Hi,

did you started the timer in your main code (e.g. HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) ) ?

Maybe missing the interrupt handler in stm32mp1xx_it.c

Please have a look to examples in STM32CubeMP1, e.g. in Projects\STM32MP157C-EV1\Examples\LPTIM\LPTIM_PulseCounter (although not TIM, but usage at HAL level is very similar).

STM32CubeMP1 is usually already loaded in your PC by CubeMX (e.g. on W10 in C:\Users\xxxx\STM32Cube\Repository) or could be loaded manually on st.com or on Github

Regards.

In order to give better visibility on the answered topics, please click on 'Accept as Solution' on the reply which solved your issue or answered your question.

View solution in original post

2 REPLIES 2
PatrickF
ST Employee

Hi,

did you started the timer in your main code (e.g. HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) ) ?

Maybe missing the interrupt handler in stm32mp1xx_it.c

Please have a look to examples in STM32CubeMP1, e.g. in Projects\STM32MP157C-EV1\Examples\LPTIM\LPTIM_PulseCounter (although not TIM, but usage at HAL level is very similar).

STM32CubeMP1 is usually already loaded in your PC by CubeMX (e.g. on W10 in C:\Users\xxxx\STM32Cube\Repository) or could be loaded manually on st.com or on Github

Regards.

In order to give better visibility on the answered topics, please click on 'Accept as Solution' on the reply which solved your issue or answered your question.

HAL_TIM_Base_Start_IT() was missing. Thanks for the reply