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

ADC_DMA传输后,状态位一直处于忙

[复制链接]
封刀岁月不为峥嵘 提问时间:2023-11-22 16:11 / 未解决

STM32L431 在进行ADC_DMA传输后,状态位一直处于忙,debug发现并没有进入ADC中断(已开启中断)

QQ截图20231122160639.png

收藏 评论10 发布时间:2023-11-22 16:11

举报

10个回答
xmshao 回答时间:2023-11-22 17:25:23
信息有点少。从你给出来的几行代码来看,不能断定你是否调错了回调函数,毕竟回调函数可以自行再组织编写。


不过,你确认下是否同时开启了ADC事件的中断和DMA传输中断,若都开启了是否都有相应的中断服务程序。


如果按CubeMx创建工程来的话,相应中断都会有基本的中断服务代码和预留回调接口,至少不用担心标志位的清零这些。


我担心的就是你并没有沿用相关代码而是自行组织的,自己又只写了部分服务代码。当然,自行组织中断服务程序


是完全可以,要注意写的中断服务代码弄完整,别只处理DMA传输中断却忘却了ADC转换中断。 当然,这只是些


提醒,你自己再慢慢排查确认。
butterflyspring 回答时间:2023-11-22 16:43:47
中断的回调函数用错了。

看起来你是用了注入模式,可以用HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc) 回调函数。

不过要注意你是否是混合模式,如果是的话可以用 HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *AdcHandle)

试试看是否能执行。

这个官方库中有类似的例程可以参考。
watershade 回答时间:2023-11-22 16:18:32

为什么要在ISR里面执行while循环?

封刀岁月不为峥嵘 回答时间:2023-11-22 16:20:58

watershade 发表于 2023-11-22 16:18
为什么要在ISR里面执行while循环?

先别管这个问题,我程序对实时要求性不高,而且后续需要调用这个数组,不判断得话跑太快程序要出错。

watershade 回答时间:2023-11-22 16:28:19

封刀岁月不为峥嵘 发表于 2023-11-22 16:20
先别管这个问题,我程序对实时要求性不高,而且后续需要调用这个数组,不判断得话跑太快程序要出错。 ...

[md]你呆在ISR里面都不出来,你让比他低优先级的任务怎么中断?比方说你的ADC有没有可能优先级比你这个低?

即便是必须要实时性,也可以做个大循环。在这里只需要设置一个标记就成了。

传说中的路过 回答时间:2023-11-22 16:31:11

你的回调用错了,用HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);这是转换完成的中断

watershade 回答时间:2023-11-22 16:51:45

butterflyspring 发表于 2023-11-22 16:43
中断的回调函数用错了。</p>
<p>看起来你是用了注入模式,可以用HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleT ...

看回调函数不像是ADC的中断回调?

他应该是比较器中断了之后,触发ADC进行几次采集,采集完了再退出ISR。应该是ADC的优先级比这个低了。但这样操作其实很危险。ISR长期退不出。如果开了看门狗,分分钟歇菜。

封刀岁月不为峥嵘 回答时间:2023-11-22 17:07:13

watershade 发表于 2023-11-22 16:51</p>
<p>看回调函数不像是ADC的中断回调?

[md]你说中断优先级这个问题其实我做的时候就考虑到了,但是为了以防万一,我刚才还是把while放大循环了试了下。不过还是卡死在while,处于busy状态,在ADC传输中断和DMA传输完成中断打得断点也没能进入

封刀岁月不为峥嵘 回答时间:2023-11-22 17:08:29

butterflyspring 发表于 2023-11-22 16:43
中断的回调函数用错了。</p>
<p>看起来你是用了注入模式,可以用HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleT ...

我为了省功耗。采用的比较器触发ADC_DMA采样。所以这个是比较器中断函数,在比较器里面进行ADC_DMA传输。但是传输之后DMA一直处于忙状态

watershade 回答时间:2023-11-22 17:15:41

封刀岁月不为峥嵘 发表于 2023-11-22 17:08
我为了省功耗。采用的比较器触发ADC_DMA采样。所以这个是比较器中断函数,在比较器里面进行ADC_DMA传 ...

[md]理解,你看一下你ADC和COMP的优先级分别是多少?

所属标签

相似问题

官网相关资源

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