STM32_ADC_寄存器操作
文章目录一、ADC寄存器1、ADC状态寄存器(ADC_SR)2、ADC控制寄存器 1(ADC_CR1)3、ADC控制寄存器 2(ADC_CR2)4、ADC采样时间寄存器 1(ADC_SMPR1)5、ADC采样时间寄存器 2(ADC_SMPR2)6、ADC注入通道数据偏移寄存器x (ADC_JOFRx)(x1..4)7、ADC看门狗高阀值寄存器(ADC_HTR)8、ADC看门狗低阀值寄存器(ADC_LRT)9、ADC规则序列寄存器 1(ADC_SQR1)10、ADC规则序列寄存器 2(ADC_SQR2)11、ADC规则序列寄存器 3(ADC_SQR3)12、ADC注入序列寄存器(ADC_JSQR)13、ADC 注入数据寄存器x (ADC_JDRx) (x 1..4)14、ADC规则数据寄存器(ADC_DR)15、ADC寄存器地址映像二、代码实例1、ADC1 单次采样PA0查询模式2、ADC1 连续采样PA0中断模式3、ADC1 多通道扫描PA0/CH0 PA1/CH1DMA 批量采集三、总结1、核心寄存器2、注意事项3、ADC 寄存器编程核心流程一、ADC寄存器1、ADC状态寄存器(ADC_SR)地址偏移0x00复位值0x0000 00002、ADC控制寄存器 1(ADC_CR1)地址偏移0x04复位值0x0000 00003、ADC控制寄存器 2(ADC_CR2)地址偏移0x08复位值0x0000 00004、ADC采样时间寄存器 1(ADC_SMPR1)地址偏移0x0C复位值0x0000 00005、ADC采样时间寄存器 2(ADC_SMPR2)地址偏移0x10复位值0x0000 00006、ADC注入通道数据偏移寄存器x (ADC_JOFRx)(x1…4)地址偏移0x14-0x20复位值0x0000 00007、ADC看门狗高阀值寄存器(ADC_HTR)地址偏移0x24复位值0x0000 00008、ADC看门狗低阀值寄存器(ADC_LRT)地址偏移0x28复位值0x0000 00009、ADC规则序列寄存器 1(ADC_SQR1)地址偏移0x2C复位值0x0000 000010、ADC规则序列寄存器 2(ADC_SQR2)地址偏移0x30复位值0x0000 000011、ADC规则序列寄存器 3(ADC_SQR3)地址偏移0x34复位值0x0000 000012、ADC注入序列寄存器(ADC_JSQR)地址偏移0x38复位值0x0000 000013、ADC 注入数据寄存器x (ADC_JDRx) (x 1…4)地址偏移0x3C – 0x48复位值0x0000 000014、ADC规则数据寄存器(ADC_DR)地址偏移0x4C复位值0x0000 000015、ADC寄存器地址映像二、代码实例1、ADC1 单次采样PA0查询模式最基础的 ADC 用法单次触发转换、查询结果适合低频采样场景。#includestm32f10x.h/** * brief 系统时钟初始化72MHzHSE8MHz */voidSystemClock_Init(void){RCC-CR|RCC_CR_HSEON;while(!(RCC-CRRCC_CR_HSERDY));FLASH-ACR|FLASH_ACR_LATENCY_2;RCC-CFGR~RCC_CFGR_HPRE;RCC-CFGR|RCC_CFGR_PPRE1_DIV2;RCC-CFGR~RCC_CFGR_PPRE2;RCC-CFGR~(RCC_CFGR_PLLSRC|RCC_CFGR_PLLXTPRE|RCC_CFGR_PLLMULL);RCC-CFGR|RCC_CFGR_PLLMULL9;RCC-CR|RCC_CR_PLLON;while(!(RCC-CRRCC_CR_PLLRDY));RCC-CFGR~RCC_CFGR_SW;RCC-CFGR|RCC_CFGR_SW_PLL;while((RCC-CFGRRCC_CFGR_SWS)!RCC_CFGR_SWS_PLL);}/** * brief ADC1初始化单次转换CH0/PA0查询模式 */voidADC1_Single_Init(void){// 1. 开启时钟GPIOA、ADC1RCC-APB2ENR|RCC_APB2ENR_IOPAEN|RCC_APB2ENR_ADC1EN;// ADC时钟分频6分频72/612MHz ≤14MHzRCC-CFGR~RCC_CFGR_ADCPRE;RCC-CFGR|RCC_CFGR_ADCPRE_DIV6;// 2. 配置GPIOPA0模拟输入无上下拉GPIOA-CRL~(GPIO_CRL_MODE0|GPIO_CRL_CNF0);// 模拟输入模式// 3. 配置ADC1核心参数ADC1-CR1~ADC_CR1_SCAN;// 关闭扫描模式单次通道ADC1-CR2~ADC_CR2_CONT;// 关闭连续转换单次转换ADC1-CR2~ADC_CR2_ALIGN;// 数据右对齐低12位有效ADC1-SQR1~ADC_SQR1_L;// 转换序列长度1L[3:0]0000ADC1-SQR3~ADC_SQR3_SQ1;// 转换序列第1位CH00ADC1-SQR3|0;// 4. 配置采样时间CH0采样时间239.5周期提高精度ADC1-SMPR2~ADC_SMPR2_SMP0;ADC1-SMPR2|ADC_SMPR2_SMP0_2;// SMP0[2:0]110 → 239.5周期// 5. 开启ADC1并校准ADC1-CR2|ADC_CR2_ADON;// 开启ADCADC1-CR2|ADC_CR2_CAL;// 启动校准while(ADC1-CR2ADC_CR2_CAL);// 等待校准完成}/** * brief ADC1单次采样查询模式 * return 采样值0~4095 */uint16_tADC1_Single_Read(void){// 1. 启动ADC转换ADC1-CR2|ADC_CR2_SWSTART;// 2. 等待转换完成EOC1while(!(ADC1-SRADC_SR_EOC));// 3. 读取采样值DR寄存器右对齐returnADC1-DR;}/** * brief 采样值转电压mV * param adc_valADC采样值0~4095 * return 电压值mV如16501.65V */uint16_tADC_To_Voltage(uint16_tadc_val){// 公式电压 (adc_val / 4095) * 3300mVreturn(uint32_t)adc_val*3300/4095;}// 主函数intmain(void){uint16_tadc_val,voltage;SystemClock_Init();ADC1_Single_Init();while(1){// 单次采样adc_valADC1_Single_Read();voltageADC_To_Voltage(adc_val);// 可通过串口输出adc_val和voltage或做其他处理// 简单延时for(uint32_ti0;i1000000;i);}}2、ADC1 连续采样PA0中断模式连续转换 中断通知CPU 无需轮询适合高频采样场景。#includestm32f10x.h// 全局变量存储最新采样值uint16_tADC1_Cont_Value0;/** * brief ADC1初始化连续转换CH0/PA0中断模式 */voidADC1_Cont_IRQ_Init(void){// 1. 时钟/GPIO配置同场景1RCC-APB2ENR|RCC_APB2ENR_IOPAEN|RCC_APB2ENR_ADC1EN;RCC-CFGR|RCC_CFGR_ADCPRE_DIV6;GPIOA-CRL~(GPIO_CRL_MODE0|GPIO_CRL_CNF0);// 2. 配置ADC1连续转换中断ADC1-CR1~ADC_CR1_SCAN;ADC1-CR2|ADC_CR2_CONT;// 开启连续转换ADC1-CR2~ADC_CR2_ALIGN;ADC1-SQR1~ADC_SQR1_L;ADC1-SQR3|0;ADC1-SMPR2|ADC_SMPR2_SMP0_2;// 3. 开启ADC转换完成中断ADC1-CR1|ADC_CR1_EOCIE;// 开启EOC中断// 4. 配置NVICADC1_IRQn18号中断SCB-AIRCR0x05FA0800;// 优先级分组2NVIC-IP[18]~0xFF;NVIC-IP[18]|0x10;// 抢占优先级1NVIC-ISER[0]|(118);// 使能ADC1中断// 5. 开启ADC并校准启动转换ADC1-CR2|ADC_CR2_ADON;ADC1-CR2|ADC_CR2_CAL;while(ADC1-CR2ADC_CR2_CAL);ADC1-CR2|ADC_CR2_SWSTART;// 启动连续转换}/** * brief ADC1中断服务函数 */voidADC1_IRQHandler(void){// 检查转换完成标志if(ADC1-SRADC_SR_EOC){ADC1_Cont_ValueADC1-DR;// 读取采样值ADC1-SR~ADC_SR_EOC;// 清除EOC标志}}// 主函数intmain(void){uint16_tvoltage;SystemClock_Init();ADC1_Cont_IRQ_Init();while(1){// 实时读取连续采样值并转电压voltageADC_To_Voltage(ADC1_Cont_Value);// 业务处理逻辑}}3、ADC1 多通道扫描PA0/CH0 PA1/CH1DMA 批量采集扫描多个通道 DMA 批量传输适合多模拟量同步采集如温度、电压、电流。#includestm32f10x.h// DMA采集缓冲区存储CH0和CH1的采样值uint16_tADC1_Scan_Buf[2]{0};#defineADC_SCAN_CH_NUM2/** * brief ADC1DMA初始化多通道扫描CH0CH1DMA1_Channel1 */voidADC1_Scan_DMA_Init(void){// 1. 开启时钟GPIOA、ADC1、DMA1RCC-APB2ENR|RCC_APB2ENR_IOPAEN|RCC_APB2ENR_ADC1EN;RCC-AHBENR|RCC_AHBENR_DMA1EN;RCC-CFGR|RCC_CFGR_ADCPRE_DIV6;// 2. 配置GPIOPA0/PA1模拟输入GPIOA-CRL~(GPIO_CRL_MODE0|GPIO_CRL_CNF0|GPIO_CRL_MODE1|GPIO_CRL_CNF1);// 3. 配置ADC1扫描模式连续转换ADC1-CR1|ADC_CR1_SCAN;// 开启扫描模式ADC1-CR2|ADC_CR2_CONT;// 连续转换ADC1-CR2|ADC_CR2_DMA;// 开启ADC DMA模式ADC1-CR2~ADC_CR2_ALIGN;// 转换序列长度2L[3:0]0001 → 2个通道ADC1-SQR1~ADC_SQR1_L;ADC1-SQR1|(ADC_SCAN_CH_NUM-1)20;// 转换序列第1位CH0第2位CH1ADC1-SQR3~(ADC_SQR3_SQ1|ADC_SQR3_SQ2);ADC1-SQR3|00;// SQ1CH0ADC1-SQR3|15;// SQ2CH1// 采样时间CH0/CH1均为239.5周期ADC1-SMPR2|ADC_SMPR2_SMP0_2|ADC_SMPR2_SMP1_2;// 4. 配置DMA1_Channel1ADC1映射通道DMA1_Channel1-CCR~DMA_CCR_EN;// 关闭DMA通道DMA1_Channel1-CCR0;DMA1_Channel1-CCR~DMA_CCR_DIR;// 方向外设→内存DMA1_Channel1-CCR|DMA_CCR_MINC;// 内存地址自增DMA1_Channel1-CCR~DMA_CCR_PINC;// 外设地址不自增DMA1_Channel1-CCR|DMA_CCR_PSIZE_0;// 外设数据宽度16位DMA1_Channel1-CCR|DMA_CCR_MSIZE_0;// 内存数据宽度16位DMA1_Channel1-CCR|DMA_CCR_CIRC;// 循环模式连续采集DMA1_Channel1-CCR|DMA_CCR_PL_1;// 优先级高// 5. 配置DMA地址和长度DMA1_Channel1-CPAR(uint32_t)ADC1-DR;// 外设地址ADC_DRDMA1_Channel1-CMAR(uint32_t)ADC1_Scan_Buf;// 内存缓冲区DMA1_Channel1-CNDTRADC_SCAN_CH_NUM;// 传输长度// 6. 启动DMA和ADCDMA1_Channel1-CCR|DMA_CCR_EN;// 开启DMAADC1-CR2|ADC_CR2_ADON;// 开启ADCADC1-CR2|ADC_CR2_CAL;// 校准while(ADC1-CR2ADC_CR2_CAL);ADC1-CR2|ADC_CR2_SWSTART;// 启动连续转换}// 主函数intmain(void){uint16_tvoltage0,voltage1;SystemClock_Init();ADC1_Scan_DMA_Init();while(1){// ADC1_Scan_Buf[0] CH0采样值ADC1_Scan_Buf[1] CH1采样值voltage0ADC_To_Voltage(ADC1_Scan_Buf[0]);voltage1ADC_To_Voltage(ADC1_Scan_Buf[1]);// 多通道数据处理逻辑}}三、总结1、核心寄存器2、注意事项DC 时钟限制STM32F103 ADC 时钟最大 14MHz72MHz 系统时钟下必须 6 分频72/612MHz否则 ADC 采样精度下降。采样时间选择采样时间越长抗干扰能力越强常用 239.5 周期高精度、13.5 周期高速公式采样时间 (SMPx 1) × ADC 时钟周期如 239.5 周期 12MHz ~20μs。校准操作每次开启 ADC 后必须执行校准ADC_CR2_CAL校准完成后才能启动转换否则采样值偏差大。DMA 循环模式多通道连续采集时DMA 需开启CIRC循环模式否则采集完一次后停止。电压转换精度公式(adc_val * 3300) / 4095中需用uint32_t强制转换避免 16 位整数溢出。3、ADC 寄存器编程核心流程开时钟→配 GPIO→配 ADC 参数扫描 / 连续 / 采样时间→校准→启动转换→读数据
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2433528.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!