[STM32F0]

ADC 读取STM32F030无法重复读取?

[复制链接]
261|10
手机看帖
扫描二维码
随时随地手机跟帖
咚了个咚|  楼主 | 2025-4-4 13:50 | 显示全部楼层 |阅读模式
在 STM32CubeIDE 中建了一个测试项目进行ADC数据采集。
在 Cube 项目中定义了 8 个ADC通道,并使用 DMA 和回调函数。
在启动时,调用 HAL_ADC_Start_DMA() ,在主循环中,读数完成从串行端口中转发出来,然后使用 HAL_ADC_Start_DMA() 开始另一次转换。
问题时是,如果我尽可能快地运行这些读取,正常工作。但是,如果我每 500 毫秒读取一次,则只会读到第一次数据。后续读取***不会完成。


使用特权

评论回复
公羊子丹| | 2025-4-5 07:40 | 显示全部楼层
我之前遇到过类似问题,后来发现HAL_ADC_Start_DMA()之前一定要先调用HAL_ADC_Stop_DMA(),否则ADC不会重新触发转换。

使用特权

评论回复
周半梅| | 2025-4-5 07:41 | 显示全部楼层
你有没有检查HAL_ADC_ConvCpltCallback有没有被触发?如果没有触发,说明转换压根没开始成功。

使用特权

评论回复
帛灿灿| | 2025-4-5 07:42 | 显示全部楼层
STM32F0的DMA一次转换后不会自动循环,除非你用了circular模式,检查一下DMA配置是不是normal模式?

使用特权

评论回复
童雨竹| | 2025-4-5 07:43 | 显示全部楼层
我建议你在每次开始新的转换前都检查HAL_ADC_GetState的返回状态,看看ADC有没有卡在busy状态。

使用特权

评论回复
万图| | 2025-4-5 07:44 | 显示全部楼层
有可能你每500ms读一次时,主循环中DMA数据还没清理干净,导致下一次转换没启动成功,建议确认上一轮有没有stop干净。

使用特权

评论回复
Wordsworth| | 2025-4-5 07:45 | 显示全部楼层
试试用HAL_ADC_Stop_DMA再加HAL_ADC_DeInit/Init做一次完整复位,我之前搞不定就是靠这个方式强制重启ADC。

使用特权

评论回复
Bblythe| | 2025-4-5 07:45 | 显示全部楼层
你是多个通道采样,DMA的缓冲区是不是够大?要是长度不对,DMA会提早触发完成中断但数据没装满。

使用特权

评论回复
Pulitzer| | 2025-4-5 07:46 | 显示全部楼层
你有没有在转换完成之后打断点看回调函数有没有进入?也可能是你串口输出太慢,阻塞了下一次启动。

使用特权

评论回复
Uriah| | 2025-4-5 07:47 | 显示全部楼层
我建议你用一个定时器每500ms触发ADC启动,稳定性会好很多,比在主循环里判断时间更可靠。

使用特权

评论回复
Clyde011| | 2025-4-5 07:48 | 显示全部楼层
这个现象很像HAL有状态没清理好,你可以试下HAL_ADC_PollForConversion的方式单步看看,是不是DMA启动后ADC根本没转换。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

10

帖子

0

粉丝