搜索
12
返回列表 发新帖
楼主: andrewsss

[求助] stm32CubeMX+ADC+DMA的问题

[复制链接]

该用户从未签到

7

主题

126

帖子

80

蝴蝶豆

金牌会员

最后登录
2021-4-6
发表于 2018-11-2 17:13:01 | 显示全部楼层
andrewsss 发表于 2018-11-2 16:33
调了优先级也不行;我的缓冲区大小就是1,就是一个uint32_t 的变量,所以设的1;我的要把ADC DMA中断的NV ...

只有1个数据用IT就好了。
DMA的Circle是会一直转换,转换了一半的数据会调用HAL_ADC_ConvHalfCpltCallback,转换完全部数据会调用HAL_ADC_ConvCpltCallback。然后一直循环。
你可以在HAL_ADC_IRQHandler开头加一句话看看是不是一直进入中断。或者把缓冲区开大点看看是不是没有问题了。
我用的就是CubeMX + ADC + DMA,缓冲区1000,一直没问题。


回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

212

帖子

16

蝴蝶豆

高级会员

最后登录
2019-9-21
 楼主| 发表于 2018-11-2 19:13:31 | 显示全部楼层
Dandjinh 发表于 2018-11-2 17:13
只有1个数据用IT就好了。
DMA的Circle是会一直转换,转换了一半的数据会调用HAL_ADC_ConvHalfCpltCallbac ...

我试过了,缓冲区开大点也不行,程序进入了DMA的中断一直循环,没有进入ADC的中断里
void DMA1_Channel1_IRQHandler(void)
{
  /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
        printf("DMA\n");
  /* USER CODE END DMA1_Channel1_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_adc1);
  /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */

  /* USER CODE END DMA1_Channel1_IRQn 1 */
}

void ADC1_2_IRQHandler(void)
{
  /* USER CODE BEGIN ADC1_2_IRQn 0 */
        printf("ADC\n");
  /* USER CODE END ADC1_2_IRQn 0 */
  HAL_ADC_IRQHandler(&hadc1);
  /* USER CODE BEGIN ADC1_2_IRQn 1 */

  /* USER CODE END ADC1_2_IRQn 1 */
}

但是我把DMA的中断程序注释掉,程序还是会中断,我只有把DMA的NVIC的配置也注释掉才不会进入中断,这是为什么
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

212

帖子

16

蝴蝶豆

高级会员

最后登录
2019-9-21
 楼主| 发表于 2018-11-2 19:17:03 | 显示全部楼层
Dandjinh 发表于 2018-11-2 17:13
只有1个数据用IT就好了。
DMA的Circle是会一直转换,转换了一半的数据会调用HAL_ADC_ConvHalfCpltCallbac ...

对了,我用的cubemx是4.27.0,库是STM32Cube_FW_F1_V1.6.0,
回复 支持 反对

使用道具 举报

该用户从未签到

53

主题

3438

帖子

61

蝴蝶豆

论坛元老

最后登录
2024-3-19
发表于 2018-11-2 20:43:13 | 显示全部楼层
andrewsss 发表于 2018-11-2 09:46
我的DMA存储变量adcvalue不是数组,所以我设置的1,DMA中断好像使用了DMA就开启了,没法关闭,我的cubemx ...

cube版本不一样,设置就不一样,一直在更新,也一直在完善吧。话说你就一个通道,采集量很小,没必要开DMA
回复 支持 反对

使用道具 举报

该用户从未签到

53

主题

3438

帖子

61

蝴蝶豆

论坛元老

最后登录
2024-3-19
发表于 2018-11-2 20:45:05 | 显示全部楼层
songshiqun2010 发表于 2018-11-1 22:31
将ADC DMA中断的NVIC使能代码屏蔽即可解决。。。
/**
  * Enable DMA controller clock

你说的很对
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

212

帖子

16

蝴蝶豆

高级会员

最后登录
2019-9-21
 楼主| 发表于 2018-11-3 14:38:25 | 显示全部楼层
今天又实验了几遍,发现使用circular模式时,如果main中阻塞在HAL_ADC_Start_DMA处(程序一直进入DMA1_Channel1_IRQHandler,导致后面的程序无法执行),可能还与ADC的采样周期(即Sampling Times)的值有关,原来我用的1.5,会阻塞,一直进入DMA中断(中断添加打印语句会一直打印);后来改成239.5,就不会阻塞,程序能正常执行下去,这个时候我想看它这时候有没有进入DMA中断,就在DMA中断中添加了一条打印语句,结果程序就一直在打印该语句,不能正常执行后面的程序了;我不懂根本问题在那里?
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

61

帖子

2

蝴蝶豆

中级会员

最后登录
2020-8-19
发表于 2018-11-8 17:39:51 | 显示全部楼层
andrewsss 发表于 2018-11-3 14:38
今天又实验了几遍,发现使用circular模式时,如果main中阻塞在HAL_ADC_Start_DMA处(程序一直进入DMA1_Chan ...

用中断时你一定要注意中断运行时间和你的中断时间间隔,如果每次中断之间的时间间隔小于一次进入中断运行的时间,那肯定会一直进中断,因为中断还没出来呢,下一次中断就来了,所以会一直进中断,其他程序就执行不了了。
另外,你说的加入打印命令,打印是很耗时间的,你的AD转换周期如果设置太小的话,不够一次打印时间,那肯定会一直反复进中断。打印子程序没用过,不知道是什么方式实现的,如果是中断方式的话,那么他执行打印的时候肯定会等待打印完成,这个时候如果发送中断优先级低于ADC优先级的话,是不会执行发送中断的,也就永远发送不完,也退不出ADC中断。这只是一种猜测,仅供参考。
中断程序一定简单,运行时间短,进去就出来,千万不能加太耗时的等待等语句。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

212

帖子

16

蝴蝶豆

高级会员

最后登录
2019-9-21
 楼主| 发表于 2018-11-9 10:21:01 | 显示全部楼层
zhengxk-344971 发表于 2018-11-8 17:39
用中断时你一定要注意中断运行时间和你的中断时间间隔,如果每次中断之间的时间间隔小于一次进入中断运行 ...

了解了,但是我还有个问题,前面我实验时它一直进DMA的中断,然后我把DMA中断服务函数注释了,结果程序还是好像进中断了,阻塞在那里不执行后面的代码了;再然后我按二楼说的把ADC DMA中断的NVIC使能代码注释掉,程序就能继续执行了;这是为什么呢,我都没有中断服务函数了,为什么还会进中断,还必须把NVIC使能的代码注释掉才行?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-29 21:07 , Processed in 1.185476 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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