踩坑STM32F103
三勺最近在学习STM32F103的ADC功能,居然连最简单的独立模式的单通道的电压采集都不能实现,这就不能忍了,这是对智商的侮辱。
目标一:实现单通道ADC读取
根据技术手册设置:
设置GPIO为模拟输入模式。
设置ADC1->CR2、ADC->SMPR1、
ADC0->SQR1寄存器。
开启KEIL的Debug调试功能:
现象1:ADC1寄存器没有被配置。
原因和步骤:ADC1的RCC时钟位未开启。
现象2:ADC1->DATA数据寄存器全是0000
原因和步骤:
步骤1:烧野火例程源码,功能正常。硬件正常。
步骤2:调试模式下打开ADC寄存器视图,观察我和野火区别。更改成相同寄存器配置后依然无法读取ADC。
步骤3:再次回到数据手册,仔细查看ADC描述。

破案了,我在程序中只有一次设置ADC位,即使和野火的例程寄存器配置完全相同,也无济于事。
目标二:实现多通道ADC+DMA
乘胜追击,继续配置
根据技术手册设置:
现象:DMA的目的地址缓存数组只有第一个值有效,而且其他通道的值都和通道1相同。
步骤1:烧野火例程源码,功能正常。硬件正常。
步骤2:调试模式下打开ADC寄存器视图,观察我和野火区别。更改成相同寄存器的配置后现象依旧。
步骤3:百度。
步骤4:瞎猫碰到死耗子,我把ADC1->CR1的扫描模式,放置在ADC1->CR2前,成功读取所有通道的数值。
为什么?我查询了一些资料,还不得而知,下图是标准库的配置顺序。知道原因的朋友欢迎留言指教。

