STM32 ADC实例解析(1)-寄存器方式

embedded/2024/10/17 15:14:38/

文章目录

  • 一、寄存器列表
  • 二、示例代码
  • 三、总结
    • 优点:
    • 缺点:

在很长的一段时间里我在项目中都是使用寄存器方式

一、寄存器列表

__IO uint32_t SR;/!< ADC状态寄存器,地址偏移量:0x00 /
__IO uint32_t CR1;/
!< ADC控制寄存器1,地址偏移量:0x04 /
__IO uint32_t CR2;/
!< ADC控制寄存器2,地址偏移量:0x08 /
__IO uint32_t SMPR1;/
!< ADC采样时间寄存器1,地址偏移量:0x0C /
__IO uint32_t SMPR2;/
!< ADC采样时间寄存器2,地址偏移量:0x10 /
__IO uint32_t JOFR1;/
!< ADC注入通道数据偏移寄存器1,地址偏移:0x14 /
__IO uint32_t JOFR2;/
!< ADC注入通道数据偏移寄存器2,地址偏移:0x18 /
__IO uint32_t JOFR3;/
!< ADC注入通道数据偏移寄存器3,地址偏移:0x1C /
__IO uint32_t JOFR4;/
!< ADC注入通道数据偏移寄存器4,地址偏移:0x20 /
__IO uint32_t HTR;/
!< ADC看门狗高阈值寄存器,地址偏移量:0x24 /
__IO uint32_t LTR;/
!< ADC看门狗下门限寄存器,地址偏移量:0x28 /
__IO uint32_t SQR1;/
!< ADC常规序列寄存器1,地址偏移量:0x2C /
__IO uint32_t SQR2;/
!< ADC常规序列寄存器2,地址偏移量:0x30 /
__IO uint32_t SQR3;/
!< ADC常规序列寄存器3,地址偏移量:0x34 /
__IO uint32_t JSQR;/
!< ADC注入序列寄存器,地址偏移量:0x38
/
__IO uint32_t JDR1;/*!< ADC注入数据寄存器1,地址偏移量:0x3C /
__IO uint32_t JDR2;/
!< ADC注入数据寄存器2,地址偏移量:0x40 /
__IO uint32_t JDR3;/
!< ADC注入数据寄存器3,地址偏移量:0x44 /
__IO uint32_t JDR4;/
!< ADC注入数据寄存器4,地址偏移量:0x48 /
__IO uint32_t DR;/
!< ADC常规数据寄存器,地址偏移量:0x4C */

二、示例代码

