试图了解STM32L4的ADC

时间:2018-04-24 10:39:36

标签: arm stm32 firmware adc

我很难理解STM32 ADC的工作原理。 我想做一些简单的事情,即。在2个GPIO上定期(@ 250Hz)进行采样和转换。 现在我在一个"虚拟"方式:在基本单模式下设置ADC,然后启动定时器@ 250Hz并在每个定时器中断启动ADC,以便在每个通道上仅转换一个样本。但我不认为这是正确的做法,我担心样本之间的时间安排缺乏精确性。 您能否解释一下如何配置ADC在给定数量的样本期间以给定频率连续采样/转换?我在网上找不到很多有用的资源,参考手册非常复杂。 谢谢

1 个答案:

答案 0 :(得分:1)

常规或注入转化序列

每个ADC可以处理两个要转换的通道列表,一个包含16个通道的常规序列(RNGgen - SQR1),以及一个包含4个通道(SQR4)的注入序列。 / p>

主要区别之一是常规转换将所有结果存储在单个共享数据寄存器(JSQR)中,必须在下一个转换步骤完成之前读取并存储。当常规序列中有多个通道时,最好使用DMA来存储转换结果。因为你想要一些简单的东西,我现在不会进入DMA。

注入的转换序列将每个结果存储在自己的寄存器(DR - JDR1JDR4)中,然后软件可以在序列完成后读取结果,可以检测到通过轮询JDR[4]寄存器中的JEOS位,或通过ISR中的JEOSIE位启用中断。

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

定期开始转换

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

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

您可能希望立即在JEXTEN中启用序列结束中断(EOSIEJEOSIE),以便在序列完成时通知软件。

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

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

使用更多ADC单元

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