目录
概述
1 硬件
1.1 硬件实物介绍
1.2 nucleo-f103rb
1.3 软件版本
2 软件实现
2.1 STM32Cube配置参数
2.2 项目代码
3 功能代码实现
3.1 ADC功能函数
3.2 函数调用
4 测试
4.1 DMA配置data width:byte
4.2 DMA配置data width:Half word
4.3 DMA配置data width: word
源代码下载地址:
STM32F103RB多通道ADC转换功能实现(DMA)资源-CSDN文库
概述
本文主要介绍使用STM32F103RB实现多通道数据转换的功能,采用DMA方式,每个模拟通道对应一个DMA channel,实现高速的数据模数转换功能。还验证了配置DMA的数据宽度对输出数据的影响。
1 硬件
1.1 硬件实物介绍
STM32 Nucleo-64板基于MB1136参考板(NUCLEO-F030R8,Nucleo-f070rb, nucleo-f072rb, nucleo-f091rc, nucleo-f103rb,Nucleo-f302r8, nucleo-f303re, nucleo-f334r8, nucleo-f401re
Nucleo-f410rb, nucleo-f411re, nucleo-f446re, nucleo - 1010rb,Nucleo-l053r8, nucleo-l073rz, nucleo-l152re, nucleo-l452re,NUCLEO-L476RG)为用户提供了一种经济实惠且灵活的方式来尝试新概念并使用LQFP64封装中的STM32微控制器构建原型,选择从性能、功耗和特性的各种组合中。的ARDUINO®Uno V3连接支持和ST morpho头提供了一个简单的扩展了Nucleo开放开发平台的功能选择专门的盾牌。STM32 Nucleo板不需要任何单独的探头因为它们集成了ST-LINK/V2-1调试器和编程器。STM32 Nucleo板提供全面的免费软件库和示例STM32Cube MCU封装,以及直接访问Arm®Mbed™在线资源在http://mbed.org/上。
1.2 nucleo-f103rb
笔者选择CN8接口,实现多通道的ADC转换功能。其接口定义如下:
1.3 软件版本
软硬件信息 | 版本信息 |
---|---|
STM32 MCU | STM32F103RB |
Keil | MDK ARM 5.38 |
调试工具:st-link | ST-LINK/V2-1 |
STM32CubeProgrammer | v2.16.0 |
2 软件实现
2.1 STM32Cube配置参数
1)ADC端口配置,选择ADC1,同时使能DMA功能
ADC chanel 对应的端口
2)使能ADC的DMA通道中断
3)DMA通道数选择,总共使能6个channel,那么DMA数据buff需要配置6个长度的数组
4) 采样数据模式选择
2.2 项目代码
完成参数配置之后,使用GENERATE PROJECT 生成项目,打开项目文件如下:
3 功能代码实现
3.1 ADC功能函数
STM32Cube生成的代码已经完成ADC和DMA的初始化工作,要启动ADC的数据转换功能,只需调用启动函数即可。本文主要介绍使用DMA的方式启动ADC数据转换该功能。
笔者专门编写一个函数用于启动ADC功能
代码第24行: 定义ADC的通道总数
代码第29行: 启动ADC转换标定功能
代码第30行: 启动DAM方式数据转换功能。
源代码函数如下:
/* USER CODE BEGIN 0 */
#define TOTAL_CHANNEL 6
static uint16_t adcDMAValue[TOTAL_CHANNEL];
void ADC_ConvInit( ADC_HandleTypeDef* hadc )
{
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_DMA(hadc, (uint32_t*)adcDMAValue, TOTAL_CHANNEL);
}
/* USER CODE END 0 */
3.2 函数调用
在MX_ADC1_Init函数,已经完成了ADC模块的初始化,如果打算启动ADC功能,只需在MX_ADC1_Init的尾部调用ADC_ConvInit函数实现ADC的启动。
4 测试
4.1 DMA配置data width:byte
在STM32Cube中配置如下参数
DMA通道buff配置如下:
生成代码下载到板卡中运行
DMA采集数据buff数据字节数
#define TOTAL_CHANNEL 6
static uint16_t adcDMAValue[TOTAL_CHANNEL];
根据仿真数据可知:
adcDMAValue[0]:
ch0: (byte)adcDMAValue[0],
ch1: (byte)(adcDMAValue[0]>>8),
adcDMAValue[1]:
ch2: (byte)adcDMAValue[1],
ch3: (byte)(adcDMAValue[1]>>8),
adcDMAValue[2]:
ch4: (byte)adcDMAValue[2],
ch5: (byte)(adcDMAValue[2]>>8),
仿真数据值:
4.2 DMA配置data width:Half word
在STM32Cube中配置如下参数
DMA通道buff配置如下:
生成代码下载到板卡中运行
因为每个通道采样的数据为两个字节,此时:
adcDMAValue[0]: ch-0
adcDMAValue[1]: ch-1
adcDMAValue[2]: ch-2
adcDMAValue[3]: ch-3
adcDMAValue[4]: ch-4
adcDMAValue[5]: ch-5
4.3 DMA配置data width: word
在STM32Cube中配置如下参数
DMA通道buff配置如下:
生成代码下载到板卡中运行
因为每个通道采样的数据为两个字节,此时:
(adcDMAValue[1]<<8)| adcDMAValue[0] : ch-0
(adcDMAValue[3]<<8)| adcDMAValue[2] : ch-1
(adcDMAValue[5]<<8)| adcDMAValue[4] : ch-2
(adcDMAValue[7]<<8)| adcDMAValue[6] : ch-3
(adcDMAValue[9]<<8)| adcDMAValue[8] : ch-4
(adcDMAValue[11]<<8)| adcDMAValue[10] : ch-5