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

stm32CubeMX+ADC+DMA的问题

[复制链接]
andrewsss 提问时间:2018-11-1 17:41 /
本帖最后由 andrewsss 于 2018-11-1 17:41 编辑

在使用stm32CubeMx时遇到一个问题,我在用DMA方式获取ADC数据时,设置DMA为Circular模式会被HAL_ADC_Start_DMA阻塞,不懂为什么会这样,后来换了F103芯片也一样,附上配置图:stm32L151C8T6的cube配置图:










360截图20181101171610170.jpg
360截图20181101170832965.jpg
360截图20181101170912812.jpg
<
收藏 评论18 发布时间:2018-11-1 17:41

举报

18个回答
songshiqun2010 回答时间:2018-11-1 22:31:30
将ADC DMA中断的NVIC使能代码屏蔽即可解决。。。
/**
  * Enable DMA controller clock
  */
static void MX_DMA_Init(void)
{
  /* DMA controller clock enable */
  __HAL_RCC_DMA2_CLK_ENABLE();

  /* DMA interrupt init */
  /* DMA2_Stream0_IRQn interrupt configuration */
  //HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);
  //HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);

}

评分

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

查看全部评分

数码小叶 回答时间:2018-11-1 21:12:03
是不是开启DMA中断了,HAL_ADC_Start_DMA的Length参数才是1,而你配置的循环模式,不阻塞才不正常

点评

是阻塞了,还是因一直进中断,导致主函数得不到cpu使用权呢?  发表于 2018-11-1 22:27

评分

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

查看全部评分

andrewsss 回答时间:2018-11-2 09:46:33
数码小叶 发表于 2018-11-1 21:12
是不是开启DMA中断了,HAL_ADC_Start_DMA的Length参数才是1,而你配置的循环模式,不阻塞才不正常 ...

我的DMA存储变量adcvalue不是数组,所以我设置的1,DMA中断好像使用了DMA就开启了,没法关闭,我的cubemx设置里面是灰色的,无法更改
andrewsss 回答时间:2018-11-2 09:49:36
songshiqun2010 发表于 2018-11-1 22:31
将ADC DMA中断的NVIC使能代码屏蔽即可解决。。。
/**
  * Enable DMA controller clock

非常感谢,我按你的方法试了,是可以的,但是我不明白我又没有写中断处理函数,它执行到哪里去了然后停住了。如果我要用Circular模式的话,应该怎么处理?
电子星辰 回答时间:2018-11-2 10:42:10
Circular模式就是开启一次,DMA会自动循环接收数据,再把函数放在主循环中就不行了,得把函数放在主循环之外

评分

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

查看全部评分

Dandjinh 回答时间:2018-11-2 11:48:28
本帖最后由 Dandjinh 于 2018-11-2 12:07 编辑

把ADC的总中断调到比ADC-DMA的中断优先级高试试。
我也是循环加中断,也没问题啊。
况且为啥长度是1啊。长度代表的是数据个数,也就是缓冲区大小。
你设置为1,我猜就是不断进入中断,导致看起来像堵塞一样。


评分

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

查看全部评分

andrewsss 回答时间:2018-11-2 16:30:36
电子星辰 发表于 2018-11-2 10:42
Circular模式就是开启一次,DMA会自动循环接收数据,再把函数放在主循环中就不行了,得把函数放在主循环之 ...

我的直接用circular模式就不行,必须把ADC DMA中断的NVIC使能代码屏蔽掉才行
andrewsss 回答时间:2018-11-2 16:33:00
Dandjinh 发表于 2018-11-2 11:48
把ADC的总中断调到比ADC-DMA的中断优先级高试试。
我也是循环加中断,也没问题啊。
况且为啥长度是1啊。长 ...

调了优先级也不行;我的缓冲区大小就是1,就是一个uint32_t 的变量,所以设的1;我的要把ADC DMA中断的NVIC使能代码屏蔽掉才行
12下一页

所属标签

相似问题

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