打印
[STM32F0]

STM32 ADC 和DMA 一下问题 改进方法

[复制链接]
2567|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cornrn|  楼主 | 2015-10-8 11:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
最近想优化一下代码,以前程序 在STM32F030F4上面只有一个ADC1 带有10个通道。我本来用了ADC三个通道 用DMA一起缓存三个通道数据。

当开一个数组用于DMA缓存三个通道数据量大时候挺浪费空间。但是STM32没有当打开adc1多通道扫描时候。DMA单单缓存单个通道数据功能。

  /*设置DMA的外设递增模式,一个外设*/
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  /*设置DMA的内存递增模式*/
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;



主要这两句指针递增是一步一步递增,不可以单步递增 停止递增 跳步递增 。


假设,我 ADC1 通道0 数据需要一分钟采样300次,而通道1数据只需要一分钟采样5次,而通道2数据只需要一分钟采样1次。


如果三个通道一分钟同时采样300次都缓存DMA中就是(假设是8bit采样)300字节*3=900个字节。


而其实只需要300字节+5字节+1字节=306字节。浪费了900-306=594个字节空间(如果我DMA缓存周期为每分钟)。

QQ截图20151008110858.png (117.95 KB )

QQ截图20151008110858.png
沙发
cornrn|  楼主 | 2015-10-9 13:38 | 只看该作者
@香水城 版主对于这种STM32F030F4这些一个ADC还没有注入组的怎么办呢

使用特权

评论回复
板凳
cornrn|  楼主 | 2015-10-9 13:39 | 只看该作者
@天灵灵地灵灵 @liulx14 帮我看看呢

使用特权

评论回复
地板
cornrn|  楼主 | 2015-10-9 13:41 | 只看该作者

使用特权

评论回复
5
天灵灵地灵灵| | 2015-10-10 09:04 | 只看该作者
能否采用定时器中断操作这三个。

使用特权

评论回复
6
huangcunxiake| | 2015-10-10 10:07 | 只看该作者
如果定时不同,肯定在定时中断里处理这个比较合适。

使用特权

评论回复
7
gejigeji521| | 2015-10-10 11:00 | 只看该作者
就是啊,如果你需要不同时长检测一次,那就要用定时器做才对。

使用特权

评论回复
8
android2| | 2015-10-11 20:54 | 只看该作者
应该用定时中断

使用特权

评论回复
9
wahahaheihei| | 2015-10-11 23:51 | 只看该作者
使用定时中断,不是也可以实现吗,遇到这类问题应该先想到的就是定时器了。

使用特权

评论回复
10
wahahaheihei| | 2015-10-11 23:54 | 只看该作者
如果不做其他工作,还可以定时休眠。既可以实现低功耗,也可以实现楼主的功能

使用特权

评论回复
11
icecut| | 2015-10-12 10:40 | 只看该作者
官方设计应该是 adc 循环采样.不是 dma 来拼.你看看手册是不是这么设计的.

使用特权

评论回复
12
cornrn|  楼主 | 2015-10-15 17:43 | 只看该作者
wahahaheihei 发表于 2015-10-11 23:51
使用定时中断,不是也可以实现吗,遇到这类问题应该先想到的就是定时器了。 ...

那用不了DMA了,只能单次采样,F030F4没有注入组就是麻烦,定时器弄只能单次分别采样存储,那和51单片机有什么区别

使用特权

评论回复
13
cornrn|  楼主 | 2015-10-15 17:44 | 只看该作者
icecut 发表于 2015-10-12 10:40
官方设计应该是 adc 循环采样.不是 dma 来拼.你看看手册是不是这么设计的.

是啊,STM32F030F4要是想STM32其他款一下有注入组也没这么多麻烦了

使用特权

评论回复
14
cornrn|  楼主 | 2015-10-15 17:45 | 只看该作者
wahahaheihei 发表于 2015-10-11 23:54
如果不做其他工作,还可以定时休眠。既可以实现低功耗,也可以实现楼主的功能 ...

定时休眠,休眠恢复还是回到上次程序执行的地方的,没作用

使用特权

评论回复
15
cornrn|  楼主 | 2015-10-15 17:48 | 只看该作者
huangcunxiake 发表于 2015-10-10 10:07
如果定时不同,肯定在定时中断里处理这个比较合适。

如果DMA外设地址可以在运行后,不需要整体初始化DMA。可以在DMA运行时候修改DMA转入外设地址指针,让指针不断跳格子就方便了,也相当于注入组了

使用特权

评论回复
16
cornrn|  楼主 | 2015-10-15 17:56 | 只看该作者
天灵灵地灵灵 发表于 2015-10-10 09:04
能否采用定时器中断操作这三个。

谢谢回复

使用特权

评论回复
17
wahahaheihei| | 2015-10-18 13:33 | 只看该作者
楼主现在用什么方法解决了那个难题啊

使用特权

评论回复
18
wahahaheihei| | 2015-10-18 13:35 | 只看该作者
cornrn 发表于 2015-10-15 17:43
那用不了DMA了,只能单次采样,F030F4没有注入组就是麻烦,定时器弄只能单次分别采样存储,那和51单片机 ...

有道理,那个不过这个数据通过DMA具体怎么存,确实有点难,这芯片太复杂了。

使用特权

评论回复
19
liulx14| | 2016-1-1 22:13 | 只看该作者

你好,楼主,刚登陆看到你@我,谢谢,你的问题解决了吗,我这边有例程,可以给你看,和你用的同一个型号。

使用特权

评论回复
20
cornrn|  楼主 | 2016-1-3 16:31 | 只看该作者
liulx14 发表于 2016-1-1 22:13
你好,楼主,刚登陆看到你@我,谢谢,你的问题解决了吗,我这边有例程,可以给你看,和你用的同一个型号 ...

恩,下次遇到其他问题再请你指教的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

187

主题

882

帖子

11

粉丝