目录
3.1 ADC DEEPPWD 和 ADC ADVREGEN
概述
本文主要介绍STM32H7的重要外设资源ADC的功能,文中首先介绍了ADC模块的特性,在整个STM32的内核中,使用的总线机制,线路连接方式,时钟选择来源等内容,还介绍了ADC功能的基本框架结构以及部分功能。
1 认识ADC模块
1.1 ADC介绍
STM32 H750 有3个ADC外设,其分别为:
1)ADC1 与 ADC2 紧密耦合,可在双重模式下运行( ADC1 为主器件)。
2)ADC3 单独进行实例化
每个 ADC 由 16 位逐次逼近模数转换器组成。每个 ADC 的复用通道多达 20 条。各种不同通道的 A/D 转换可在单次、连续、扫描或不连续采样模式下进行。 ADC 的结果存储在一个左对齐或右对齐的 32 位数据寄存器中。ADC 映射到 AHB 总线,从而可实现快速数据处理。ADC 具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或下限。内置硬件过采样器,可提高模拟性能,同时还能减轻 CPU 进行相关计算的负担。采用了高效的低功耗模式,在低频下可实现极低的功耗。
1.2 ADC的特征
1.2.1 高性能特征
item | 描述 |
---|---|
1 | 多达 2 个 ADC,可在双重模式下运行 |
2 | 可配置 16 位、 14 位、 12 位、 10 位或 8 位分辨率 |
3 | ADC 转换时间与 AHB 总线时钟频率无关 |
4 | 可通过降低分辨率来缩短转换时间 |
5 | 可管理单端输入或差分输入(可按通道进行编程) |
6 | AHB 从总线接口,可实现快速数据处理 |
7 | 自校准(偏移校准和线性度校准) |
8 | 可独立设置各通道采样时间 |
9 | 多达四条注入通道(对常规通道或注入通道的模拟输入分配完全可配置) |
10 | 硬件辅助准备注入通道的上下文,从而实现快速上下文切换 |
11 | 数据对齐以保持内置数据一致性 |
12 | 数据可由 GP-DMA 管理,基于 FIFO 实现常规通道转换 |
14 | 数据可连接到 DFSDM 进行后期处理 |
14 | 4 个专用数据寄存器供注入通道使用 |
1.2.2 过采样器
item | 描述 |
---|---|
1 | 32 位数据寄存器 |
2 | 过采样率可在 2x 到 1024x 之间进行调整 |
3 | 可编程数据右移和左移 |
1.2.3 低功耗特性
item | 描述 |
---|---|
1 | 速度自适应低功耗模式,可降低 ADC 在低频下工作时的功耗 |
2 | 可在实现慢速总线频率应用的同时保持最佳 ADC 性能 |
3 | 提供自动控制,可避免 ADC 在低 AHB 总线时钟频率应用中溢出(自动延迟模式) |
1.2.4 独立外部模拟输入通道
item | 描述 |
---|---|
1 | 专用 GPIO 焊盘有多达 6 条快速通道 |
2 | 专用 GPIO 焊盘有多达 14 条慢速通道 |
1.2.5 五条内部专用通道
item | 描述 |
---|---|
1 | 内部参考电压 (VREFINT),连接到 ADC3 |
2 | 内部温度传感器 (VSENSE),连接到 ADC3 |
3 | VBAT 监测通道 (VBAT/4),连接到 ADC3 |
4 | 内部 DAC 通道 1 和通道 2,连接到 ADC2 |
1.2.6 多种转换方式
item | 描述 |
---|---|
1 | 通过软件启动常规转换和注入转换 |
2 | 通过极性可配置的硬件触发器(内部定时器事件或 GPIO 输入事件)启动常规转换 和注入转换 |
1.2.7 多种转换模式
item | 描述 |
---|---|
1 | 每个 ADC 均可转换单条通道,也可扫描一系列通道 |
2 | 单次模式会在每次触发时对选定的输入执行一次转换 |
3 | 连续模式可连续转换选定的输入 |
4 | 不连续采样模式 |
2 ADC功能框图
2.1 ADC1和ADC2的功能框图
2.2 ADC 引脚和内部信号
2.2.1 ADC 内部输入/输出信号
2.2.2 ADC 输入/输出引脚
2.3 时钟
STM32H750的ADC模式是双时钟域架构,双时钟域架构意味着 ADC 时钟独立于 AHB 总线时
1)ADC 时钟可以是名为 adc_ker_ck 的特定时钟源,该时钟源独立于 APB 时钟,并与AHB 时钟异步。该时钟可在 RCC 中配置(有关如何生成 ADC 时钟 (adc_ker_ck) 专用时钟的更多信息,请参见 RCC 部分)。要选择此时钟方案,必须将 ADCx_CCR 寄存器的 CKMODE[1:0] 位复位。
2)ADC 时钟可由 ADC 总线接口的 AHB 时钟除以一个可编程的因数( 1、 2 或 4)来提供。在这种模式下,可选择可编程的分频系数(根据位 CKMODE[3:0],选择1、 2 或 4)。要选择此时钟方案, ADCx_CCR 寄存器的 CKMODE[1:0] 位不得为“00”。
ADC 时钟与 AHB 时钟的时钟比例限制
通常来讲, ADC 时钟与 AHB 时钟之比没有限制,但一些注入通道已编程的情况除外,此时, ADC 时钟与 AHB 时钟之比必须遵循以下规定:
1)如果所有通道的分辨率均为 16 位、 14 位、 12 位或 10 位,则 FHCLK >= FADC / 4
2)如果一些通道的分辨率为 8 位(且所有通道的分辨率均不低于 8 位),则 FHCLK >= FADC / 3
2.4 ADC1/2/3 连接
ADC1 和 ADC2 紧密耦合并共用某些外部通道,如下图所示。 ADC3 单独进行实例化,但会与 ADC1 和 ADC2 共享一些输入。
1) ADC-1连接图
2) ADC-2 连接图
3) ADC-3 连接图
3 ADC的功能介绍
3.1 ADC DEEPPWD 和 ADC ADVREGEN
ADC 默认处于深度掉电模式,在该模式下,其电源会在内部切断以降低泄漏电流(ADCx_CR寄存器中的 DEEPPWD 位的复位状态为 1)。要开始 ADC 操作,需要先将 DEEPPWD 位清零,使 ADC 退出深度掉电模式。然后,必须将 ADCx_CR 寄存器中的 ADVREGEN 位置 1,以使能 ADC 内部稳压器。软件必须在 ADC 稳压器的启动时间 (TADCVREG_STUP) 内等待,之后才能开始校准或使能 ADC。该延迟必须通过软件实现。
ADC x 控制寄存器 (ADCx_CR)( x=1 到 3)
位 29 DEEPPWD:深度掉电使能 (Deep-power-down enable)
此位由软件置 1 和清零,用于使 ADC 进入深度掉电模式。
0: ADC 未处于深度掉电模式
1: ADC 处于深度掉电模式(默认复位状态)
注: 仅当 ADC 已禁止时(ADCAL=0、 JADSTART=0、 JADSTP=0、 ADSTART=0、ADSTP=0、 ADDIS=0 且 ADEN=0),才允许通过软件对此位执行写操作。
位 28 ADVREGEN: ADC 稳压器使能 (ADC voltage regulator enable)
此位由软件置 1,用于使能 ADC 稳压器。执行启动校准或使能 ADC 等操作之前,必须先使能 ADC 稳压器,并且软件必须等待稳压器启动时间。
0:禁止 ADC 稳压器
1:使能 ADC 稳压器
ADC 深度掉电模式(DEEPPWD) 和 ADC 稳压器 (ADVREGEN)。仅当 ADC 已禁止(ADCAL=0、 JADSTART=0、 ADSTART=0、 ADSTP=0、 ADDIS=0 且ADEN=0),才能通过软件对该位域进行编程。
3.2单端通道和差分输入通道
可通过写入 ADCx_DIFSELDIFSEL 寄存器中的 [19:0] 位将通道配置为单端输入或差分输入。必须在禁止 ADC (ADEN=0) 时写入此配置。
在单端输入模式下,要为通道“i” 转换的模拟电压是外部电压 VINP[i](正输入)与 VREF-(负输入)之差。
在差分输入模式下,要为通道“i” 转换的模拟电压是外部电压 VINP[i](正输入)与 VINN[i](负输入)之差。
差分模式的输出数据是无符号数据。当 VINP[i] 为 VREF-、 VINN[i] 为 VREF+ 时,输出数据为0x0000( 16 位分辨率模式);当 VINP[i] 为 VREF+、 VINN[i] 为 VREF- 时,输出数据为0xFFFF。
ADC x 差分模式选择寄存器 (ADCx_DIFSEL)( x=1 到 3)
位 19:0 DIFSEL[19:0]:
通道 19 到 0 的差分模式 (Differential mode for channels 19 to 0)这些位将由软件置 1 和清零。它们用于选择将通道配置为单端模式或差分模式。
DIFSEL[i] = 0:将 ADC 模拟输入通道 i 配置为单端模式
DIFSEL[i] = 1:将 ADC 模拟输入通道 i 配置为差分模式
注: 仅当 ADC 已禁止时( ADCAL=0、 JADSTART=0、 JADSTP=0、 ADSTART=0 ADSTP=0、ADDIS=0 且 ADEN=0),才允许通过软件对这些位执行写操作。
3.3 校准功能
每个 ADC 均提供有自动校准过程,用于驱动包括 ADC 上电/ 掉电序列在内的所有校准序列。在校准过程中, ADC 会计算校准系数( 11 位偏移值或 160 位线性度值),并会在下一次掉电之前在自身内部应用该值。在校准过程中,应用不得使用 ADC,必须等待至校准完成。
执行任何 ADC 操作之前都必须进行校准。校准可消除各芯片间的系统误差,并可补偿偏移和线性度偏差。
单端输入转换与差分输入转换应用的偏移校准系数有所不同:
1)启动要为单端输入转换应用的校准之前,写入 ADCALDIF=0。
2)启动要为差分输入转换应用的校准之前,写入 ADCALDIF=1。
无论采用单端配置还是差分配置,都只能进行一次线性度校准。
1)发起将同时运行偏移校准和线性度校准的校准之前,写入 ADCALLIN=1。
2)发起只运行偏移校准而不运行线性度校准的校准之前,写入 ADCALLIN=0。
随后,通过软件将 ADCAL 位置 1 发起校准。仅当 ADC 禁止 (ADEN=0) 后,才能发起校准。 ADCAL 位在所有校准序列过程中保持为 1。校准完成后,此位会立即由硬件清零。此时,相关校准系数会存储在模拟 ADC 内部,同时还会存储在 ADCx_CALFACT 寄存器的CALFACT_S[10:0] 或 CALFACT_D[10:0] 位中(具体取决于是单端输入校准还是差分输入校准)。可通过将 ADCx_CALFACT2 寄存器的 ADEN 位置 1 的方式访问 16 位线性度校准系数。
如果禁止 ADC (ADEN=0),则会保留内部模拟校准。但如果长时间禁止 ADC,建议在重新使能 ADC 之前运行新的校准周期。每次 ADC 掉电时,内部模拟校准都会丢失(例如,产品进入待机模式或 VBAT 模式时)。这种情况下,为了避免浪费时间重新校准 ADC,可将校准系数重新写入 ADCx_CALFACT和 ADCx_CALFACT2 寄存器,但前提是软件之前保存了上次校准时得出的校准系数。如果 ADC 已使能但未进行转换( ADEN=1、 ADSTART=0 且 JADSTART=0),可写入校准系数。随后,下次转换启动时,校准系数会自动添加到模拟 ADC 中。这一载入过程是透明的,不会对转换的启动造成延迟。建议在 VREF+ 电压变化超过 10% 时重新进行校准。线性校准需要 131072 个 ADC 时钟周期,偏移校准需要 520 个 ADC 时钟周期。
ADC x 校准系数寄存器 (ADCx_CALFACT)( x=1 到 3)
位 26:16 CALFACT_D[10:0]:差分模式下的校准系数 (Calibration Factors in differential mode)
这些位可由硬件或软件写入。差分输入校准完成后,会立即由硬件更新为校准系数。软件可向这些位写入新的校准系数。如果新校准系数不同于当前存储于模拟 ADC 中的校准系数,启动新的差分校准后,会立即应用新校准系数。
注: 仅当 ADEN=1、 ADSTART=0 且 JADSTART=0 时(ADC 已使能、当前未执行任何校准和转换),才允许通过软件对这些位执行写操作。
位 10:0 CALFACT_S[10:0]:单端模式下的校准系数 (Calibration Factors In Single-Ended mode)
这些位可由硬件或软件写入。单端输入校准完成后,会立即由硬件更新为校准系数。
软件可向这些位写入新的校准系数。如果新校准系数不同于当前存储于模拟 ADC 中的校准系数,启动新的单端校准后,会立即应用新校准系数。
注: 仅当 ADEN=1、 ADSTART=0 且 JADSTART=0 时(ADC 已使能、当前未执行任何校准和转换),才允许通过软件对这些位执行写操作。
ADC x 校准系数寄存器 2 (ADCx_CALFACT2)( x=1 到 3)
位 29:0 LINCALFACT[29:0]:线性度校准系数 (Linearity Calibration Factor)
这些位可由硬件或软件写入。这些位存储 160 位线性度校准系数中的 30 位。单端输入校准完成后,会立即由硬件更新为校准系数。软件可向这些位写入新的校准系数。如果新校准系数不同于当前存储于模拟 ADC 中的校准系数,启动新的单端校准后,会立即应用新校准系数。
注: 仅当 ADEN=1、 ADSTART=0 且 JADSTART=0 时(ADC 已使能、当前未执行任何校准和转换),才允许通过软件对这些位执行写操作。