一、介绍

蓝桥杯嵌入式开发板使用的是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传输配置相关推荐

  1. 蓝桥杯嵌入式AD采样解析

    文章目录 前言 一.什么是AD采样 二.原理图查看及cubeMX配置 三.代码解析 总结 前言 本文将带大家学习AD采样. 一.什么是AD采样 原理部分这里就不多介绍了,给大家推荐一篇文章大家自己去了 ...

  2. STM32F4时钟触发ADC双通道采样DMA传输进行FFT+测频率+采样频率可变+显示波形(详细解读)...

    此文转载自:https://blog.csdn.net/qq_45620831/article/details/110819495 写在前面的婆婆妈妈的话 本人大三,参加过数次电赛,来CSDN好久, ...

  3. 蓝桥杯嵌入式模板的构建——STM32G431RB(LCD和ADC采集电压)

    基于LED和按键的模板来写的 下载工程的链接 蓝桥杯嵌入式模板的构建--STM32G431RB(LED和按键的配置)-其它文档类资源-CSDN下载这个模板亲测有效只写了按键三和按键4对LED进行点灯和 ...

  4. 【STM32G431RBTx】备战蓝桥杯嵌入式→基本模块→ADC

    文章目录 前言 ADC 1.原理图以及配置元素 2.CubeMx的配置步骤 3.生成工程 4.测试代码 5.演示效果 总结 前言 G4板载了四个电位器,其中左边两个是电压采集用的,本篇文章将讲述如何单 ...

  5. STM32F4时钟触发ADC双通道采样DMA传输进行FFT+测频率+采样频率可变+显示波形(详细解读)

    写在前面的婆婆妈妈的话(代码链接在最下方) 本人大三,参加过数次电赛,来CSDN好久, 每次都是在绝望中从这里找到了希望,每次都仿佛一个即将被怪兽打翻的小船突然被危险流浪者救起来.是众多前辈的智慧,让 ...

  6. 突击蓝桥杯嵌入式(四)——滴答定时器、按键的三行代码消抖、LCD与ADC

    突击蓝桥杯嵌入式(四)--滴答定时器.按键的三行代码消抖.LCD与ADC 1.滴答定时器定时运行 我们利用滴答定时器,让LED每隔1s闪烁一次 //首先我们定义一个变量 __IO uint32_t u ...

  7. 蓝桥杯嵌入式(STM32G431RBT6)入门第四天——系统嘀嗒定时器(SysTick)|CSDN创作打卡

    和往常一样,先建立SysTick定时器练习文件夹,并在里面建立SysTick_test和SysTick两个子文件夹. STM32的通用定时器是通过一个可编程预分频器(Prescaler)驱动的16位自 ...

  8. 蓝桥杯嵌入式CT117E硬件开发平台经验分享11 | 第九届蓝桥杯国赛题

    基于 基于 CT117E 嵌入式竞赛板 嵌入式竞赛板 的 "电子秤"程序设计与调试 赛题硬件框图 由于赛题细节多,赛题PDF要求书放入了附件,链接后续加入.本文主要讲述本届题目的困 ...

  9. 蓝桥杯嵌入式设计与开发历届客观题答案

    该页面由pdf转换而来,阅读效果不佳,你可以在这里下载pdf原件:https://download.csdn.net/download/dvs_dn/85085622 你也可以在百度文库免费下载该文档 ...

最新文章

  1. Python一行代码实现快速排序
  2. 《漫画算法2》源码整理-3 二分查找 跳跃表
  3. android 多点触控缩放,Android多点触控(图片的缩放Demo)
  4. Android开发(五)——计时器
  5. 为@RequestMapping标注的方法扩展其传入参数
  6. 开源 Asp.net mvc 用户中心(nUserCenter) 产品机会评估
  7. 阶段3 3.SpringMVC·_06.异常处理及拦截器_2 SpringMVC异常处理之演示程序异常
  8. lua table remove元素的问题
  9. quartus支持linux系统,在64位Linux下把Quartus II设置成64位的方法
  10. 学术答辩PPT模板推荐
  11. Hierarchical Prosody Modeling for Non-Autoregressive Speech Synthesis
  12. 中国石油大学(北京)-《 修井工程》第二阶段在线作业
  13. c++自动抢购_淘宝 2020双十一最新版 全自动做任务软件 超级星秀猫 来了!上车~...
  14. 在x86下交叉编译mips程序
  15. 怎么网站服务器退出全屏,退出Hyper V客户端的全屏模式
  16. 北航数理统计大作业_数学146分上岸复旦大学大数据学院统计学,备考经验分享!...
  17. Jmeter 压测和AB压测的比较
  18. 羊车门问题的python代码_作业:羊车门问题
  19. go get golang.org/x/tools 失败解决
  20. 中英文论文写作指导第二部分(前言)

热门文章

  1. scrollTo,scrollBy,smoothScrollBy,smoothScrollTo
  2. java 随机昵称_Java随机产生中文昵称
  3. 阶的估计I 无穷小量与强函数1 基本概念 无穷小量与强函数的运算法则
  4. react Could not freeze
  5. 【演讲篇】——人生就像一场直播
  6. 《杜拉拉升职记》中的管理学要素
  7. 史上最全的Java判断是否为中文字符
  8. 从神经元到CNN、RNN、GAN…基础神经网络模型原理概述
  9. 使用dd命令制作U盘启动盘
  10. 我的ITEYE搬家到csdn