赞
踩
DMA(Direct Memory Access)——直接存储器存取
功能
在外设到存储器或者存储器到存储器提供高速的数据传输支持
特点
不占用CPU,DMA负责直接传输数据,CPU则可以处理其他事物
传输方式
DMA_Mode_Normal,正常传输模式
当一次DMA数据传输完后,停止DMA传送 。也就是只传输一次
DMA_Mode_Circular ,循环传输模式
当传输结束时,自动重置寄存器,进行下一轮的数据传输。 也就是多次传输模式
传输方向
配置ADC,两个引脚,如图,记得修改转换数量为2
然后点击DMASettings 点击 Add 为ADC采样添加通道
设置Mode为Circular,即进行多次传输
Increment Address(地址指针递增),设置数据宽度:每次传一个(Word)字节
如果我们设置的是UART_DMA,即用串口发送数据,那么我们选择数据宽度为Byte
因为串口数据发送寄存器只能存储8bit,每次发送一个字节,所以数据长度选择Byte
然后设置时钟,生成代码即可。
之前做过ADC采样,单通道采样,贴个传送门
ADC采样: https://blog.csdn.net/qq_41873311/article/details/119078754.
这里我们只是测试一下ADC_DMA能不能成功
贴一下定义的变量
/* Private variables ---------------------------------------------------------*/
uint32_t ADC_Value[100];
uint8_t i;
uint32_t ad1,ad2;
然后主函数写下如下代码
while (1) { HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&ADC_Value,100); for(i=0,ad1=0,ad2=0;i<100;){ ad1 += ADC_Value[i++]; ad2 += ADC_Value[i++]; } ad1 /=50;ad2 /=50; printf("\r\n**************ADC-DMA-TEST***********\r\n"); printf("ADC1_VALUE=%1.3fV\r\n",ad1*3.3f/4096); printf("ADC2_VALUE=%1.3fV\r\n",ad2*3.3f/4096); HAL_Delay(500); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ }
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&ADC_Value,2)
第二个参数代表我们读取ADC之后的接收数组,即uint32_t ADC_Value[100]
第三个参数代表要传输的字节长度,由于我们要对ADC采样值进行处理,所以我们这里设置成接收数组的长度:100
由于在STM32Cubemx设置的数据宽度是Word,而如果我们设置是Half Word,那么这里就要写200(两倍)
然后我们将存储的ADC采样值拿出来,处理一下再发送出来
DMA测试成功,但是由于之前ADC采样的遗留问题,导致读数一直为0
我是爱学习的诸葛铁锤,觉得有用的话点个赞哈,啾咪
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。