STM32H743VIT6 ADC DMA 读取数据

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初始化,导致数据采集的数据不正常,需要手动调整一下初始化顺序。

代码的下载链接:STM32CubeIDE_ADC_DMA_4channle-单片机文档类资源-CSDN下载 

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值