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

stm32CubeMX+ADC+DMA的问题

[复制链接]
andrewsss 提问时间:2018-11-1 17:41 /
阅读主题, 点击返回1楼
收藏 评论18 发布时间:2018-11-1 17:41
18个回答
Dandjinh 回答时间: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,一直没问题。


andrewsss 回答时间: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的配置也注释掉才不会进入中断,这是为什么
andrewsss 回答时间: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,
数码小叶 回答时间:2018-11-2 20:43:13
andrewsss 发表于 2018-11-2 09:46
我的DMA存储变量adcvalue不是数组,所以我设置的1,DMA中断好像使用了DMA就开启了,没法关闭,我的cubemx ...

cube版本不一样,设置就不一样,一直在更新,也一直在完善吧。话说你就一个通道,采集量很小,没必要开DMA
数码小叶 回答时间:2018-11-2 20:45:05
songshiqun2010 发表于 2018-11-1 22:31
将ADC DMA中断的NVIC使能代码屏蔽即可解决。。。
/**
  * Enable DMA controller clock

你说的很对
andrewsss 回答时间: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中断中添加了一条打印语句,结果程序就一直在打印该语句,不能正常执行后面的程序了;我不懂根本问题在那里?
zhengxk-344971 回答时间: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

查看全部评分

andrewsss 回答时间:2018-11-9 10:21:01
zhengxk-344971 发表于 2018-11-8 17:39
用中断时你一定要注意中断运行时间和你的中断时间间隔,如果每次中断之间的时间间隔小于一次进入中断运行 ...

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

所属标签

相似问题

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