关键字:STM32F103 ADC功能 独立模式
引用地址:
学习STM32F103的ADC功能
推荐阅读最新更新时间:2026-03-20 11:26
采用STM32F103硬件ADC功能进行光照强度采集
硬件配置 单片机型号:STM32F103C8 屏幕:0.96寸OLED屏 传感器:光照传感器(ADC采集) 功能实现 光照强度采集ADC方式采集,STM32F103本身自带有硬件ADC功能。将采集到的数据实时刷新到屏幕上即可完成波形显示。 0.96寸OLED分辨率为128*64(128列,64行)。我们可以定义一个数组buff ,数组下标作为横坐标,数组中的值作为纵坐标。这样即可把采集到的值实时刷新即可。由于需要先采集的数据先显示,这样就可以采用环形队列特性实现波形显示。 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4
[单片机]
STM32F103单片机ADC功能使用
12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。 ADC 主要特征 ● 12位分辨率 ● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断 ● 单次和连续转换模式 ● 从通道0到通道n的自动扫描模式 ● 自校准 ● 带内嵌数据一致性的数据对齐 ● 采样间隔可以按通道分别编程 ● 规则转换和
[单片机]
STM32F103VET6——ADC功能框图
简介 Analog to Digital(模拟数字转换器) 三个独立ADC通道(STM32F103系列均有) 精度为12位(STM32F103系列均有) ADC1,ADC2有18个通道(16个为内部);ADC3有根据F103系列的引脚不同而变化,一般有8个外部通道 功能框图 Figure 2-1 电压输入范围 Figure 2-2 Figure 2-A 指南者开发板中,VREF+与VREF-分别连接到了3V3和地 输入通道 Figure 2-3 输入通道分为规则通道和注入通道 规则通道:平时使用,正常转换通道(16) 注入通道:在规则转换时插队(4) 转换顺序
[单片机]
STM32F1的ADC2如何使用DMA功能 USART过载错误Overrun error
Ⅰ ADC2如何使用DMA功能 上一篇文章说了关于ADC使用DMA的功能,单ADC(只使用ADC1,或者只使用ADC2)采集多条通道,可以使用规则多利用DMA功能实现。 但是,只有ADC1和ADC3拥有DMA功能,而ADC2没有DMA功能,如何实现使用DMA功能采集数据呢? 这个问题大家不必担心,ST这么大的公司,这种基本的功能,肯定是有办法解决的。 其实这问题在参考手册中都能找到答案。答案简单概括就是:使用双ADC模式,由ADC2转化的数据可以通过双ADC模式,利用ADC1的DMA功能传输。 在有2个或以上ADC模块的产品中,可以使用双ADC模式。在双ADC模式里,根据ADC1_CR1寄存器中UALMOD 位所选的模
[单片机]
STM32单片机实现DMA+ADC+UART功能
突然想测试一下STM32单片机ADC采样速率问题,按照常规方法,可以通过ADC采样,然后将采样值打印出来。但是这种方法在处理和打印数据的时候会占用很多时间,导致处理数据的时间超过了ADC的采样时间。于是想到了ADC采样的数据用DMA功能存储,并通过串口打印。但是串口打印依然要占用单片机时间,那能不能串口数据的输出也采用 DMA功能呢?这样ADC采样的数据通过DMA直接存储,然后串口通过DMA功能直接输出采样到的数据。这样速度程序执行速度不就极大的提升了吗?说干就干,使用STM32F103C8T6单片机,标准库函数,keil5软件,编写一个测试程序。 首先实现ADC采样并通过DMA存储 #ifndef __ADC_H #de
[单片机]
STM8单片机ADC模拟看门狗功能实现
看门狗的功能大家都知道,而这个模拟看门狗又是什么东西呢? 简单的说就是这个模拟看门狗可以实时监控ADC采样的数据,当采样的数据值小于设置的最小值或者大于设置的最大值时,单片机就会触发ADC中断。这个在温度监控中非常实用,比如现在要监控设备的温度值,当温度值不在设置范围内的时候,就会自动触发中断,而不需要程序一直去采集ADC通道的值,然后使用软件来判断当前的温度值是否超出正常范围。 官方介绍如下: 下面直接通过代码来演示一下这个模拟看门狗的功能: #include adc.h #include main.h u16 DATAH = 0; //ADC转换值高8位 u16 D
[单片机]
汽车ADC如何帮助设计人员在ADAS中实现功能安全?
尽管当今的车辆在多种驾驶场景中实现了自动化,但背后真正推动汽车从部分自动驾驶实现全自动驾驶的不是汽车制造商,而是移动服务提供商,例如出租车公司、汽车租赁公司、送货服务公司以及需要提供安全、高效、方便且经济实用的公共和私人交通工具的城市。 在完全自主的自动驾驶汽车驶上公共道路之前,它必须经历六个不同的自动化等级,即从0级(无自动化)到5级(完全自动化),如图1所示。自动化等级每提升一级,都需要对高级驾驶辅助系统 (ADAS) 技术进行大幅改进,并实现对所有安全关键型功能的适当管理。 图 1:自动驾驶等级 自动驾驶汽车使用多项传感器技术,包括摄像头、雷达和激光雷达。根据不同的环境条件和距离,这些传感器各有优缺点。传感器
[嵌入式]
汽车ADC如何帮助设计人员在ADAS中实现功能安全
尽管当今的车辆在多种驾驶场景中实现了自动化,但背后真正推动汽车从部分自动驾驶实现全自动驾驶的不是汽车制造商,而是移动服务提供商,例如出租车公司、汽车租赁公司、送货服务公司以及需要提供安全、高效、方便且经济实用的公共和私人交通工具的城市。 在完全自主的自动驾驶汽车驶上公共道路之前,它必须经历六个不同的自动化等级,即从0级(无自动化)到5级(完全自动化),如图1所示。自动化等级每提升一级,都需要对高级驾驶辅助系统 (ADAS) 技术进行大幅改进,并实现对所有安全关键型功能的适当管理。 图 1:自动驾驶等级 自动驾驶汽车使用多项传感器技术,包括摄像头、雷达和激光雷达。根据不同的环境条件和距离,这些传感器各有优缺点。传感器融合
[汽车电子]