STM32 笔记 02:如何使用 CubeMX 配置 ADC 和 DMA,以使用多通道扫描的方式采集多路电压

一. 前言

  • 测试时所使用的 MCU 是:STM32F103C8TX
  • 测试时所使用的 CubeMX 版本是:6.1

二. CubeMX 配置

1 . ADC 配置

image-20210419112149325

image-20210419112208145

2. DMA 配置

image-20210419112229956

3. 时钟配置

image-20210419112254574

三. 主要代码

1. 在 .h 中定义 ADC 控制类,以及相关宏

/* code begin define */
#define ADC_1_CHANNEL_NUM 6// ADC1 电压采集通道数。
/* code end define */

/* code begin data type */
typedef struct
{
	ADC_HandleTypeDef* hadc;// adc 句柄。
	
	uint32_t dataBuf[ADC_1_CHANNEL_NUM];// 电压采样缓存区。
	
	float (*getVol)(uint8_t num);// 获取指定通道电压值。
}obj_ADC1;// ADC1 控制类。
/* code end data type */

2. 在 .c 中创建 ADC 控制类对象,并声明需要实现的方法

/* code begin variable definition */
obj_ADC1 user_ADC1;
/* code end variable definition */

/* code begin function statement */
void initUserADC1(void);
static float userADC1_getVol(uint8_t num);
/* code end function statement */

3. 在 .c 中实现具体方法

/* code begin function body */
void initUserADC1(void)
{
	user_ADC1.hadc = &hadc1;
	
	memset(user_ADC1.dataBuf, 0x00, ADC_1_CHANNEL_NUM);
	
	user_ADC1.getVol = userADC1_getVol;
	
	HAL_ADC_Start_DMA(user_ADC1.hadc, user_ADC1.dataBuf, ADC_1_CHANNEL_NUM);
}
static float userADC1_getVol(uint8_t num)
{
	return user_ADC1.dataBuf[num] * 3.3f / 4096;
}
/* code end function body */

4. 在 .h 中声明全局变量和方法

/* code begin variable statement */
extern obj_ADC1 user_ADC1;// ADC1 控制类对象。
/* code end variable statement */

/* code begin function statement */
void initUserADC1(void);// 初始化 ADC1。
/* code end function statement */

四. 功能测试

1. 测试代码

1.1 在 main 中调用初始化方法

image-20210419112359767

1.2 在 while 中输出电压值

image-20210419112409542

2. 测试效果

image-20210419112420535

五. 注意事项

  1. 在某些型号的芯片中,使用 ADC + DMA 需要屏蔽 DMA 中断,否则程序容易卡在 DMA 中断中。

image-20210419112432013

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Simple Man ZHR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值