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

与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 最优答案 回答时间:5 天前

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

STMWoodData 回答时间:6 天前

Sec定义前加volatile 试试?

xmshao 回答时间:6 天前
你可以将相关代码展示多些。


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


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


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


还有,代码优化等级别太高。
dlyltm 回答时间:5 天前

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

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

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

dlyltm 回答时间:5 天前

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

加了,没用。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版