[HAL库]STM32 ADC功能和DMA读数据的方法

news2024/11/25 4:37:44

这篇博客记录下 STM32F103R8T6 是怎么开ADC、用DMA搬数据的方法。方便日后使用的时候查资料。

DMA其实就是个搬运工,专门负责搬数据,没有DMA之前,搬数据是由MCU核心来负责,虽说都能完成搬数据的动作,但是MCU干这件事浪费资源且效率低,所以有DMA的场合尽量使用DMA来负责搬数据,需要读数据的时候,可以直接去数组里取就行了。

从建工程开始,下面是各步骤:

第一步–选择时钟输入:
在这里插入图片描述
第二步–设置调试模式:
在这里插入图片描述
第三步–设置ADC基础设置、打开DMA
在这里插入图片描述
在这里插入图片描述
DMA模式选择为circular,代表循环模式,读完一次ADC之后,DMA继续读,并且继续往存放结果值的数组里面搬数据。

开启了DMA之后,32CubeMx默认帮我们开启了ADC的DMA中断,就是读取到满足条件的值之后,会产生一个中断。比如我们设置了DMA读10次数值,然后中断一次,那么DMA在搬了10次数据之后就会产生一个中断,我们需要到回调函数里面做相应的处理。这个中断是可以关掉的。
在这里插入图片描述
force DMA channels interrupts 这个对勾取消掉,就可以把下面灰色的对勾取消。这样设置后,读取10次(假设我们设置了DMA读10次)值之后,也不会进入中断。

第四步–设置芯片主频
在这里插入图片描述
我选的是外部晶振,使用的是8Mhz频率的,倍频之后最大可以设置为72Mhz,那么这里就把主频开到最大,但是ADC的频率是不能太大的,32CubeMx会做一个限制,最多也就能选到12。ADC最快的时钟前面看其他博客有看到,但是现在没找到,先留个坑在这,以后知道多少了再来填。

完成了上面的设置后,基本就OK了,最后一步设置一下生成的项目文件
在这里插入图片描述
选择只包含使用到的头文件进来。
选择为外设初始化单独的.c和.h文件。

给项目命好名,然后选择生成MDK文件。生成项目,并打开项目。

主函数里面添加这几句调用函数,把ADC功能开起来

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2022 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
typedef   unsigned char   u8;
typedef   unsigned int    u16;
/* 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 */
	float volt=0;
	u16   temp=0;
	u8 		i;
	uint16_t adcbuf[15]={0};
/* 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 */

/* 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_DMA_Init();
  MX_ADC1_Init();										//里面已经选择好了相应的通道
  /* USER CODE BEGIN 2 */
	HAL_ADCEx_Calibration_Start(&hadc1);				//开启ADC1
	HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adcbuf,10);	//开启负责ADC1的DMA通道,把存放结果的数组首地址传过来,搬运10次产生/不产生中断
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
	HAL_Delay(50);
    for(i=0;i<10;i++)
    {
        temp += adcbuf[i];
    }
    temp = temp/10;					//累加10次的结果 做平均处理
    volt = (float)temp/4096*3.24;	//处理过后的值 计算输入电压是多少
    temp = 0;
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

输入值跟计算出来的理论值:本个项目是输入2.692V,通过理论计算出来的volt=2.68多,差了0.01V不到。

这次是使用了比较简单的ADC功能,还有很多高级功能,比如注入转换这类的高级功能还没时间细细研究。先跳过其他复杂功能继续往下学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.从一次提交中思考代码性能优化和stream的使用

前言 其实由来很简单&#xff0c;我们用了一个第三方的开源平台&#xff0c;这个平台基于 ruoyi 3.8.1 开发&#xff0c;我想后续同步到ruoyi的最新版 今天看的是 一个字典查询的commit&#xff0c;我们下来看下这次提交是如何优化的 分析 开门见山&#xff0c;我们看下代码…

PowerTCP FTP for .NET对.NET 7的支持

PowerTCP FTP for.NET是一个高级FTP和FTPS类库&#xff0c;具有易于使用的接口。它具有泛型、IPv6、双堆栈套接字、并发会话mX509证书&#xff0c;并包括完整的SSL和TLS集成。 用于.NET功能的PowerTCP FTP 流接口支持在没有文件访问的情况下创建或检查内存中的数据。 可序列…

过年不再被逼相亲——我用python给亲戚展示2022的相亲数据

人生苦短 我用Python 这不是快过年了吗&#xff1f; 又到了一年一度的亲戚大考验环节… 没对象的他们会问你&#xff0c;找对象了吗&#xff1f; 你要是学计算机专业的&#xff0c;他们会问你&#xff0c;会修电脑吗&#xff1f; 出去学了点啥他们也会要求“才艺展示一下 …

少儿Python每日一题(2):整数的位数

原题解答 本次的题目如下所示&#xff08;原题出处&#xff1a;蓝桥杯&#xff09;&#xff1a; 【编程实现】 输入一个正整数&#xff0c;输出这个正整数是一个几位数。 输入描述&#xff1a;输入一个正整数 输出描述&#xff1a;输出这个正整数是一个几位数 【样例输入】 12…

FineReport开源报表软件- 数据库表字段控制Tab块隐藏

1. 概述 1.1 预期效果 通过数据库表中设置的字段值&#xff0c;控制决策报表的每个 Tab 块是否显示&#xff0c;如下图所示&#xff1a; 数据库表字段&#xff1a;SITUATION 字段的值控制 Tab 是否显示。 效果展示&#xff1a;一共有 4 个 Tab 块&#xff1a;春、夏、秋、冬&…

Verilog HDL 硬件描述语言基础

