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

与HAL_ADC_Start_DMA相关的一个十分怪异的问题

[复制链接]
dlyltm 提问时间:2024-12-12 16:41 / 已解决

本人用stm32CubeMX构建了stm32f407vet6程序,其中用TIM2启动ADC,通过DMA传送AD值。再用Keil开发应用程序,有用while语句等待指定时长的步骤,具体是在定时器中计数,达到设定值就结束等待,程序如下:

Sec=0;

while(Sec<xx);

现在奇怪的是只要在while语句前用HAL_ADC_Start_DMA函数启动了DMA,则while就无法结束了,明明Sec在定时器中正常计数了,而且通过开发工具也确认其值超过了指定值,但while就是无法结束,程序也无法往下运行。用各种方法都试了,包括用无限for循环在其中判断Sec,结果一样。而只要不调用HAL_ADC_Start_DMA或在while语句之后调用就没问题,请问这是什么缘故?很怀疑是编译器或芯片有bug,不知然否。

收藏 评论5 发布时间:2024-12-12 16:41

举报

5个回答
dlyltm 最优答案 回答时间:2024-12-13 16:03:35

问题已解决,应把AD的连续转换模式禁用。

STMWoodData 回答时间:2024-12-12 17:30:19

Sec定义前加volatile 试试?

xmshao 回答时间:2024-12-12 17:41:01
你可以将相关代码展示多些。


也可以顺便说说你使用的各种方法,这样避免别人重提你试过的方法。


另外,建议你将sec定义为 volatile. 假设没有这样定义的话。


还有就是,是否有中断优先级方面的问题。比方DMA中断发生了又没处理而频繁进入,TIMER中断却无法响应?


还有,代码优化等级别太高。

与HAL_ADC_Start_DMA相关的一个怪异问题
dlyltm 回答时间:2024-12-13 09:10:15

xmshao 发表于 2024-12-12 17:41
你可以将相关代码展示多些。</p>
<p>

那个Sec已经定义为volatile了。定时器中断肯定没问题,都能跟踪进去,Sec也一直在正常计数。没使用代码优化。

如您愿意,我可以把源代码都发给您。

dlyltm 回答时间:2024-12-13 09:10:45

STMWoodData 发表于 2024-12-12 17:30
Sec定义前加volatile 试试?

加了,没用。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版