极客秀
搜索

STM32中使用DMA进行ADC采样时长度减半的原因阐述和探究

前两天在写ADC配合DMA的时候遇到了一个奇怪的问题。这个问题呢大体是分两个现象:

  • 一是12位ADC的值到达了24位。
  • 二是ADC的采样长度减半了,DMA的后半段数据消失了。

开始没反应过来,后来发现这两个问题应该是同一个问题,就是数据存储出现了问题,由于变量设置的不准确导致我们的第一个数据构成了输出数据的高12位,第二个数据构成了输出数据的后12位。这样子就会导致我们的采样长度减半,其实采样长度是不变的,但是每两个数据被合成成了一个数据,所以导致的数据异常。
这不得不从STM32的结构以及关于DMA的原理还有指针的工作原理说起。 STM32 是 STMicroelectronics(意法半导体)生产的一系列
32 位微控制器(MCU)所谓的32位 指处理器的架构和数据宽度,
处理器在单个时钟周期内可以处理的最大数据宽度是32位。这意味着处理器的寄存器、数据总线和算术逻辑单元(ALU)能够处理和传输32位的数据。 ** 问题探究
** 当我们开启DMA传输的时候,我们需要在内存空间申请指定大小的空间来作为我们的数据存储区,而DMA则是帮助我们搬运数据到指定的空间中。
由于STM32是32位单片机,因此其空间大小也是32位的,我们一个单元上所能存入的最大数据也只能是32位,不够32位的数据可以直接存入,超出32位的数据需要分段存储(例如STM32的UID是96位的因此我们需要读取三个地址的数据才能拼接处UID)。

从DMA的设置中也可以选择我们的数据长度,由于我们是使用12位ADC,因此这里我们选择半字,这里的半字代表着其一个数据的长度位12位。
不过当我们真正使用的时候会发现,我们将ADC设置的数据类型设置为uint16_t类型是可以正常使用的,不过如果当我们把ADC的数据设置为uint32_t类型的话,就会发现我们的采样信号长度丢失了一半以及值异常的大。

很显然这个的问题主要就是每两次的采样信号被叠加到了一起,一个构成高16位,一个构成低十六位。所以导致的信号值格外的大以及一半数据的丢失。
关于这个问题则是需要了解不同指针变量的本质是什么了,这里有一篇很早的文章讲过 C语言的门牌号——指针

uint16_t * 和 uint32_t * 的区别在于他们 跨越的地址大小

如果我们的变量类型是uint16_t的话,那么每个数据占16位,而我们的DMA类型也是16位,所以地址的递增也是16位。
但是如果我们的数据是32位的话,而DMA的地址递增是16位的。

这样子每次的递增16位数据就会存储到同一个地址上,这也是导致为什么我们的数据异常以及采样长度问题的主要原因。
其实当我们了解DMA的作用和指针的本质就不难发现问题。因此扎实的基础是最快解决问题的方法。

1.转载请保留原文链接谢谢!
2.本站所有资源文章出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。
3.本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户擦亮眼睛自行鉴别,做一个有主见和判断力的用户。
4.本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。
5.联系方式(#替换成@):pm#vimge.com

  相关内容