Skip to main content
Harryzhangpro
Associate
May 20, 2021 12:49 PM UTC
Solved

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

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.
waclawek.jan
waclawek.janBest answer
Super User
May 20, 2021 8:31 PM UTC

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

2 replies

waclawek.jan
waclawek.janBest answer
Super User
May 20, 2021 8:31 PM UTC

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
Jun 12, 2021 10:50 AM UTC

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);