声明:本篇博客并不是一个详细的教程,只是对本篇涉及到的知识点进行简单整理,罗列出其中疑难、易引起误解的地方。想对该功能进行全方位的了解,建议直接去看手册。 STM32_H7_ADC! T9 _0 T: ?% _# M. g* P( ?( G 简介 STM32H7系列单片机均拥有3 个ADC0 S a1 V8 A& x ADC1 与 ADC2 紧密耦合,可在双重模式下运行(ADC1 为主器件) ADC3 单独进行实例化( j" Q: [, w8 D0 ]( K! t( S7 r 每个 ADC 由 16 位逐次逼近模数转换器组成+ W$ a! }' u: s" {7 d! X( H% q" u 每个 ADC 的复用通道多达 20 条。各种不同通道的 A/D 转换可在单次、连续、扫描或不连续采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 32 位数据寄存器中( Z# @ d1 p: [/ G$ z( l ADC 映射到 AHB 总线,从而可实现快速数据处理( e& Z) @, }, ^: Q/ K2 _: s( m ADC 具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或下限% Y& W# e7 X0 V4 u' K! m2 A 内置硬件过采样器,可提高模拟性能,同时还能减轻 CPU 进行相关计算的负担 采用了高效的低功耗模式,在低频下可实现极低的功耗* Y$ O0 ?/ `- t- {( f' r 主要特性 Y _. X+ x/ i2 _4 ~ 高性能特性 * H" r- u8 F6 o. C& @ ADC1和ADC2可在双重模式下运行: N& n" M" i& s0 l- a 可配置 16 位、14 位、12 位、10 位或 8 位分辨率 ADC 转换时间与 AHB 总线时钟频率无关2 t. B! R/ D3 m( M 可通过降低分辨率来缩短转换时间 可设置单端输入或差分输入(可按通道进行编程) AHB 从总线接口,可实现快速数据处理 自校准(偏移校准和线性度校准)+ F0 J/ I- c$ x, j |# V) y5 } 可独立设置各通道采样时间 多达四条注入通道(对常规通道或注入通道的模拟输入分配完全可配置)) E! r2 x: d& c 硬件辅助准备注入通道的上下文,从而实现快速上下文切换) C" Z/ E2 H# b9 `7 S U9 { 数据对齐以保持内置数据一致性 数据可由 GP-DMA 管理,基于 FIFO 实现常规通道转换 数据可连接到 DFSDM 进行后期处理% A9 M* p$ S# Q9 }, o' p6 B6 T3 C 4 个专用数据寄存器供注入通道使用 过采样器. ^( L z" w6 h P8 a% g 32 位数据寄存器 过采样率可在 2x 到 1024x 之间进行调整 可编程数据右移和左移2 Y$ X8 O1 V, ? 低功耗特性( Q& o( P$ i7 }7 P5 L. a- s 速度自适应低功耗模式,可降低 ADC 在低频下工作时的功耗% D% U1 k0 W' K- W" ^: L# l 可在实现慢速总线频率应用的同时保持最佳 ADC 性能. i& ` L- j+ g5 F 提供自动控制,可避免 ADC 在低 AHB 总线时钟频率应用中溢出(自动延迟模式)0 z) R! u; x& P* g: q 每个 ADC 都有外部模拟输入通道2 l- @$ { P0 O k3 G 专用 GPIO 引脚有多达 6 条快速通道) Q( r6 ~! @) W 专用 GPIO 引脚有多达 14 条慢速通道 此外,还有五条内部专用通道, I" N! B$ W9 [& n; B0 o0 u4 q3 R 内部参考电压 (VREFINT),连接到 ADC3) R, o9 ^8 @( Y* b7 i0 M; N4 B 内部温度传感器 (VSENSE),连接到 ADC3 VBAT 监测通道 (VBAT/4),连接到 ADC3 内部 DAC 通道 1 和通道 2,连接到 ADC2 1 u- v/ `; z- ~% n5 s 可通过以下方式启动转换过程: 通过软件启动常规转换和注入转换 通过极性可配置的硬件触发器(内部定时器事件或 GPIO 输入事件)启动常规转换和注入转换% c1 k6 {7 U8 r% B5 U 转换模式 每个 ADC 均可转换单条通道,也可扫描一系列通道+ g( y% }, x8 C3 D 单次模式会在每次触发时对选定的输入执行一次转换 连续模式可连续转换选定的输入 不连续采样模式$ C3 S# Q9 p- |9 Y V$ h4 I: q7 D3 M : S j0 K, L6 R) B- O" N4 p 其他 ADC1 和 ADC2 的双重 ADC 模式 在 ADC 准备就绪、采样结束、转换结束(常规转换或注入转换)、序列转换结束(常规 转换或注入转换)、模拟看门狗 1/2/3 事件或溢出事件时生成中断7 Y {. s( D9 G/ y: k* b* z 每个 ADC 有 3 个模拟看门狗, { C0 _7 A7 U& U0 e- j ADC 输入范围: ADC框图: r6 B2 i+ k/ T* K 0 ?/ j2 [- z M5 ~ 框图说明: 4 x1 u( U2 \& i7 s8 c$ @0 f* u ①处,是 ADC 的输入通道,每个总共 20 个通道。因为 H743 的 ADC 支持差分通道输入,因此有:ADCx_INP[19:0]和 ADCx_INN[19:0]两组信号;如果我们使用单端输入,则只有 ADCx_INP[19:0] 有效,ADCx_INN[19:0]在内部自动接 VSSA。同时、、 和 等内部电压信号,都可以连接到 ADCx_INP 的某个通道上面进行采集。注意:STM32H7 的 ADC 支持单端/差分转换,由寄存器 ADCx_DIFSEL(x=1~3)控制,我们一般使用单端转换模式,默认这个寄存器都是 0 的,刚好是单端转换模式。7 T' z0 X5 b4 O z2 X5 Y' }' \ ②处,用于规则通道的触发选择,是选择硬件触发、还是软件触发。如果选择软件触发,我们只需要设置 ADSTART 位为 1,即可开启 ADC 转换;如果选择硬件触发,则需要选择相应的硬件触发通道(adc_ext0_trg~ adc_ext20_trg)和触发边沿等,然后由外部硬件通道来触发 ADC 的采集(注意:ADSTART 位同样要设置为 1)。4 Q- v- J- ^) o" u1 Z8 o' i) Q! Q ③处,用于选择参考电压,我们可以设置参考电压来自外部的 Vref+,也可以设置参考电 压来自内部的稳压器。 ④处,是 ADC 的核心,是一个 16 位的逐次逼近型 ADC 转换器,它根据我们设置好的参考电压、输入通道、启动条件等,执行模数转换。 ⑤处,是 ADC 转换完成后的数据输出寄存器。其中 RDATA[31:0]用于保存常规通道的转换结果,JDATA1~4[31:0]用于保存注入通道的转换结果。转换结果 CPU 可以通过 AHB 总线读取, 同时也可以产生相关中断(adc_it)。 ⑥处,是 ADC 的两个时钟源,其中:adc_hclk 是总线接口的AHB时钟;adc_ker_ck 是独立时钟;选择adc_ker_ck的优点在于无论选择哪种 AHB 时钟方案,都可以达到最大 ADC 时钟频率。选择adc_hclk 的优势在于绕过了时钟域重新同步。如果 ADC 由定时器触发,并且应用要求 ADC精确触发(不存在任何不确定性),可使用此选项(否则,重新同步两个时钟域会为触发时刻带来不确定性)。 ⑦处,是通道预选择设置,用于将 ADC 某个通道连接到对应的 GPIO 上。PCSEL[19:0]每个位对应一个通道,总共 20 个通道。这一点和以前的 STM32 系列不一样,在使用的时候,需要特 别注意。# O7 u* o8 y+ Z, A; G ⑧处,外部触发输入(注意这里不是IO),共有多达 21 个外部触发输入用于常规转换(可连接至片上 定时器)。 这些输入由主 ADC 和从 ADC 共享。 ⑨处,是内部模拟看门狗输出信号,连接至片上定时器。8 |- E& S6 Z- ~: f8 U ⑩处,是CPU与ADC交互的四种方式:中断、DMA、DFSDM、AHB总线直接读取。 ⑪过采样器,过采样单元会进行数据预处理,以减轻 CPU 的负担。本质为一个数字滤波器。+ X+ k. b, [8 ]* S$ g " w& d8 n- m! K) r! l 名词说明9 A1 j9 R* v! |/ E# c0 [4 q ADC1和ADC2的双重模式 如果器件配有两个或多个 ADC,可使用双重 ADC 模式在双重 ADC 模式下,通过 ADCx 主器件到 ADC 从器件的交替触发或同时触发来启动转换, 具体取决于 ADCx_CCR 寄存器中的 DUAL[4:0] 位所选的模式。可实现以下四种模式:# x3 B% A. \9 N. f& R! s ( p, Q4 ?" T$ {" a H7 U% a, h 注入同步模式+ H4 N! {7 b8 C9 ~ 常规同步模式 交替模式 交替触发模式 也可按以下方式组合使用这些模式:4 q5 `' G7 A3 P/ y& A ? I/ j& o! L 注入同步模式 + 常规同步模式+ J. r h9 V9 \7 h 常规同步模式 + 交替触发模式; z$ m% c" X& z3 s7 e ] 注入同步模式 + 交替模式 这里不展开描述,具体细节请参阅手册。& V& b0 n; k: M# ?6 T6 D/ R 常规通道组和注入通道组 ' C& J+ s' H: l" ^ STM32H7将 ADC 的转换分为 2 个通道组:规则通道组和注入通道组。规则通道相当于你正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换。 STM32H7其 ADC 的规则通道组最多包含 16 个转换,而注入通道组最多包含 4 个通道。+ s2 R0 N% a; L $ a- B5 j* B, \3 C ADC数据获取的四种方式' w6 e' i4 h% ^( \: T " Z( M c9 w0 C ^ N6 J ADC 转换结果可直接传送到具有 Σ∆ 调制器的数字滤波器 (DFSDM)。% _- R, v# u. C# o7 X. o$ u4 I 不使用DMA:每次常规转换通道结束时(发生 EOC 事件时),转换后数据的结果都会存储在宽度为 32 位的 ADCx_DR 数据寄存器中。 每次注入转换通道结束时(发生 JEOC 事件时),转换后数据的结果都会存储在宽度为 32 位的相应 ADCx_JDRy 数据寄存器中。如果常规转换后的数据未在新转换数据可用之前(由 CPU 或 DMA)读取,会由溢出标志(OVR) 指示缓冲区溢出事件。发生溢出情况,ADC 仍会保持工作状态并可继续进行转换,除非通过软件将 ADSTP 位置 1,从而停止并复位序列。可对控制位 OVRMOD 进行编程,从而配置发生溢出事件时是要保留数据还是要覆盖数据。 DMA 模式使能时,会在每次通道转换后生成 DMA 请求。这样便可将转换的数据从 ADCx_DR 寄存器传输到用软件选择的目标位置。尽管如此,如果因 DMA 无法及时处理 DMA 传输请求而发生溢出 (OVR=1),ADC 会停止生成 DMA 请求,新转换对应的数据不会通过 DMA 进行传输。这意味着可将传输到 RAM 的所有数据都视为有效数据。根据 OVRMOD 位的配置,可保留或覆盖数据。根据应用用途的不同,推荐使用两种不同的 DMA 模式(在单 ADC 模式下,使用 ADCx_CFGR寄存器中的 DMNGT 位配置单次模式;在双重 ADC 模式下,使用 ADCx_CCR 寄存器中的 DAMDF位配置循环模式)。 在 ADC 准备就绪、采样结束、转换结束(常规转换或注入转换)、序列转换结束(常规 转换或注入转换)、模拟看门狗 1/2/3 事件或溢出事件时生成中断 , [, a; T' H: R' ?/ Z ADC的转换模式 单次转换模式:在单次转换模式下,ADC 会将通道的所有转换执行一次。转换完成后,ADC 会停止工作,直至发生新的外部常规或注入触发,或者 ADSTART 或 JADSTART 位再次置 1。(要转换单个通道,可将序列长度编程为 1。)转换的具体流程请参阅官方手册。: ~+ z3 g, i, c% ? m5 z 连续转换模式:该模式仅适用于常规通道。在连续转换模式下,如果发生软件或硬件常规触发事件,ADC 会将通道的所有常规转换执行 一次,随后会自动重启并持续执行序列的每个转换。(要转换单个通道,可将序列长度编程为 1。)转换的具体流程请参阅官方手册。 Q7 A& G! y* S/ R7 a( } 触发注入模式:通过外部触发或将 ADCx_CR 寄存器中的 ADSTART 位置 1 来启动常规通道组转换。(使用触发注入时,必须确保触发事件之间的间隔长于注入序列。例如,如果序列长度为 20 个 ADC 时钟周期(即,采样时间为 1.5 个时钟周期的两次转换),则触发事件的最小间隔不能 小于 21 个 ADC 时钟周期。)# T' [9 l4 k) s' q7 f 自动注入模式:参阅手册。 不连续模式:常规组模式:该模式用于转换含有 n (n ≤ 8) 个转换的短序列(子组)。转换完所有子组后,下一个触发信号将启动第一个子组的转换。(不能同时使能不连续模式和连续模式。)。注入组模式:参阅手册。1 `: I2 _0 ^" f. ~4 j ADC最大转换速率 开始转换之前, ADC 必须在待测量电压源与 ADC 内置采样电容之间建立直接连接。该采样时间必须足以使输入电压源为嵌入式电容充电至输入电压水平。对各通道进行采样时可以使用不同的采样时间,可选采样时间值如下:1 l5 w( R- g, {, O% h4 r SMP = 000:1.5 个 ADC 时钟周期 SMP = 001:2.5 个 ADC 时钟周期 SMP = 010:8.5 个 ADC 时钟周期 SMP = 011:16.5 个 ADC 时钟周期7 g* t& B. `4 Y K/ q H$ ? SMP = 100:32.5 个 ADC 时钟周期 SMP = 101:64.5 个 ADC 时钟周期& H" s0 N* Z+ k2 n SMP = 110:387.5 个 ADC 时钟周期 SMP = 111:810.5 个 ADC 时钟周期 总转换时间的计算公式如下:" ]# h7 b4 H: z2 j- @ 示例: 如果 Fadc_ker_ck = 24 MHz,采样时间为 1.5 个 ADC 时钟周期(14 位模式): = (1.5 + 7.5) 个 ADC 时钟周期 = 9 个 ADC 时钟周期 = 0.375 μs(对于快速通道 的 14 位模式)。, A& j2 x0 Y; A; U 通过对控制位 RES[1:0] 进行编程,可将分辨率配置为 16 位、 14 位、 12 位、 10 位、 8 位。对于不要求使用高数据精度的应用,分辨率越低,转换时间越短,降低分辨率可缩短逐次逼近步骤所需的转换时间,如下表所示。 |
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
【Wio Lite AI视觉开发套件】+cube.ai与食物识别
【STM32H7S78-DK】汽车仪表系统
【STM32H7S78-DK】基于 rtthread 适配 lcd 驱动移植 lvgl
【STM32H7S78-DK评测】TouchGFX (QR Code)二维码生成器
【STM32H7S78-DK】rtthread 增加 psram 内存管理
【STM32H7S78-DK】开箱与rtthread工程初体验
【STM32H7S78-DK评测】-5 LVGL&DMA2D DEMO测试
【STM32H7S78-DK评测】-4 LTDC&DMA2D 基本测试
【STM32H7S78-DK评测】CoreMark移植和优化--兼记printf重定向实现方法及常见问题
想请问一下,文章中说可以选择外部参考电压Vref,那么这个Vref可以自定义吗?例如选定为5V,还是说和框图里面描述的只能是1.6v~3.6v