STM32 ADC DMA。何时通知 MCU ADC 结束?
Posted
技术标签:
【中文标题】STM32 ADC DMA。何时通知 MCU ADC 结束?【英文标题】:STM32 ADC DMA. When MCU is informed about end of ADC? 【发布时间】:2020-07-08 03:02:12 【问题描述】:我将 ADC 与 DMA(STM32F4,ide STM32CubeIDE)一起使用,我认为我了解它的工作原理,但仍有一个难题。据我了解,只有在 DMA 传输完成时才会调用 MCU,基本上 MCU 会在 DMA ADC 完成时进入这个函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
对吗?
如果这是真的,我有下一个难题:例如 adc_clock 是 10MHz,采样时间是 480 adc_cycles,12 位 adc 分辨率。 adc_sample_period = 1/10Mhz * (480 + 12 + 3) = 49.5uS。这意味着 MCU 将每 49.5uS 进入 HAL_ADC_ConvCpltCallback() ???就我的观点而言,这是一项艰巨的任务,尤其是在更大的项目中。有谁知道如何解决这个“问题”?例如,我想每 1mS 读取一次 ADC 结果,但也想将 DMA 实现到 ADC 中。欢迎任何想法
【问题讨论】:
您需要从规范开始。你要如何处理 ADC 值,实际需要什么分辨率和实时截止日期等等。如果您不需要硬实时解码信号,那么以高时钟速度捕获每个 ADC 转换是没有意义的。 @Lundin 我知道我将如何处理 adc 值。它将在公式中用于计算电流。分辨率为 12bit (0-4095) ,我在上面的文字中强调了这一点。我同意这样的说法,即每次读取 adc 为 49.5uS 是在浪费 MCU 资源。我需要每 1mS 一次 adc 值,也许是为了触发 ADC DMA? 先调低 ADC 转换时钟? 最小 adc 时钟为 5Mhz。 (APB2 / add_prescaler) = (40Mhz / 8) = 5Mhz。所以 1/5Mhz*(480 + 12 + 3) = 99uS 这对我来说太难了。我会尝试将计时器,我会报告结果 【参考方案1】:阅读 uC 文档 - 不要从“magic”HAL 函数开始。
ADC 转换之间的 1ms 周期绝对没有。我有很多项目使用双或三重 ADC 模式,结果采样率为 18MSPS。
一般来说,如果您想要糟糕、缓慢、低效和“意外”工作的代码,请使用 HAL。否则,请学习您的硬件并改用寄存器。
【讨论】:
感谢您的回答。我想使用 HAL 我没有时间详细阅读寄存器。我使用具有 ~9.7MSPS (1 / 49.5uS * 480) 的三重 ADC DMA。 @subavet995 你没有。如果转换需要 49.5us,那么您的转换率为 20kSPS。您显示的数字是 ADC 时钟而不是采样率。我的建议 - 从基础开始。 BTW HAL 将花费您比寄存器更多的时间。 \ 是的,你是对的。我会尝试用计时器解决这个问题【参考方案2】:这就是我解决此问题的方法:我更改了 DMA 配置。 DMA 被配置为在循环模式下工作,这意味着当 ADC 完成一次转换 DMA 存储数据并通过 MCU 通知
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
基本上每 49.5uS 通知一次 MCU,而我的目的是太密集了(我需要每 1mS 一次 ADC 结果)。我创建了计时器,用于在需要开始采样时指示 ADC,并在正常模式下使用 DMA(ADC 只会进行 1 次测量)来解决我的问题。每 1mS 从 ADC 得到结果。所以诀窍在于 DMA 模式(循环/正常模式)。
【讨论】:
以上是关于STM32 ADC DMA。何时通知 MCU ADC 结束?的主要内容,如果未能解决你的问题,请参考以下文章