试图了解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
-JDR4
或JDR[4]
),然后软件可以在序列完成后读取结果,这可以通过轮询 ISR
寄存器中的 JEOS
位,或通过 IER
.
中的 JEOSIE
位启用中断来检测
可以在常规序列完成时自动启动注入序列(CFGR
中的 JAUTO
位),这样就可以在每个 ADC 单元上连续启动 5 次转换, 最后将结果存入不同的寄存器。
定期开始转换
您可以设置一个定时器来直接启动 ADC 转换序列,而不是每次都通过软件启动转换。
首先,请参阅参考手册中标题为外部触发和触发极性转换(EXTSEL、EXTEN、JEXTSEL、JEXTEN)的章节。有常规和注入序列的可能触发事件列表。从 table 中选择一个 TRGO 事件,相应地设置 EXTSEL
和 EXTEN
,或 JEXTSEL
和 JEXTEN
。
您现在可能想要启用序列结束中断(EOSIE
或 IER
中的 JEOSIE
),以便在序列完成时通知软件。
通过在CR1
中设置ADEN
和ADSTART
或JADSTART
来启动ADC,一旦定时器的触发信号到达,转换就会开始。
将您从上面的 table 中选择的定时器编程为所需的频率,并将 CR2
中的 MMS
位设置为 010
(更新)。定时器的每次溢出(更新)都会产生一个触发事件,启动下一个 ADC 转换序列。没有必要启用定时器中断。
使用更多 ADC 单元
如果您的控制器中有多个 ADC 单元,您可以在每个单元上使用相同的触发器同时启动它们。这样您就可以同时进行 2 或 3 次转换,或者最多启动 15 次转换并立即获得结果,而无需使用 DMA。
我很难理解 STM32 ADC 的工作原理。 我想做一些简单的事情,即。在 2 个 GPIO 上定期采样和转换 (@ 250Hz)。 现在我以 "dummy" 的方式完成了:在基本单模式下设置 ADC,然后在 250Hz 启动定时器,并在每次定时器中断时启动 ADC 以在每个通道上仅转换一个样本。但我认为这不是正确的做法,我担心样本之间的时间安排不够精确。 你能解释一下我应该如何将 ADC 配置为在给定数量的样本期间以给定频率连续 sample/convert 吗?我没有在网上找到太多有用的资源,参考手册也很复杂。 谢谢
常规或注入的转换序列
每个 ADC 可以处理两个要转换的通道列表,一个具有 16 个通道的常规序列 (SQR1
-SQR4
),以及一个具有 4 个通道的注入序列 (JSQR
) .
主要区别之一是常规转换将所有结果存储在单个共享数据寄存器 (DR
) 中,必须在下一个转换步骤完成之前读出并存储该寄存器。当有多个通道按一定顺序排列时,最好使用DMA 来存储转换结果。既然你要简单的东西,我就不讲DMA了。
注入的转换序列将每个结果存储在自己的寄存器中(JDR1
-JDR4
或JDR[4]
),然后软件可以在序列完成后读取结果,这可以通过轮询 ISR
寄存器中的 JEOS
位,或通过 IER
.
JEOSIE
位启用中断来检测
可以在常规序列完成时自动启动注入序列(CFGR
中的 JAUTO
位),这样就可以在每个 ADC 单元上连续启动 5 次转换, 最后将结果存入不同的寄存器。
定期开始转换
您可以设置一个定时器来直接启动 ADC 转换序列,而不是每次都通过软件启动转换。
首先,请参阅参考手册中标题为外部触发和触发极性转换(EXTSEL、EXTEN、JEXTSEL、JEXTEN)的章节。有常规和注入序列的可能触发事件列表。从 table 中选择一个 TRGO 事件,相应地设置 EXTSEL
和 EXTEN
,或 JEXTSEL
和 JEXTEN
。
您现在可能想要启用序列结束中断(EOSIE
或 IER
中的 JEOSIE
),以便在序列完成时通知软件。
通过在CR1
中设置ADEN
和ADSTART
或JADSTART
来启动ADC,一旦定时器的触发信号到达,转换就会开始。
将您从上面的 table 中选择的定时器编程为所需的频率,并将 CR2
中的 MMS
位设置为 010
(更新)。定时器的每次溢出(更新)都会产生一个触发事件,启动下一个 ADC 转换序列。没有必要启用定时器中断。
使用更多 ADC 单元
如果您的控制器中有多个 ADC 单元,您可以在每个单元上使用相同的触发器同时启动它们。这样您就可以同时进行 2 或 3 次转换,或者最多启动 15 次转换并立即获得结果,而无需使用 DMA。