Skip to main content
Harryzhangpro
Associate
May 20, 2021
Solved

TIM interrupt not firing after circular adc-dma started on STM32F030K6T6

  • May 20, 2021
  • 1 reply
  • 962 views

Hi!I am using STM32F030K6T6 as my bldc controller.i set up my adc as below:

/* ADC init function */
void MX_ADC_Init(void)
{
 ADC_ChannelConfTypeDef sConfig = {0};
 
 /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
 */
 hadc.Instance = ADC1;
 hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
 hadc.Init.Resolution = ADC_RESOLUTION_12B;
 hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
 hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
 hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
 hadc.Init.LowPowerAutoWait = DISABLE;
 hadc.Init.LowPowerAutoPowerOff = DISABLE;
 hadc.Init.ContinuousConvMode = ENABLE;
 hadc.Init.DiscontinuousConvMode = DISABLE;
 hadc.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC4;
 hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
 hadc.Init.DMAContinuousRequests = ENABLE;
 hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
 if (HAL_ADC_Init(&hadc) != HAL_OK)
 {
 Error_Handler();
 }
 /** Configure for the selected ADC regular channel to be converted.
 */
 sConfig.Channel = ADC_CHANNEL_0;
 sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
 sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
 if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
 {
 Error_Handler();
 }
 /** Configure for the selected ADC regular channel to be converted.
 */
 sConfig.Channel = ADC_CHANNEL_1;
 if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
 {
 Error_Handler();
 }
 /** Configure for the selected ADC regular channel to be converted.
 */
 sConfig.Channel = ADC_CHANNEL_2;
 if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
 {
 Error_Handler();
 }
 /** Configure for the selected ADC regular channel to be converted.
 */
 sConfig.Channel = ADC_CHANNEL_3;
 if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
 {
 Error_Handler();
 }
 
}
 
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{
 
 GPIO_InitTypeDef GPIO_InitStruct = {0};
 if(adcHandle->Instance==ADC1)
 {
 /* USER CODE BEGIN ADC1_MspInit 0 */
 
 /* USER CODE END ADC1_MspInit 0 */
 /* ADC1 clock enable */
 __HAL_RCC_ADC1_CLK_ENABLE();
 
 __HAL_RCC_GPIOA_CLK_ENABLE();
 /**ADC GPIO Configuration
 PA0 ------> ADC_IN0
 PA1 ------> ADC_IN1
 PA2 ------> ADC_IN2
 PA3 ------> ADC_IN3
 */
 GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 /* ADC1 DMA Init */
 /* ADC Init */
 hdma_adc.Instance = DMA1_Channel1;
 hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
 hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
 hdma_adc.Init.MemInc = DMA_MINC_ENABLE;
 hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
 hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
 hdma_adc.Init.Mode = DMA_CIRCULAR;
 hdma_adc.Init.Priority = DMA_PRIORITY_MEDIUM;
 if (HAL_DMA_Init(&hdma_adc) != HAL_OK)
 {
 Error_Handler();
 }
 
 __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc);
 
 /* USER CODE BEGIN ADC1_MspInit 1 */
 
 /* USER CODE END ADC1_MspInit 1 */
 }
}

after that, i added these functions into main():

 HAL_TIM_Base_Start(&htim1);
 HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
 HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
 HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
 HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);
 HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);
 HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_2);
 HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_3);
 
 HAL_ADC_Start_DMA(&hadc,(uint32_t *)adc_conv_buff,4);
 
 HAL_TIM_Base_Start_IT(&htim2);

then,i can get my adc_dma data correctly in main() function.But what's confuse me,I can't get inside the HTIM2 interrupt:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
 static foc_motor *motor1 = &motor_1;
 
 if(htim->Instance == htim2.Instance){
 float dt = 1.0f / 1000.0f;
 timer_update(motor1,dt);
 }
}

any one have the same problem like this before?what should i do next?

This topic has been closed for replies.
Best answer by waclawek.jan

Read our and check the TIM2 registers to see, if it is running, if the Update interrupt is enabled in TIMx_DIER and if the UIF flag is set in SR.

Some other interrupt related hints here.

JW

1 reply

waclawek.jan
waclawek.janBest answer
Super User
May 20, 2021

Read our and check the TIM2 registers to see, if it is running, if the Update interrupt is enabled in TIMx_DIER and if the UIF flag is set in SR.

Some other interrupt related hints here.

JW

Harryzhangpro
Associate
June 12, 2021

Thank you!I found some flaw​s in my code and i fixed it already.It cant work buz i did some time-consuming job in adc-dma interrupt.and here is my code:

	HAL_TIM_Base_Start(&htim1);
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);
	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);
	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_2);
	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_3);
 
	HAL_TIM_Base_Start_IT(&htim16);
	HAL_TIM_Base_Start(&htim17);
 
	HAL_ADC_Start_DMA(&hadc, adcValue, sizeof(adcValue));
 
 	// Enalbe Timer2, for PPM input
	HAL_TIM_Base_Start_IT(&htim2); 
	HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_1); 
 	HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_2);