一、方框图
二、ADC引脚
引脚 | 类型 | 作用 | 备注 |
---|---|---|---|
VREF+ | 输入 | ADC模拟参考正 | 1.62V ~ VDDA |
VDDA | 输入 | 模拟电源 | 1.62V~3.6V |
VREF- | 输入 | ADC模拟参考负 | VSSA |
VSSA | 输入 | 模拟地 | VSS |
VINP[19:0] | 输入 | ADC正输入模拟通道 | 连接外部通道:ADCx_INPi 或 内部通道。 |
VINN[19:0] | 输入 | ADC负输入模拟通道 | 连接VREF-或者外部通道ADCx_INNi |
ADCx_INP[19:0] | 输入 | 外部模拟输入信号 | – ADCx_INP[0:5] fast channels – ADCx_INP[6:19] slow channels |
ADCx_INN[19:0] | 输入 | 外部模拟输入信号 | – ADCx_INP[0:5] fast channels – ADCx_INP[6:19] slow channels |
PCSEL[19:0] | 输入 | 通道预选控制信号 | 连接到GPIO,提前选择通道 |
三、时钟
1. 双时钟域架构
2. ADC时钟和AHB时钟之间的时钟比约束
3. BOOST bit control
四、ADC123通道连接
六、ADC深度掉电模式和ADC稳压器
默认情况下,ADC处于深度掉电模式。要开始启用ADC操作,首先需要清除位DEEPPWD=0以推出深度掉电模式。其中,位DEEPPWD位于寄存器ADC_CR中。
然后需要通过在ADC_CR寄存器中设置ADVREGEN = 1来强制启动ADC内部稳压器。注意,稳压器的启动需要一定的时间。
ADC操作完成后,通过ADEN = 0禁用ADC。可以通过设置ADVREGEN = 0节约功耗。进一步地,可以设置 DEEPPWD=1使ADC重新进入深度掉电模式以降低更多功耗。
写入DEEPPWD=1将自动禁用ADC稳压器,位ADVREGEN将自动清除。
七、单端和差分输入通道
可以通过写入ADC_DIFSEL寄存器中的位DIFSEL[19:0]来为通道配置为单端输入或差分输入。
此配置必须在ADC禁用时写入(ADEN=0)。
在单端输入模式下,通道“i”要转换的模拟电压为外部电压VINP[i](正输入)和VREF-(负输入)之间的差值。
在差分输入模式下,通道“i”要转换的模拟电压是外部电压VINP[i](正输入)和VINN[i](负输入)之间的差值。
八、校准
校准是ADC操作的先决条件。它消除了芯片之间可能存在的系统误差,并允许补偿偏移和线性偏差。
应用于单端输入转换的偏移量校准因子与应用于差分输入转换的因子不同:在启动校准之前写入ADCALDIF=0,该校准将应用于单端输入转换;在启动校准前写入ADCALDIF=1,该校准将应用于差分输入转换。
线性校正必须只做一次,无论单/微分配置。在启动校准之前写入ADCALLIN=1,这将运行线性校准与偏移校准同时进行;在启动校准之前写入ADCALLIN=0,该校准将不运行线性校准而只运行偏移校准。
然后通过设置位ADCAL=1由软件启动校准。校准只能在ADC被禁用时启动(当ADEN=0时)。ADCAL位在所有校准序列中保持为1。一旦校准完成,它就会被硬件清除。此时,相关的校准因子存储在模拟ADC内部,也存储在ADC_CALFACT寄存器的CALFACT_S[10:0]或CALFACT_D[10:0]位中(取决于单端或差分输入校准)。160位线性校正因子可以使用ADC_CALFACT2寄存器访问,ADEN设置为1。
如果ADC被禁用(ADEN=0),内部模拟校准将被保留。但是,如果ADC被长期禁用,那么建议在重新启用ADC之前运行一个新的校准周期。
每次ADC的电源被移除时(例如,当产品进入待机或VBAT模式时),内部模拟校准就会丢失。在这种情况下,为了避免花费时间重新校准ADC,可以在不重新校准的情况下将校准因子重写到ADC_CALFACT和ADC_CALFACT2寄存器中,假设软件之前已经保存了前一次校准期间交付的校准因子。
如果启用ADC但没有转换(ADEN=1和ADSTART=0和JADSTART=0),则可以写入校准因子。然后,在下一次开始转换时,校准因子将自动注入模拟ADC。这种加载是透明的,不会为转换的开始添加任何周期延迟。当VREF+电压变化超过10%时,建议重新校准。
九、ADC开关控制 (ADEN, ADDIS, ADRDY)
一旦DEEPPWD=0和ADVREGEN=1,就可以启用ADC, ADC需要稳定时间tSTAB才能开始精确转换,如图140所示。两个控制位启用或禁用ADC:
•ADEN=1启用ADC。一旦ADC准备好操作,标志ADRDY将被设置。
•ADDIS=1禁用ADC。一旦模拟ADC被有效禁用,ADEN和ADDIS就会被硬件自动清除。
常规转换可以通过设置ADSTART=1(参见24.4.19节:外部触发器和触发器极性的转换(EXTSEL, EXTEN, JEXTSEL, JEXTEN)开始,或者当外部触发器事件发生时(如果触发器启用了)开始。
注入转换通过设置JADSTART=1开始,或者在外部注入触发器事件发生时(如果注入触发器是启用的)开始。
十、写入ADC控制位时的约束
只有当ADEN = 0时,才可以写入相应的位:RCC相关控制位以配置和使能ADC时钟;ADC_DIFSEL寄存器里的DIFSEL;ADCx_CCR寄存器;ADC_CR寄存器里的控制位ADCAL和ADEN。
只有当ADC被启用并且没有禁用ADC的请求时(ADEN必须等于1而ADDIS等于0),软件才被允许写入ADC_CR寄存器的控制位ADSTART, JADSTART和ADDIS。
对于ADC_CFGR、ADC_SMPRy、ADC_TRy、ADC_SQRy、ADC_JDRy、ADC_OFRy和ADC_IER寄存器的所有其他控制位:
•对于与常规转换配置相关的控制位,只有当ADC启用(ADEN=1)且没有正在进行的常规转换(ADSTART必须等于0)时,软件才允许写入它们。
•对于与注入转换配置相关的控制位,只有当ADC启用(ADEN=1)且没有注入转换进行时(JADSTART必须等于0),软件才允许写入它们。
只有当ADC被启用并最终转换,且没有暂停的禁用ADC的请求(ADSTART或JADSTART必须等于1且ADDIS等于0),软件才能在ADC_CR寄存器中写入ADSTP或JADSTP控制位。
当ADC被启用(ADEN=1)时,软件可以在任何时候写入寄存器ADC_JSQR。
只有当JADSTART被清除为0(没有注入转换正在进行)时,软件才被允许写入ADC_JSQR寄存器,除非上下文队列被启用(在ADC_CFGR寄存器中JQDIS=0)。
没有硬件保护来防止这些被禁止的写访问,ADC行为可能处于未知状态。要从这种情况中恢复,必须禁用ADC(清除ADEN=0以及ADC_CR寄存器的所有位)。
十一、通道道选择(SQRx, JSQRx)
It is possible to organize the conversions in two groups: regular and injected.
A group consists of a sequence of conversions that can be done on any channel and in any order.
A regular group is composed of up to 16 conversions. The regular channels and their order in the conversion sequence must be selected in the ADC_SQRy registers. The total number of conversions in the regular group must be written in the L[3:0] bits in the ADC_SQR1 register.
An injected group is composed of up to 4 conversions. The injected channels and their order in the conversion sequence must be selected in the ADC_JSQR register. The total number of conversions in the injected group must be written in the L[1:0] bits in the ADC_JSQR register.
要转换其中一个内部模拟通道,必须首先通过在ADCx_CCR寄存器中编程VREFEN、VSENSEEN或VBATEN位使能相应的模拟源。
十二、通道预选寄存器(ADC_PCSEL)
对于通过SQRx或JSQRx选择的每个通道,必须事先配置相应的ADC_PCSEL位。
十三、通道可编程采样时间(SMPR1, SMPR2)
在开始转换之前,ADC必须在被测电压源和ADC的嵌入式采样电容之间建立直接连接。这个采样时间必须足够让输入电压源将嵌入式电容充电到输入电压水平。
十四、单次转换模式(CONT=0)
在单一转换模式下,ADC执行一次所有通道的转换。
在常规转换序列中,每次转换完成后,转换后的数据被存在了32位的寄存器ADC_DR;设置了EOC(常规转换的结束)标志; 如果设置了EOCIE位,就会产生中断。
在常规转换序列完成后,设置了EOS(常规序列的结束)标志;如果设置了EOSIE位,就会产生一个中断。
在注入转换序列中,每次转换完成后,转换后的数据存在四个32位寄存器ADC_JDRy中的一个;JEOC(注入转换结束)标志被设置;如果设置了JEOCIE位,就会产生中断。
在注入序列完成后,设置JEOS(注入序列结束)标志;如果设置了JEOS位,则会产生一个中断。
然后ADC停止,直到一个新的外部规则或注入触发器发生,或直到位ADSTART或JADSTART再次设置。
注意:要转换单个通道,请编写一个长度为1的序列。
十五、连续转换模式(CONT=1)
连续转换模式仅适用于常规通道( regular channels )。
在连续转换模式中,当软件或硬件常规触发事件发生时,ADC执行一次通道的所有常规转换,然后自动重新启动并连续转换序列的每个转换。通过外部触发器或在ADC_CR寄存器中设置ADSTART位,该模式以CONT位为1开始。
在常规序列中,每次转换完成后,转换的数据存储到32位的ADC_DR寄存器中;设置EOC(转换结束)标志;如果设置了EOCIE位,则会产生一个中断。
在常规转换序列完成后,设置EOS(序列结束)标志位;如果设置了EOSIE位,就会产生一个中断。
然后,一个新的序列立即重新启动,ADC不断重复转换序列。
十六、转换开始 (ADSTART , JADSTART)
软件通过设置ADSTART=1启动ADC常规转换。
当设置ADSTART时,转换开始:立即:如果EXTEN = 0x0(软件触发器);在所选常规硬件触发器的下一个活动边缘:如果EXTEN /= 0x0。
软件通过设置JADSTART=1启动ADC注入转换。
当JADSTART设置时,转换开始:立即,如果JEXTEN = 0x0(软件触发器);在所选注入硬件触发器的下一个活动边缘:如果JEXTEN /= 0x0。
在自动注入模式(JAUTO=1)中,使用ADSTART位启动常规转换,然后是自动注入转换(JADSTART必须保持清除)。
ADSTART和JADSTART还提供关于当前是否正在进行任何ADC操作的信息。当ADSTART=0和JADSTART=0都为true时,可以重新配置ADC,表示ADC处于空闲状态。
ADSTART在以下情况下会被硬件清零: