![](/img/trans.png)
[英]Stm32 ADC (via DMA) Error code 4 when restaring the ADC(DMA)
[英]STM32 ADC DMA. When MCU is informed about end of ADC?
我将 ADC 与 DMA(STM32F4,ide STM32CubeIDE)一起使用,我认为我了解它是如何工作的,但仍然有一个难题。 根据我的理解 MCU 只在 DMA 传输完成时调用,基本上 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 中。 欢迎任何想法
阅读 uC 文档 - 不要从“魔法”HAL 函数开始。
ADC 转换之间的 1ms 周期绝对算不上什么。 我有许多项目使用双重或三重 ADC 模式,结果采样率为 18MSPS。
一般来说,如果你想要糟糕、缓慢、低效和“偶然”工作的代码 - 使用 HAL。 否则,请学习您的硬件并改用寄存器。
我是这样解决这个问题的:我改变了 DMA 配置。 DMA 被配置为工作在循环模式,这意味着当 ADC 完成一次转换时,DMA 存储数据并通过以下方式通知 MCU
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
基本上每 49.5uS 通知 MCU 并且我的目的太密集(我每 1mS 需要一次 ADC 结果)。 我创建了一个计时器,用于在需要开始采样时指示 ADC,并且在正常模式下使用 DMA(ADC 将只进行 1 次测量)来解决我的问题。 每 1mS 从 ADC 得到结果。 所以技巧是在 DMA 模式(循环/正常模式)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.