请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103使用cubemx配置ADC和DMA导致delay函数无法使用的问题

[复制链接]
DII 提问时间:2022-5-17 21:55 / 未解决
[md][/md]
收藏 评论7 发布时间:2022-5-17 21:55

举报

7个回答
DII 回答时间:2022-5-17 21:59:29
用CUBEMX配置完adc和dma后在主函数中调用函数HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&DMA_value,6);

会导致while循环中的delay延时函数失效,具体情况是:
不打开ADC,delay函数正常使用,可以1S打印一次信息,
但是打开HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&DMA_value,6);函数后,打印频率不是1S,而是比1S快
同样,只使用ADC不使用DMA,在while循环之前打开HAL_ADC_Start_IT(&hadc1);,可以1S打印一次信息,
但是如果同时打开HAL_ADC_Start_IT(&hadc1);和HAL_ADC_Start(&hadc1);,就会导致打印的频率比1S快
有没有大佬知道如何解决问题


xmshao 回答时间:2022-5-18 07:28:58
你关注下中断优先级方面的问题,这里主要是DMA中断。另外,你打印是基于时间还是基于事件?
huanying 回答时间:2022-5-18 10:01:27
xmshao 发表于 2022-5-18 07:28
你关注下中断优先级方面的问题,这里主要是DMA中断。另外,你打印是基于时间还是基于事件? ...

delay延时用的是for while死循环,这种延时精度不高,当有频繁中断产生时,延时就会变长,如果要精准定时建议你使用定时器,并且用优先级别较高的定时器。
DII 回答时间:2022-5-18 10:25:51
huanying 发表于 2022-5-18 10:01
delay延时用的是for while死循环,这种延时精度不高,当有频繁中断产生时,延时就会变长,如果要精准定时 ...
这是我刚刚用F4芯片测试的程序  问题依旧 ,延时1S打印一次  但是使用ADC_DMA后打印频率非常高
DII 回答时间:2022-5-18 10:27:04
xmshao 发表于 2022-5-18 07:28
你关注下中断优先级方面的问题,这里主要是DMA中断。另外,你打印是基于时间还是基于事件? ...

我昨天可能没有表达清楚  程序是图一图二和图三   图一是1S打印一次
把程序改为图2后  (昨天)打印情况为1S打印10多次,但是找不到原因,
打开DMA传输,使用图三的程序后,还是1S打印10多次,(中断都是空函数)
但是今天早上再次调试,程序又正常了(程序一点都没变),挺玄学的

图3.PNG
图二.PNG
图一.PNG
DII 回答时间:2022-5-18 10:36:34
huanying 发表于 2022-5-18 10:01
delay延时用的是for while死循环,这种延时精度不高,当有频繁中断产生时,延时就会变长,如果要精准定时 ...

这是我刚刚用F4芯片测试的程序  问题依旧 ,延时1S打印一次  但是使用ADC_DMA后打印频率非常高
F4.PNG
huanying 回答时间:2022-5-18 11:18:21
DII 发表于 2022-5-18 10:36
这是我刚刚用F4芯片测试的程序  问题依旧 ,延时1S打印一次  但是使用ADC_DMA后打印频率非常高
...

printf  效率很低,最好不要用,而且你这是调试没什么用
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版