【STM32 cubemx 多路ADC+DMA】

一、cubemx基本配置
        

 

 

 

 二、启动ADC和DMA

 

 

 

 

 

 三、串口监视


 四、代码

 

 

 //定义一个DMA接收数组
uint32_t ADC_Value[120]={0};
 
 
 
//ADC_DMA 启动
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 120);
 
 
//均值滤波
uint32_t ad1=0, ad2=0, ad3=0, ad4=0, ad5=0, ad6=0;
int i=0;
for (i = 0, ad1 = ad2 = ad3 = ad4 = ad5 = ad6 = 0; i < 120;)
        {
                ad1 += ADC_Value[i++];
                ad2 += ADC_Value[i++];
                ad3 += ADC_Value[i++];
                ad4 += ADC_Value[i++];
                ad5 += ADC_Value[i++];
                ad6 += ADC_Value[i++];
        }
        ad1=ad1/20;
        ad2=ad2/20;
        ad3=ad3/20;
        ad4=ad4/20;
        ad5=ad5/20;
        ad6=ad6/20;
 
//重写Printf
#include "stdio.h"
int fputc(int ch,FILE *f)
{
    uint8_t temp[1]={ch};
    HAL_UART_Transmit(&huart1,temp,1,2);       
}
//上位机接收
printf("1=%4d,2=%4d,3=%4d,4=%4d,5=%4d,6=%4d\r\n",ad1,ad2,ad3,ad4,ad5,ad6);

//定义一个DMA接收数组
uint32_t ADC_Value[120]={0};
 
 
 
//ADC_DMA 启动
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 120);
 
 
//均值滤波
uint32_t ad1=0, ad2=0, ad3=0, ad4=0, ad5=0, ad6=0;
int i=0;
for (i = 0, ad1 = ad2 = ad3 = ad4 = ad5 = ad6 = 0; i < 120;)
        {
                ad1 += ADC_Value[i++];
                ad2 += ADC_Value[i++];
                ad3 += ADC_Value[i++];
                ad4 += ADC_Value[i++];
                ad5 += ADC_Value[i++];
                ad6 += ADC_Value[i++];
        }
        ad1=ad1/20;
        ad2=ad2/20;
        ad3=ad3/20;
        ad4=ad4/20;
        ad5=ad5/20;
        ad6=ad6/20;
 
//重写Printf
#include "stdio.h"
int fputc(int ch,FILE *f)
{
    uint8_t temp[1]={ch};
    HAL_UART_Transmit(&huart1,temp,1,2);       
}
//上位机接收
printf("1=%4d,2=%4d,3=%4d,4=%4d,5=%4d,6=%4d\r\n",ad1,ad2,ad3,ad4,ad5,ad6);

 定义了6路adc通道,从dma中获取的值会依次存入入数组中

由于定义的数组 ADC_Value大小为120,

第一个ADC通道Channel0的值存入ADC_Value[0],

Channel1的值存入ADC_Value[1],

Channel2的值存入ADC_Value[2],

Channel3的值存入ADC_Value[3],

Channel4的值存入ADC_Value[4],

Channel5的值存入ADC_Value[5],

此时完成了一次所有通道的接收,由于启动了DMA循环模式,adc通道将继续接收数据

Channel0的值存入ADC_Value[6],

Channel1的值存入ADC_Value[7],

Channel2的值存入ADC_Value[8],

Channel3的值存入ADC_Value[9],

Channel4的值存入ADC_Value[10],

Channel5的值存入ADC_Value[11],

以此类推,直到Channel5的值存入ADC_Value[119],又重新回到Channel0的值存入ADC_Value[0],..

一直循环下去 

如果不需要滤波,直接将ADC_Value的大小定义为

                        uint32_t  ADC_Value[6]={0};

然后启动ADC DMA

                        HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 6);

需要数据时直接读取ADC_Value[0] 到ADC_Value[5]的值

ADC_Value[0] 对应第一个通道采集的值

 五、结果


采用六个电位器作为ADC的输入,选择电位器可以明显看到每路adc的值发生变化

 


————————————————

原文链接:https://blog.csdn.net/weixin_48420974/article/details/126214870

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32CubeMX是一个用于配置STM32微控制器的图形化工具。它可以帮助我们快速配置SD卡、DMA和FATFS文件系统。 在开始配置之前,我们需要先连接SD卡到STM32微控制器,并确保正确配置了SD卡的GPIO引脚,使其与STM32的SDIO接口连接。 首先,打开STM32CubeMX并选择相应的微控制器型号。然后,点击"Pinout & Configuration"选项卡,在左侧的"Peripherals"下选择SDIO,然后在右侧选择SDIO的引脚和模式。确保使能SDIO的时钟和数据信号引脚,并选择正确的模式,如4线模式。 接下来,点击"Middleware"选项卡,在右侧的"STemWin"下选择"FATFS"。然后,在"FATFs 1"下选择"SDIO"作为SD卡的字节访问连接器,并在"Volume1 size"中指定SD卡的容量。 再次点击"Middleware"选项卡,在右侧的"FATFS"下选择"DMA",以启用DMA传输。在"Mode"中选择"POLLING" 或"DMA"作为传输模式,并选择一个可用的DMA通道,例如DMA2-Stream3。 最后,点击"Project"选项卡,在右侧的"Project Name"下输入项目名称,然后点击"Save"按钮保存配置。 现在,我们已经完成了STM32CubeMX的配置。生成代码并导入到我们的IDE中,例如Keil或者STM32CubeIDE。 在代码中,我们需要初始化SDIO和DMA,并创建FATFS实例,在主循环中使用FATFS函数完成SD卡的读写操作。我们可以使用FATFS提供的函数来打开、写入、读取和关闭文件,以及创建、删除和重命名目录。 这就是使用STM32CubeMX配置SD卡、DMA和FATFS的步骤。通过使用STM32CubeMX,我们可以快速而方便地配置SD卡、DMA和FATFS,从而实现SD卡的读写操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值