首页 > 其他分享 >STM32 ADC实例解析(1)-寄存器方式

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

时间:2024-10-18 13:50:55浏览次数:9  
标签:__ 寄存器 STM32 ADC IO ADC1 uint32

文章目录


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

一、寄存器列表

__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可能无法及时响应,导致数据丢失或处理延迟。

标签:__,寄存器,STM32,ADC,IO,ADC1,uint32
From: https://blog.csdn.net/u013050118/article/details/143004182

相关文章

  • STM32 ADC实例解析(1)-HAL+DMA方式
    文章目录一、STM32ADC与DMA的结合使用初始化ADC:配置DMA:启动DMA传输:中断处理(可选):二、示例代码初始化GPIO设置中断设置三、应用优势高效性:减轻CPU负担:灵活性:易用性:随着开发项目的累计,将ADC与DMA结合使用,可以实现高效的数据采集和处理。一、STM32ADC与DMA的结合......
  • 10093-基于STM32的无线串口小型直流电机调速器设计(仿真+原理图+源代码工程+详细介绍说
    10093-基于STM32的无线串口小型直流电机调速器设计(仿真+原理图+源代码工程+详细介绍说明书+proteus)功能描述:直流电机的调速器设计设计,需要设计一个调速与控制系统,是设备可以直接控制和读取信息,并且显示。①设计直流电机转速控制系统;②通过按键调节直流电机转速;③可以在......
  • 10093-基于STM32的无线串口小型直流电机调速器设计(仿真+原理图+源代码工程+详细介绍说
    10093-基于STM32的无线串口小型直流电机调速器设计(仿真+原理图+源代码工程+详细介绍说明书+proteus)功能描述:直流电机的调速器设计设计,需要设计一个调速与控制系统,是设备可以直接控制和读取信息,并且显示。①设计直流电机转速控制系统;②通过按键调节直流电机转速;③可以在......
  • STM32(二十):PWR电源控制
    PWR(PowerControl)电源控制        PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能        可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD阀值之上时,PVD会触发中断,用于执行紧急关闭任务   ......
  • PYNQ z2 使用xadcps读取xadc内部电压温度
    使用xadcps只能和JTAG一样读取温度值和电压值,属于内部通道,读取不了外部通道的数据添加zynq700核后进行配置1.在PS-PLConfiguration中,取消勾选general里面的FCLK_RSTEN_N以及M_AXI_GP0_Interface2.在PeripheralIOPins中勾选1415对应的UART0,同时对板卡电压进行配置,BA......
  • 基于STM32实现硬件SPI与W25Q128通讯步骤及程序
    为了大家更加直接了当的获取信息,我直接上干货一、硬件原理图:W25Q128模块图由上图可以看出,要和W25Q128通讯需要采用单片机上的SPI2W25Q128引脚连线图由上图看出:CS(片选)--------------PB12SCK--------------PB13MISO--------------PB14MOSI--------------PB15一、标......
  • 一、STM32F103C8T6--GPIO
    STM32f103c8t632位Cortex-M3内核RISC处理器,最高主频72MHZ,Flash:64KB,SRAM:20KB片上外设:I/O端口:多达37个GPIO引脚(支持复用功能)。GPIO端口支持输入、输出、上拉/下拉功能。定时器:3个16位通用定时器(支持PWM输出)。********1个高级定时器(支持多通道PWM)。通信接口:......
  • 《安富莱嵌入式周报》第344期:开源手表一年的误差不到1秒,开源32路IMU传感器矩阵,STM32L4
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 本周更新视频DSP视频教程第13期:汇编浮点库qfplib性能媲美TI的IQmath和硬件FPU,强于C库的math和ARMDSP库,适用于M0和M3(2024-10-12)https://www.armbbs.cn/forum.php?mod=view......
  • 单片机项目|基于STM32实现具有室内定位功能的智能手环的设计
    作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与各位高校教师、企业......
  • STM32F103+Air780 OTA升级测试说明
     测试1,单片机通过串口1和GPRS模块通信; 单片机PA8引脚作为复位模组使用;串口2做日志打印(115200)(单片机)PA9  ----  (Air780 )RX;(单片机)PA10  ----  (Air780 )TX;(单片机)PA8  ----  (Air780 )RST2,打开这节例程3,可以使用下载器先下载Bo......