HDL 硬件描述语言&#xff08;Hardware Description Lagnuage&#xff0c;HDL&#xff09;通过描述硬件的实现方法&#xff0c;来 产生与之对应的真实的硬件电路&#xff0c;最终实现所设计的预期功能。 Verilog HDL 和 C 语言的比较 C 语言所描述的代码功能在执行时都是一行…

K8s Liveness/Readiness/Startup 探针机制

官方参考文档 目录前言一、默认健康检测1.1 restartPolicy1.2 测试案例二、Liveness三、Readiness四、Startup前言 玩过 Docker Swarm 的应该都知道&#xff0c;有一种功能叫自愈功能&#xff0c;当集群检测到节点或服务故障时回进行自动故障转移&#xff0c;从而保障业务的可…

Python循环语句条件控制语句

一、while循环 1、条件为true&#xff0c;执行循环体&#xff1b;条件为false&#xff0c;退出循环体&#xff1b; while 判断条件: 执行语句 2、单纯的while语句 3、配合if条件句使用 4、配合else使用 二、for循环 即可迭代的对象&#xff1b; 如何判断对象是否可迭代&…

python之tkinter学习

python图形化界面导论为窗口命名&#xff08;root.wm_title("")&#xff09;label类&#xff08;仅用来显示信息&#xff09;仅有一个标签多标签按钮command绑定事件bind绑定事件为button设置属性pack的布局grid布局事件及其绑定bind函数中的事件类型解绑输入框菜单子…

SEO 基础知识遇上圣诞节

*2022年圣诞节到来啦,很高兴这次我们又能一起度过~ SEO 基础知识 文章目录 SEO 基础知识1、SEO是什么2、SEO工作内容3、网站排名的流程数据4、认识搜索引擎爬虫4.1 什么是爬虫4.2 模拟普通用户5、网络爬虫的管理规则6、用数据快速提升网络权重7、其他工具1、SEO是什么 SEO 即…

【Javassist】快速入门系列08 当检测到对象(不包括数组)创建时用代码块替换

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 07 当检测到字段被访问时使用语…

Docker Desktop 4.15 正式发布,这里是新功能

Docker Desktop 4.15 正式发布&#xff0c;这里是新功能 Docker Desktop 4.15现在可用于所有平台&#xff1a;Linux、Windows 和 macOS。它附带 Docker Compose v2.13.0、Containerd v1.6.10 和 Docker Hub Tool v0.4.5 2 主要亮点 VirtioFS 正式发布新的快速搜索功能在任何…

杨校老师课堂之JDK1.8下载、安装与环境变量配置

一、安装 1. 安装引导 2. 修改安装目录(路径) 3. 选择后的路径如下&#xff1a; 4. JRE的安装【可选】 5. 成功安装 二、配置 环境变量配置 1. 进行校验 win R 打开cmd窗口 在新建cmd内&#xff0c;输入javac&#xff0c;出现下列内容&#xff0c;即表示未配置成功。目前尚…

Eclipse 插件 ERMaster安装与使用

ERMaster 是什么&#xff1f; ERMaster是制作ER图&#xff08;Entity Relationship Diagram&#xff0c;实体关系图&#xff09;的Eclipse插件。 提供了从数据库导入、Excel表定义簿制作、图片输出、DDL输出等功能。支持的数据库包括&#xff1a; MySQLOraclePostgreSQLDB2HS…

Windows内核--内核空间和用户空间(3.6)

内核喜欢抽象出句柄给用户空间 句柄, Handle, 表达处理、控制之意。内核不会直接暴露指针给用户空间&#xff0c;这样会增大内核风险。相反&#xff0c;内核抽象出Handle给用户态&#xff0c;不管是文件、进程、线程等对象&#xff0c;通过Handle可以隐藏内核细节&#xff0c;统…

C++不知算法系列之解析回溯算法中的人文哲学

1. 前言 回溯算法让我想起“退一步海阔天空”的名言。当事情的发展到了绝境或是边缘时&#xff0c;可以试着后退一步&#xff0c;换一个方向、换一种策略&#xff0c;或许会看到新的出路或生机。 回溯算法的精髓&#xff1a;无所畏惧而不固执&#xff0c;善于在变通中迂回。故…

基于PyTorch的图像数据归一化min-max normalization和zero-mean normalization操作实践对比分析

本文紧接前文&#xff1a; 《python基于不同方法实现特征工程常用的归一化技术Normalization对比分析》 前文主要是讲解对于数值型特征数据在特征工程或者是数据处理阶段往往需要用到数据尺度归一化操作&#xff0c;基于原生的对象和numpy第三方库分别实现了按列归一化计算和…

一文告诉你什么是开源表单系统

熟悉市场的人都知道&#xff0c;传统的表单存在效率低的瓶颈&#xff0c;无法满足当前很多企业的业务需求。开源表单系统也是顺应时代发展需求应运而生的产物&#xff0c;在提升企业办公效率和协作效率&#xff0c;推动企业数字化转型方面意义重大。今天这篇文章就告诉大家什么…

《计算机网络》——第一章知识点

考试题型: 选择题填空题判断题简答题计算题ISP:因特网服务提供者/因特网服务提供商&#xff0c;是一个向广大用户综合提供互联网接入业务、信息业务、和增值业务的公司&#xff0c;如中国电信、中国联动、中国移动等。分为主干ISP、地区ISP和本地ISP。 计算机网络∶利用通信线…

前端的实例化是什么?

我们在用vue框架的时候&#xff0c;总是会看到各种各样的实例化或者说实例化对象(实例) 所以这篇文章就谈一下什么是实例化和实例化对象(实例)&#xff0c;以及为什么要实例化的问题 前端的实例化是什么&#xff1f;vue的createApppinia的实例化为什么要实例化再一次回答上面这…