结论
STM32CUBEIDE自动生成的初始化代码中,DMA初始化需要放在ADC初始化之前,否则会出现如题问题
以下为原工程有问题的顺序
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_GPIO_Init();
MX_ADC_Init();
MX_I2C1_Init();
MX_I2C2_Init();
MX_TIM4_Init();
MX_DMA_Init(); // DMA初始化若放在ADC初始化后,后续启动ADC_DMA,ADC只能转换1次,无法连续
MX_USART3_UART_Init();
MX_USART1_UART_Init();
ADC初始化配置
/**
* @brief ADC Initialization Function
* @param None
* @retval None
*/
static void MX_ADC_Init(void)
{
/* USER CODE BEGIN ADC_Init 0 */
/* USER CODE END ADC_Init 0 */
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC_Init 1 */
/* USER CODE END ADC_Init 1 */
/** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
*/
hadc.Instance = ADC1;
hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV;
hadc.Init.LowPowerAutoWait = ADC_AUTOWAIT_DISABLE;
hadc.Init.LowPowerAutoPowerOff = ADC_AUTOPOWEROFF_DISABLE;
hadc.Init.ChannelsBank = ADC_CHANNELS_BANK_A;
hadc.Init.ContinuousConvMode = ENABLE;
hadc.Init.NbrOfConversion = 20;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc.Init.DMAContinuousRequests = ENABLE;
if (HAL_ADC_Init(&hadc) != HAL_OK)
{
Error_Handler();
}
···
}
问题现象
调试过程中发现,执行HAL_ADC_Start_DMA后HAL_ADC_ConvCpltCallback只会执行一次,且数据也只有第一个有值,其他为0
问题排查
排查了
- 配置是否错误
- 是否存在其他中断频发
- 是否库调用流程不正确
最后实在没辙了,只能从0开始,重新创建工程,仅保留ADC+DMA和串口,由于开启的模块较少,CUBE生成的代码顺序又对了,再对比代码才发现原因
以下为正确顺序,DMA初始化在ADC前
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC_Init();
MX_USART1_UART_Init();
博客指出在STM32CUBEIDE自动生成的初始化代码中,DMA初始化需放在ADC初始化之前,否则会出现问题。调试时发现执行HAL_ADC_ConvCpltCallback仅一次,且只有首个数据有值。经排查,最后重新创建工程对比代码找出原因。
1万+

被折叠的 条评论
为什么被折叠?



