
一、原理图![]() 二、 CubeMX配置 Step1.打开 STM32CubeMX,点击“New Project”,选择芯片型号,STM32F103VETx。 ![]() Step2.选择时钟源,并配置时钟树。选择Crystal/Ceramic Resonator,并配置系统时钟为72M。 ![]() ![]() Step3.配置SYS,我们这里选择的是Serial Wire。(正常情况配置不配置不影响,debug可以使用。但是你不可以把这两个引脚用于其他复用功能,如果用于其他复用功能,debug就不起作用了。) ![]() Step4.串口配置(主要为了在串口调试助手显示测试的电压),因为没有用到中断和DMA所以我们就不过多讲解。 ![]() ![]() Step5.ADC的配置 ![]() ![]() Step6.因为多个通道需要使用到DMA传输到内存,否则ADC的存放转换数据的寄存器会不断覆盖上一个转换的数据。DMA模式:循环模式,重复传输,而常规模式则是传输1次。地址自增,因为ADC外设本身就只有一个寄存器所以不存在地址自增的情况,而内存是需要地址自增来存放不同通道的转换结果,如果不自增,则会覆盖上一次的结果。数据宽度:根据传输数据决定,因为此次传输的是12位的数据,所以使用半字(2个字节)就可以了。 ![]() ![]() ![]() 到这里关于ADC参数配置基本已经完成,只需要根据之前文章《STM32Cube HAL:GPIO输入/输出(一)》Step4-Step8,设置相关工程参数和生成代码。 三、添加功能代码 1、我们等会会向串口调试助手发送数据,进行实验结果的验证。 发送数据我们采用printf函数,所有需要重定向c库函数printf到串口。注意使用时需要在keil设置中勾选微库(use mircolib),同时需要添加头文件#include <stdio.h>。重定向代码如下(usart.c)
2、定义相关变量,以及使能相关ADC和处理代码(main.c)
在实验中主要注意的是函数 HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length); hadc:adc句柄 pData:buffer缓冲区指针 Length:传输的数目(以数据宽度为单位) 例: 1:5个通道,每个通道传输1个,一共传输5个 。那么Length=5; 2:1个通道,每个通道传输5个,一共传输5个。那么Length=5; 关于这个函数的理解,如果有错误的地方,欢迎指出。 关于length的说法,网上有些文章是说这个Length是和传输的数据宽度有关的,如果传输的是 word的话,那么Length,有多少通道就设置多少;如果是half word,则Length,是通道数的2倍。(暂时没理解) |
经验分享 | STM32双定时器+ADC+DMA实战案例
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
经验分享 | 基于STM32H7 UART 空闲事件及DMA传输示例
经验分享 | 关于STM32 DMA传输的两个问题释疑
经验分享 | STM32G4 UART+TIMER+DMA应用示例
经验分享 | STM32 TIMER+DMA输出PWM异常二案例
经验分享 | STM32H7 EXTI + SPI +DMA 双缓冲应用演示
经验分享 | STM32H563 UART+DMA 2D功能演示
经验分享 | 基于STM32H563 USART演示DMA链表功能
经验分享 | 基于STM32H563演示UART+DMA功能