试图了解STM32L4的ADC

Trying to understand ADC of STM32L4

我很难理解 STM32 ADC 的工作原理。 我想做一些简单的事情,即。在 2 个 GPIO 上定期采样和转换 (@ 250Hz)。 现在我以 "dummy" 的方式完成了:在基本单模式下设置 ADC,然后在 250Hz 启动定时器,并在每次定时器中断时启动 ADC 以在每个通道上仅转换一个样本。但我认为这不是正确的做法,我担心样本之间的时间安排不够精确。 你能解释一下我应该如何将 ADC 配置为在给定数量的样本期间以给定频率连续 sample/convert 吗?我没有在网上找到太多有用的资源,参考手册也很复杂。 谢谢

常规或注入的转换序列

每个 ADC 可以处理两个要转换的通道列表,一个具有 16 个通道的常规序列 (SQR1-SQR4),以及一个具有 4 个通道的注入序列 (JSQR) .

主要区别之一是常规转换将所有结果存储在单个共享数据寄存器 (DR) 中,必须在下一个转换步骤完成之前读出并存储该寄存器。当有多个通道按一定顺序排列时,最好使用DMA 来存储转换结果。既然你要简单的东西,我就不讲DMA了。

注入的转换序列将每个结果存储在自己的寄存器中(JDR1-JDR4JDR[4]),然后软件可以在序列完成后读取结果,这可以通过轮询 ISR 寄存器中的 JEOS 位,或通过 IER.

中的 JEOSIE 位启用中断来检测

可以在常规序列完成时自动启动注入序列(CFGR 中的 JAUTO 位),这样就可以在每个 ADC 单元上连续启动 5 次转换, 最后将结果存入不同的寄存器。

定期开始转换

您可以设置一个定时器来直接启动 ADC 转换序列,而不是每次都通过软件启动转换。

首先,请参阅参考手册中标题为外部触发和触发极性转换(EXTSEL、EXTEN、JEXTSEL、JEXTEN)的章节。有常规和注入序列的可能触发事件列表。从 table 中选择一个 TRGO 事件,相应地设置 EXTSELEXTEN,或 JEXTSELJEXTEN

您现在可能想要启用序列结束中断(EOSIEIER 中的 JEOSIE),以便在序列完成时通知软件。

通过在CR1中设置ADENADSTARTJADSTART来启动ADC,一旦定时器的触发信号到达,转换就会开始。

将您从上面的 table 中选择的定时器编程为所需的频率,并将 CR2 中的 MMS 位设置为 010(更新)。定时器的每次溢出(更新)都会产生一个触发事件,启动下一个 ADC 转换序列。没有必要启用定时器中断。

使用更多 ADC 单元

如果您的控制器中有多个 ADC 单元,您可以在每个单元上使用相同的触发器同时启动它们。这样您就可以同时进行 2 或 3 次转换,或者最多启动 15 次转换并立即获得结果,而无需使用 DMA。