OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 540|回复: 25

求助:HAL_ADC_Start_DMA前不加HAL_DMA_Start_IT为什么采集不到数据啊

[复制链接]

1

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2024-7-14
在线时间
7 小时
发表于 2024-7-21 20:04:39 | 显示全部楼层 |阅读模式
1金钱
求求大佬帮帮,如题,HAL_ADC_Start_DMA函数内部不是调用了HAL_DMA_Start_IT,在学习正点原子代时HAL_ADC_Start_DMA前加HAL_DMA_Start_IT,我把HAL_DMA_Start_IT删掉了,为什么采集不到数据了啊,加上他就能采集的到

最佳答案

查看完整内容[请看2#楼]

图一这里的函数指针赋值了,导致图二stm32f1xx_hal_dma.c的 HAL_DMA_Start_IT中的判断中断使能if(NULL != hdma->XferHalfCpltCallback)成立 只要改成图二中蓝色圈住的地方就可以去掉HAL_DMA_Start_IT(&g_dma_adc_handle, (uint32_t)&ADC1->DR, mar, 0); 只使用HAL_ADC_Start_DMA(&g_adc_dma_handle, &mar, 0);还有一点,如图三,&mar要改成(uint32_t *)mar
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-7-21 20:04:40 | 显示全部楼层
本帖最后由 godark 于 2024-7-23 09:34 编辑

1.png 2.png 3.png
图一这里的函数指针赋值了,导致图二stm32f1xx_hal_dma.c的
HAL_DMA_Start_IT中的判断中断使能if(NULL != hdma->XferHalfCpltCallback)成立
只要改成图二中蓝色圈住的地方就可以去掉HAL_DMA_Start_IT(&g_dma_adc_handle, (uint32_t)&ADC1->DR, mar, 0);
只使用HAL_ADC_Start_DMA(&g_adc_dma_handle, &mar, 0);还有一点,如图三,&mar要改成(uint32_t *)mar

回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-7-22 09:43:21 | 显示全部楼层
HAL_ADC_Start_DMA是以DMA传输方式启动了ADC,你不加启动DMA和开DMA中断方式的启动函数怎么获取数据呢?
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2024-7-14
在线时间
7 小时
 楼主| 发表于 2024-7-22 11:20:51 来自手机 | 显示全部楼层
godark 发表于 2024-7-22 09:43
HAL_ADC_Start_DMA是以DMA传输方式启动了ADC,你不加启动DMA和开DMA中断方式的启动函数怎么获取数据呢?

HAL_ADC_Start_DMA函数内部不是启动DMA和中断了
image.jpg
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2024-7-14
在线时间
7 小时
 楼主| 发表于 2024-7-22 11:32:33 来自手机 | 显示全部楼层
HAL_ADC_STAR_DMA函数内部
IMG_2762.jpeg
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-7-22 11:58:17 | 显示全部楼层
可能是寄存器操作顺序的问题
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-7-22 12:08:38 | 显示全部楼层
看了下原子例程,一个是操作ADC的,一个是操作DMA的,不知道你的是不是
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-7-22 14:16:43 | 显示全部楼层
微信截图_20240722140943.png
原子例程里DMA和ADC的初始化用了两个结构体,而且缺少g_adc_dma_handle.DMA_Handle=g_dma_adc_handle;这样的操作,所以在HAL_ADC_Start_DMA()里调用的HAL_DMA_Start_IT()没有与DMA产生联系,所以需要在HAL_ADC_Start_DMA()前写HAL_DMA_Start_IT(&g_dma_adc_handle, (uint32_t)&ADC1->DR, mar, 0);来启动DMA
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2024-7-14
在线时间
7 小时
 楼主| 发表于 2024-7-22 14:43:34 来自手机 | 显示全部楼层
这里传进去hadc->DMA_Handle,hadc->DMA_Handle在_HAL_LINKDMA函数里被g_dma_adc_handle初始化了吧
C0F5E5149F4B0D794168C38A6030F4BE.png
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2024-7-14
在线时间
7 小时
 楼主| 发表于 2024-7-22 14:51:32 来自手机 | 显示全部楼层
g_adc_dma_handle.DMA_Handle=g_dma_adc_handle;这个操作应该在_HAL_LINKDMA里执行过了吧
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-7-22 15:17:29 | 显示全部楼层
17387010086 发表于 2024-7-22 14:51
g_adc_dma_handle.DMA_Handle=g_dma_adc_handle;这个操作应该在_HAL_LINKDMA里执行过了吧

嗯,是的,在原子的例程里是连接上了
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-7-22 15:32:03 | 显示全部楼层
你有没有换原子的例程删除HAL_DMA_Start_IT试试
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2024-7-14
在线时间
7 小时
 楼主| 发表于 2024-7-22 15:35:23 | 显示全部楼层
还没试过,一会去试试哈
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-7-22 15:45:26 | 显示全部楼层
17387010086 发表于 2024-7-22 15:35
还没试过,一会去试试哈

嗯,好
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2024-7-14
在线时间
7 小时
 楼主| 发表于 2024-7-22 16:45:07 | 显示全部楼层
也不行,我删除HAL_DMA_Start_IT,调试了一下,他进入HAL_ADC_Start_DMA()出来后函数后程序卡住了,
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2024-7-14
在线时间
7 小时
 楼主| 发表于 2024-7-22 16:46:49 来自手机 | 显示全部楼层
调试的图片。
C658A8FED601EBF7A0A856253216F161.png
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-7-22 16:48:31 | 显示全部楼层
17387010086 发表于 2024-7-22 16:45
也不行,我删除HAL_DMA_Start_IT,调试了一下,他进入HAL_ADC_Start_DMA()出来后函数后程序卡住了,

你可以调试下看看卡在哪个位置了,感觉像是寄存器标志位判断的位置有问题
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2024-7-14
在线时间
7 小时
 楼主| 发表于 2024-7-22 16:51:42 | 显示全部楼层
godark 发表于 2024-7-22 16:48
你可以调试下看看卡在哪个位置了,感觉像是寄存器标志位判断的位置有问题

就是这个位置
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-7-22 16:52:48 | 显示全部楼层
好像只有ADC的DMA使能那个位置有个while
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2024-7-14
在线时间
7 小时
 楼主| 发表于 2024-7-22 16:54:23 来自手机 | 显示全部楼层
就是这个位置
8B0782668659FA89DB4539C729ACA454.png
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-7-22 17:09:43 | 显示全部楼层

哥们儿,图不清楚啊,看不成
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-7-22 17:15:32 | 显示全部楼层
微信截图_20240722171340.png
你先看看屏幕有显示没,或者没屏幕卡住没,然后看看能不能运行到大循环,确定ADC的DMA使能函数卡住没
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-7-22 17:20:18 | 显示全部楼层
我回家测试测试,这会儿快下班了
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2024-7-14
在线时间
7 小时
 楼主| 发表于 2024-7-22 18:16:06 | 显示全部楼层
H2Z@)S2H(NHZ}PY8TU153_1.png 不好意思,兄弟,刚刚被限制回复了,第一次用这个网站,还没弄明白电脑怎么发图,手机发出来的图是糊的,不开启HAL_DMA_Start_IT,LCD屏幕是白的,卡在adc_dma_init里没出来,哈哈哈,谢谢你哈,哥
本版积分规则参与/回复主题
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2024-7-14
在线时间
7 小时
 楼主| 发表于 2024-7-23 11:42:15 | 显示全部楼层
QQ图片20240723113619.png 啊啊啊啊,谢谢哥,太牛啦,解决我两个困惑,我之前一直是认为HAL_ADC_Start_DMA里的HAL_DMA_Start_IT函数传参错了应该是HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)*pData, Length);但是我改了后还是没有反应,原来还有HAL_ADC_Start_DMA里调用HAL_DMA_Start_IT开启了办传输中断,导致函数一直在触发班传输中断,所以卡住,应该是这样子吧?感谢感谢老哥
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-7-23 12:05:29 | 显示全部楼层
17387010086 发表于 2024-7-23 11:42
啊啊啊啊,谢谢哥,太牛啦,解决我两个困惑,我之前一直是认为HAL_ADC_Start_DMA里的HAL_DMA_Start_IT函数 ...

对,半传输中断是在判断半传输完成回调函数后使能了,就不断的进中断函数,中断函数又是判断传输完成中断进入操作状态标志,这导致只能进中断,但咋就进不去处理状态标志,也就像卡住了一样,其实一直在进中断,实际DR寄存器的值一直在变,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 12:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表