STM32H743VIT6 ADC DMA 读取数据
目的:使用DMA方式,连续读取4个ADC通道数据,从串口发送到上位机。
工作环境:STM32CubeIDE1.7.0, H743VIT6芯片。
配置操作步骤如下:
电阻的测试结果:
外接可调
关键代码,指定存储空间的位置。
#define ADC_CONVERTED_DATA_BUFFER_SIZE ((uint32_t) 200)
uint16_t ADC_DATA[ADC_CONVERTED_DATA_BUFFER_SIZE] __attribute__((section(".ARM.__at_0x24000000")));
关键代码如下:
#define ADC_CONVERTED_DATA_BUFFER_SIZE ((uint32_t) 200)
uint16_t ADC_DATA[ADC_CONVERTED_DATA_BUFFER_SIZE] __attribute__((section(".ARM.__at_0x24000000")));
void ShowADCResult(void)
{
uint32_t ad1,ad2,ad3,ad4;
uint16_t i;
for(i = 0,ad1=0,ad2=0,ad3=0,ad4=0; i < ADC_CONVERTED_DATA_BUFFER_SIZE;)
{
ad1 += ADC_DATA[i++];
ad2 += ADC_DATA[i++];
ad3 += ADC_DATA[i++];
ad4 += ADC_DATA[i++];
}
ad1 /= 50;//累加50次,�??后求均�??
ad2 /= 50;
ad3 /= 50;
ad4 /= 50;
printf("\r\n******** ADC DMA Example ********\r\n\r\n");
printf(" AD1 value = %1.3fV \r\n", ad1*3.3f/65536);//转换后的真实电压
printf(" AD2 value = %1.3fV \r\n", ad2*3.3f/65536);
printf(" AD3 value = %1.3fV \r\n", ad3*3.3f/65536);
printf(" AD4 value = %1.3fV \r\n", ad4*3.3f/65536);
}
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE BEGIN 4 */
/**
* @brief Conversion complete callback in non-blocking mode
* @param hadc: ADC handle
* @retval None
*/
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
{
/* Invalidate Data Cache to get the updated content of the SRAM on the first half of the ADC converted data buffer: 32 bytes */
SCB_InvalidateDCache_by_Addr((uint32_t *) &ADC_DATA[0], ADC_CONVERTED_DATA_BUFFER_SIZE);
}
/**
* @brief Conversion DMA half-transfer callback in non-blocking mode
* @param hadc: ADC handle
* @retval None
*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
/* Invalidate Data Cache to get the updated content of the SRAM on the second half of the ADC converted data buffer: 32 bytes */
SCB_InvalidateDCache_by_Addr((uint32_t *) &ADC_DATA[ADC_CONVERTED_DATA_BUFFER_SIZE/2], ADC_CONVERTED_DATA_BUFFER_SIZE);
}
这几天在调试ADC与DMA时,发现2个问题,这里记录以下,方便自己,也供大家参考。
1,ADC采集完成后能正确产生DMA请求,数据不对。解决的最快办法就是修改CubeIDE CORTEX_M7的RAM配置,同时用__attribute__属性修改ADC buffer到一个DMA可以访问的地址。
2,CubeIDE生成的代码中, 调整初始化顺序,先初始化DMA再初始化ADC。默认生成的代码有时候ADC先于DMA初始化,导致数据采集的数据不正常,需要手动调整一下初始化顺序。