//初始化
s32 Dev_Adc_Init(uint8_t ch)
{
GPIO_InitTypeDef GPIO_InitStruct;
/**ADC1 GPIO Configuration
PC2 ------> ADC1_IN12
PC3 ------> ADC1_IN13
/
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
RCC->APB2ENR|=1<<9; //ADC1时钟使能
RCC->APB2RSTR|=1<<9; //ADC1复位
RCC->APB2RSTR&=~(1<<9);//复位结束
RCC->CFGR&=~(3<<14); //分频因子清零
//SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
//否则将导致ADC准确度下降!
RCC->CFGR|=2<<14;
ADC1->CR1&=0XF0FFFF; //工作模式清零
ADC1->CR1|=0<<16; //独立工作模式
ADC1->CR1&=~(1<<8); //非扫描模式
ADC1->CR2&=~(1<<1); //单次转换模式
ADC1->CR2&=~(7<<17);
ADC1->CR2|=7<<17; //软件控制转换
ADC1->CR2|=1<<20; //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发
ADC1->CR2&=~(1<<11); //右对齐
ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=0<<20; //1个转换在规则序列中 也就是只转换规则序列1
//设置通道1的采样时间
ADC1->SMPR2&=~(7<<(3
ch)); //通道1采样时间清空
ADC1->SMPR2|=7<<(3*ch); //通道1 239.5周期,提高采样时间可以提高精确度
ADC1->CR2|=1<<0; //开启AD转换器
ADC1->CR2|=1<<3; //使能复位校准
while(ADC1->CR2&1<<3); //等待校准结束
//该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。
ADC1->CR2|=1<<2; //开启AD校准
while(ADC1->CR2&1<<2); //等待校准结束
}
//获得ADC1某个通道的值
//ch:通道值 0~16
//返回值:转换结果
uint32_t Get_Adc(uint8_t ch)
{
//设置转换序列
ADC1->SQR3&=0XFFFFFFE0;//规则序列1 通道ch
ADC1->SQR3|=ch;
ADC1->CR2|=1<<22; //启动规则转换通道
while(!(ADC1->SR&1<<1));//等待转换结束
return ADC1->DR; //返回adc值
}
//获取通道ch的转换值,取times次,然后平均
//ch:通道编号
//times:获取次数
//返回值:通道ch的times次转换结果平均值
uint32_t Get_Adc_Average(uint8_t ch,uint8_t times)
{
uint32_t temp_val=0;
uint8_t t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
//delay_ms(5);
}
return temp_val/times;
}
初始化后在程序中调用Get_Adc_Average进行采样值读取

三、总结

寄存器方式读取ADC数据是最基本的读取方式。在这种方式下,CPU直接通过读取ADC的寄存器来获取转换结果。具体来说,当ADC完成一次转换后,转换结果会被存储在特定的寄存器中,程序通过读取这些寄存器的内容来获取转换后的数字值。

优点:

简单直观:操作过程简单,易于理解和实现。

灵活性高:可以根据需要随时读取ADC数据,不受DMA传输的限制。

缺点:

CPU占用率高:每次读取数据都需要CPU的参与,增加了CPU的负担。

效率低:在高速数据采集场景下,CPU可能无法及时响应,导致数据丢失或处理延迟。


http://www.ppmy.cn/embedded/128199.html

相关文章

如何在算家云搭建PhotoMaker(图像生成)

一、PhotoMaker简介 PhotoMaker是一种高效、个性化的文本转图像生成方法&#xff0c;能通过堆叠 ID 嵌入自定义的逼真人类照片。相当于把一张人类照片的特征提取出来&#xff0c;然后生成你想要的不同风格照片&#xff0c;如写真等等。 主要特点&#xff1a; 在几秒钟内快速…

接口测试常用工具及测试方法

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信…

SQL Server-导入和导出excel数据-注意事项

环境&#xff1a; win10&#xff0c;SQL Server 2008 R2 之前写过的放在这里&#xff1a; SqlServer_陆沙的博客-CSDN博客 https://blog.csdn.net/pxy7896/category_12704205.html 最近重启ASP.NET项目&#xff0c;在使用sql server导出和导入数据时遇到一些问题&#xff0c;特…

代码随想录打卡Day 长度最小的子数组209 螺旋矩阵2 59

day02 数组 1 长度最小的子数组 介绍数组操作中另一个重要的方法&#xff1a;滑动窗口。 所谓滑动窗口&#xff0c;就是不断的调节子序列的起始位置和终止位置&#xff0c;从而得出我们要想的结果。 在暴力解法中&#xff0c;是一个for循环滑动窗口的起始位置&#xff0c;一…

计算力学|采用python进行有限元模拟

从abaqus输出的inp文件中读取节点和单元信息 import meshio mesh meshio.read(Job-3.inp) coords mesh.points###coords即为各个节点的坐标 Edof mesh.cells_dict[triangle]#Edof为三角形单元的节点号 1.单元刚度矩阵 def element_stiffness(n1,coords,E,v,t): node1 c…

【开源免费】基于SpringBoot+Vue.JS房屋租赁系统(JAVA毕业设计)

本文项目编号 T 020 &#xff0c;文末自助获取源码 \color{red}{T020&#xff0c;文末自助获取源码} T020&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

初阶数据结构【 算法的时间复杂度和空间复杂度】

目录 前言一、算法效率1.1 如何衡量一个算法的好坏1.2 算法的复杂度 二、时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3常见时间复杂度计算举例 三、空间复杂度四、 常见复杂度对比五、复杂度的oj练习总结 前言 我们现在已经基本结束了对C语言基础的学习&#xff0c;…

【智能大数据分析 | 实验三】Storm实验:实时WordCountTopology

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…