【STM32G431RBT6】蓝桥杯嵌入式 ADC采样DMA传输配置
一、介绍
蓝桥杯嵌入式开发板使用的是STM32G431RBT6,这个G系列的mcu使用STM32cubemax配置的时候和普通的F系列不太一样。
二、原理图
同时开发板预留了两个adc采样通道,分别是PB15和PB12,如果需要adc采样的话,这里我们这里使用两种方式,一种是adc直接采样CPU处理数据,另外一种是采用ADC采样加DMA传输。
三、STM32CUBEMAX配置
时钟配置 :输入外部高速时钟为24MHZ,这里可以将主频调至170MHZ。
ADC配置 :PB15和PB12位ADC输入
3-1 ADC直接采样
将IN11通道设置为single-ended
ContinuousConvMode = DISABLE;
DMAContinuousRequests = DISABLE;
其他配置不变
3-2 ADC采样+DMA传输
将IN11通道设置为single-ended
ContinuousConvMode = ENABLE;
DMAContinuousRequests = ENABLE;
DMA中断和ADC中断;
DMA设置circular,传输设为word
四、程序代码
注意这里两种配置方式对应不同的采样模式,我的建议的选择一种即可。然后两种的程序代码也不一样。
4-1 ADC直接采样
在主函数中直接调用getADC1()和getADC2()函数就可以完全可以,就是有点浪费资源
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "stdio.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint16_t getADC1(void) //得到ADC1的值
{uint16_t adc = 0;HAL_ADC_Start(&hadc1);adc = HAL_ADC_GetValue(&hadc1);return adc;
}uint16_t getADC2(void) //得到ADC2的值
{uint16_t adc = 0;HAL_ADC_Start(&hadc2); //调要HAL_ADC_Start()函数adc = HAL_ADC_GetValue(&hadc2); //调要HAL_ADC_GetValue()函数获得adc的值return adc;
}
/* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_ADC1_Init();MX_ADC2_Init();/* USER CODE BEGIN 2 */LCD_Init();LCD_Clear(White);LCD_SetBackColor(White);LCD_SetTextColor(Black);LCD_Clear(White);LCD_DisplayStringLine(Line1 ,(unsigned char *)" hello dma. ");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){ //3.3为总的电压值 2的12次方等于4096 用于对电压值分成一份sprintf((char*)Lcd_Disp_String, " RES38_vol: %6.3f ",getADC1()*(3.3/4096)); LCD_DisplayStringLine(Line6, Lcd_Disp_String);sprintf((char*)Lcd_Disp_String, " RES37_vol: %6.3f ",getADC2()*(3.3/4096));LCD_DisplayStringLine(Line3, Lcd_Disp_String);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
4-2 ADC采样+DMA配置
这里使用DMA的时候需要有一段连续的代码空间来存放外设来到的数据;这里为什么是uint32_t呢,是因为我们直接配置dma的时候选择的word;
uint32_t ADC2_Value[30];
uint32_t ADC1_Value[30]
还需要将起始地址通过start函数赋值给dma。
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC1_Value,30);
HAL_ADC_Start_DMA(&hadc2,(uint32_t*)&ADC2_Value,30);
此外,由于dma传输的数据是连续传输的内存中的,使用时候还需要解析。
ADC_2=0;
for(uint8_t i=0;i<30;i++)
{ADC_2+=ADC2_Value[i++];
}
ADC_1=0;
for(uint8_t i=0;i<30;i++)
{ADC_1+=ADC1_Value[i++];
}
sprintf((char*)Lcd_Disp_String, " dma: %1.4f ",(float)ADC_2/30*3.3/4096);
LCD_DisplayStringLine(Line2, Lcd_Disp_String);sprintf((char*)Lcd_Disp_String, " dma1: %1.4f ",(float)ADC_1/30*3.3/4096);
LCD_DisplayStringLine(Line4, Lcd_Disp_String);
完整代码如下:
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "stdio.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */uint32_t ADC_2;
uint32_t ADC2_Value[30];
uint32_t ADC_1;
uint32_t ADC1_Value[30];
unsigned char Lcd_Disp_String[21];
/* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_ADC1_Init();MX_DMA_Init();MX_ADC2_Init();/* USER CODE BEGIN 2 */LCD_Init();LCD_Clear(White);LCD_SetBackColor(White);LCD_SetTextColor(Black);LCD_Clear(White);LCD_DisplayStringLine(Line1 ,(unsigned char *)" hello dma. ");HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC1_Value,30);HAL_ADC_Start_DMA(&hadc2,(uint32_t*)&ADC2_Value,30);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){ADC_2=0; for(uint8_t i=0;i<30;i++){ADC_2+=ADC2_Value[i++];}ADC_1=0; for(uint8_t i=0;i<30;i++){ADC_1+=ADC1_Value[i++];} sprintf((char*)Lcd_Disp_String, " dma: %1.4f ",(float)ADC_2/30*3.3/4096);LCD_DisplayStringLine(Line2, Lcd_Disp_String);sprintf((char*)Lcd_Disp_String, " dma1: %1.4f ",(float)ADC_1/15*3.3/4096);LCD_DisplayStringLine(Line4, Lcd_Disp_String);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
五、实验现象
最后在使用的时候还是有一些问题,这里我上传工程自行取用
链接: https://pan.baidu.com/s/10x6bhjThMecN55D8VB-_9Q .
提取码:cvyq
【STM32G431RBT6】蓝桥杯嵌入式 ADC采样DMA传输配置相关推荐
- 蓝桥杯嵌入式AD采样解析
文章目录 前言 一.什么是AD采样 二.原理图查看及cubeMX配置 三.代码解析 总结 前言 本文将带大家学习AD采样. 一.什么是AD采样 原理部分这里就不多介绍了,给大家推荐一篇文章大家自己去了 ...
- STM32F4时钟触发ADC双通道采样DMA传输进行FFT+测频率+采样频率可变+显示波形(详细解读)...
此文转载自:https://blog.csdn.net/qq_45620831/article/details/110819495 写在前面的婆婆妈妈的话 本人大三,参加过数次电赛,来CSDN好久, ...
- 蓝桥杯嵌入式模板的构建——STM32G431RB(LCD和ADC采集电压)
基于LED和按键的模板来写的 下载工程的链接 蓝桥杯嵌入式模板的构建--STM32G431RB(LED和按键的配置)-其它文档类资源-CSDN下载这个模板亲测有效只写了按键三和按键4对LED进行点灯和 ...
- 【STM32G431RBTx】备战蓝桥杯嵌入式→基本模块→ADC
文章目录 前言 ADC 1.原理图以及配置元素 2.CubeMx的配置步骤 3.生成工程 4.测试代码 5.演示效果 总结 前言 G4板载了四个电位器,其中左边两个是电压采集用的,本篇文章将讲述如何单 ...
- STM32F4时钟触发ADC双通道采样DMA传输进行FFT+测频率+采样频率可变+显示波形(详细解读)
写在前面的婆婆妈妈的话(代码链接在最下方) 本人大三,参加过数次电赛,来CSDN好久, 每次都是在绝望中从这里找到了希望,每次都仿佛一个即将被怪兽打翻的小船突然被危险流浪者救起来.是众多前辈的智慧,让 ...
- 突击蓝桥杯嵌入式(四)——滴答定时器、按键的三行代码消抖、LCD与ADC
突击蓝桥杯嵌入式(四)--滴答定时器.按键的三行代码消抖.LCD与ADC 1.滴答定时器定时运行 我们利用滴答定时器,让LED每隔1s闪烁一次 //首先我们定义一个变量 __IO uint32_t u ...
- 蓝桥杯嵌入式(STM32G431RBT6)入门第四天——系统嘀嗒定时器(SysTick)|CSDN创作打卡
和往常一样,先建立SysTick定时器练习文件夹,并在里面建立SysTick_test和SysTick两个子文件夹. STM32的通用定时器是通过一个可编程预分频器(Prescaler)驱动的16位自 ...
- 蓝桥杯嵌入式CT117E硬件开发平台经验分享11 | 第九届蓝桥杯国赛题
基于 基于 CT117E 嵌入式竞赛板 嵌入式竞赛板 的 "电子秤"程序设计与调试 赛题硬件框图 由于赛题细节多,赛题PDF要求书放入了附件,链接后续加入.本文主要讲述本届题目的困 ...
- 蓝桥杯嵌入式设计与开发历届客观题答案
该页面由pdf转换而来,阅读效果不佳,你可以在这里下载pdf原件:https://download.csdn.net/download/dvs_dn/85085622 你也可以在百度文库免费下载该文档 ...
最新文章
- Python一行代码实现快速排序
- 《漫画算法2》源码整理-3 二分查找 跳跃表
- android 多点触控缩放,Android多点触控(图片的缩放Demo)
- Android开发(五)——计时器
- 为@RequestMapping标注的方法扩展其传入参数
- 开源 Asp.net mvc 用户中心(nUserCenter) 产品机会评估
- 阶段3 3.SpringMVC·_06.异常处理及拦截器_2 SpringMVC异常处理之演示程序异常
- lua table remove元素的问题
- quartus支持linux系统,在64位Linux下把Quartus II设置成64位的方法
- 学术答辩PPT模板推荐
- Hierarchical Prosody Modeling for Non-Autoregressive Speech Synthesis
- 中国石油大学(北京)-《 修井工程》第二阶段在线作业
- c++自动抢购_淘宝 2020双十一最新版 全自动做任务软件 超级星秀猫 来了!上车~...
- 在x86下交叉编译mips程序
- 怎么网站服务器退出全屏,退出Hyper V客户端的全屏模式
- 北航数理统计大作业_数学146分上岸复旦大学大数据学院统计学,备考经验分享!...
- Jmeter 压测和AB压测的比较
- 羊车门问题的python代码_作业:羊车门问题
- go get golang.org/x/tools 失败解决
- 中英文论文写作指导第二部分(前言)