STM32F103C8T6原理学习笔记——DMA

一、DMA简介
  • DMA(Direct Memory Access)直接存储器存取 。

DMA是一个数据转运小助手,主要用来协助CPU完成数据转运的工作;DMA这个外设可以直接访问STM32内部的存储器(运行内存SRAM(存储变量数组),程序存储器FLash(存储程序代码)和寄存器等等)。

  • DMA可以提供外设(外设寄存器,一般指外设的数据寄存器DR,Data Register)和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源
  • 12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道)
  • 每个通道都支持软件触发(存储器和存储器之间)和特定的硬件触发(外设和存储器之间,每个DMA通道的硬件触发源是不一样的)
  • STM32F103C8T6 DMA资源:DMA1(7个通道)
二、存储器映像

STM32中所有存储器的类型以及存储器的地址

ROM:只读存储器,是一种非易失性、掉电不丢失的存储器。

RAM:随机存储器,是一种易失性、掉电丢失的存储器。

ROM分为三块:

  • 程序存储器Flash,也就是主闪存,下载程序的位置,一般也从主闪存里运行程序。
  • 系统存储器:用于串口下载。
  • 选项字节:下载程序可以不刷新选项字节的内容,这样选项字节的配置就可以保持不变,存的主要是Flash的读保护和写保护,还有看门狗等等的配置。

RAM:

运行内存SRAM:我们在程序中定义变量、数组、结构体的地方。

外设寄存器:初始化各种外设后最终读写的东西。

内核外设寄存器:NVIC和SysTick。

三、DMA框图

左上角是Cortex-M3内核:包含了CPU和内核外设等。

剩下的所有东西都可以当作是存储器。

Flash是主闪存,SRAM是运行内存,各个外设可以看成是寄存器,也是一种SRAM存储器。

寄存器是一种特殊的存储器,一方面,CPU可以对寄存器进行读写,就像读写内存一样,另一方面,寄存器的每一位背后,都连接了一根导线,这些导线可以用于控制外设电路的状态,比如置引脚的高低电平,导通和断开开关、切换数据选择器或者多位结合起来,当作计数器、数据寄存器,等等。寄存器是连接软件和硬件的桥梁,软件读写寄存器,就相当于在控制硬件的执行。

总线矩阵(高效有条理的访问存储器)左边是主动单元,拥有存储器的访问权。右边是被动单元,它们的存储器只能被左边的主动单元读写。

主动单元:内核有DCode和系统总线,可以访问右边的存储器,其中DCode总线是专门访问Flash的,系统总线是访问其他东西的,另外由于DMA要转运数据,所以DMA也必须要有访问的主动权,主动单元除了内核的CPU剩下的就是DMA总线,DMA1(7个通道)和DMA2(5个通道)都对应有一条总线,各个通道可以分别设置它们转运数据的源地址和目的地址,这样它们就能独立工作了。

仲裁器:虽然多通道可以独立转运数据,但是DMA只有一条总线,所以所有的通道都只能分时复用这一条DMA总线,如果发生冲突会由仲裁器根据通道的优先级来决定谁先用,谁后用,在总线矩阵也会有一个仲裁器,如果DMA和CPU都要访问同一个目标 ,那么DMA就会暂停CPU的访问,避免冲突,不过总线仲裁器仍然会保证CPU得到一半的总线带宽,使CPU也能正常工作。

DMA请求:请求就是触发的意思,这条线路右边的触发源是各个外设,所以DMA请求就是DMA的硬件触发源(比如ADC转换完成、串口收到数据),需要触发DMA转运数据的时候1,就会通过这条线路,向DMA发出硬件触发信号,之后DMA就可以执行数据转运的工作了。

注意:用CPU/DMA直接访问Flash,只读不写,访问SRAM,可读可写。外设寄存器,有的只读,有的只写,有的可读写。

四、DMA基本结构

外设和存储器的地址:决定了数据从哪里来到哪里去。

数据宽度:指定一次转运要按多大的数据宽度来进行。(可选字节Byte,半字HalfWord和字Word,字节就是8位,也就是一次转运一个uint8_t大的数据,半字是16位,也就是一次转运uint16_t大的数据,字是32位,也就是一次转运uint32_t大的数据)

地址是否自增:指定一次转运完成后,下一次转运是否要把地址移动到下一个位置去,相当于指针p++的意思。

传输计数器(自减计数器):用来指定转运次数。没转运一次,计数器的数减1,当传输计数器转到0时,DMA就不会再进行数据转运了。另外,减到0后,之前自增的地址,也会恢复到起始地址的位置,以方便DMA开始新一轮的转运。

自动重装器:传输计数器减到0之后,是否自动恢复到最初的值,比如最初传输计数器给5,如果不使用自动重装器,那么转运5次后,DMA就结束了,若使用,转运5次后计数器减到0,就会立即重装到初始值5,决定了转运的模式,如果不重装就是单次模式,如果重装就是循环模式。

触发:决定DMA需要在什么时机进行转运。触发源有硬件和软件,具体选择哪个,由M2M(Memory to Memory,从存储器到存储器)决定。

当给M2M位1时,DMA选择软件触发(以最快的速度,连续不断地触发DMA),争取早日把计数器清零,完成这一轮转换。软件触发和重装器不能同时使用,如果同时用,DMA就停不下来了,软件触发一般用于从存储器到存储器的转运,是软件启动,不需要时机,并且想要尽快完成任务。

当M2M位给0,那就是使用硬件触发了,硬件触发可以选择ADC、串口、定时器等等。一般与外设有关的转运使用硬件触发,这些转运需要一定的时机(比如ADC转化完成,串口收到数据,定时时间到等等),当硬件达到这些时机时,传一个信号过来,来触发DMA进行转运。

DMA转运的条件:

1.开关控制,DMA_Cmd必须使能。

2.传输计数器必须大于0.

3.触发源必须有触发信号,触发一次转运一次,传输计数器自减一次。当传输计数器为0,没有重装器时,无论是否触发,DMA都不会进行转运,此时就需要DMA_Cmd给DISABLE,关闭DMA,再为传输计数器写一个大于0的数,再DMA_Cmd,给ENABLE,开始DMA,DMA才能继续工作。

注意:写传输计数器时,必须要先关闭DMA,再进行,不能在DMA开启时写传输计数器。

五、DMA请求

每个通道都有一个数据选择器:可以选择硬件触发/软件触发。

M2M位是数据选择器的控制位(用于选择硬件触发/软件触发)

EN是开关控制(EN=0不工作,EN=1工作)

每个硬件触发源都不同,所以如果你想使用某个硬件触发源,就必须使用它所在的通道。

通道一有三个触发源,那到底要选择哪个触发源呢:由对应的外设是否开启了DMA输出来决定。

最终七个通道进入仲裁器进行优先级(优先级的通道号越小,优先级越高,也可以自行配置优先级)判断,最终产生内部的DMA1请求。

六、数据宽度与对齐

如果数据宽度一样,那就是正常的一个个转运。

数据宽度不一样:如果目标数据宽度比源端数据宽度大,那就再目标数据前多出来的空位补0。

如果目标数据宽度比源端数据宽度小,那目标数据把多出来的高位舍弃掉!

(与uint8_t,uint16_t和uint32_t变量之间相互赋值一样,不够就补0,超了就舍弃高位)

七、数据转运+DMA(例子)

任务:将SRAM里的数组DataA转运到另一个数组DataB中

外设地址:DataA数组的首地址,存储器地址:DataB数组的首地址。

数据宽度:两个数组的类型都是uint8_t,按8位的字节传输。

地址自增:两个站点的地址都应该自增,都移动到下一个数据的位置(DataA[0]对应DataB[0],DataA[1]对应DataB[1],以此类推)

传输计数器:给7,要转运7次。

选择软件触发:从存储器到存储器的数据转运。

用DMA_Cmd给DMA使能

八、ADC扫描模式+DMA(例子)

任务:左边有七个通道,触发一次后依次进行AD转换,然后转换结果都放到ADC_DR数据寄存器里,在每一个单独的通道转换完成后,进行一个DMA数据转运,并且目的地址进行自增,这样数据就不会被覆盖了。

外设地址:写入ADC_DR的地址

存储器的地址:在SRAM中定义一个数组ADValue,把其地址当作存储器的地址。

数据宽度:两个数组的类型都是uint16_t,按16位的半字传输。

地址自增:外设地址不自增,存储器地址自增。

传输方向:外设站点到存储器站点。

传输计数器:给17,要转运7次。

是否重装:ADC如果是单次扫描,可不用;ADC是连续扫描,用自动重装。

触发选择:这里ADC_DR的值是在ADC单个通道转换完成后才会有效,所以DMA转运的时机,需要和ADC单个通道转换完成同步,所以DMA的触发要选择ADC的硬件触发。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,其原理图包含了芯片内部的各种电路和外部连接的各种元件,是设计和开发该芯片的重要参考资料。 在STM32F103C8T6原理图中,可以看到芯片内部包含了CPU、存储器、时钟、定时器、串口、ADC等各种模块,这些模块通过总线相互连接,实现了芯片的各种功能。 同时,原理图中还包含了外部连接的元件,如晶振、电容、电阻、LED等,这些元件与芯片内部的模块相互配合,实现了各种应用场景。 总之,STM32F103C8T6原理图详解了芯片内部和外部连接的各种电路和元件,为开发者提供了重要的参考资料,帮助他们更好地设计和开发基于该芯片的应用。 ### 回答2: STM32F103C8T6是一款基于ARM Cortex-M3内核的微型控制器芯片,适用于嵌入式系统和应用程序。相比其他的MCU芯片,它拥有更小的体积、更低的功耗以及更快的运行速度和更强的处理能力,在物联网、工控、通信等领域得到了广泛的应用。 在整个STM32F103C8T6芯片设计中,原理图起到了关键作用。原理图是电子设计过程中的重要工具,用于指导硬件设计人员在PCB板上实现电路的设计。它通过图形的方式展示了各个元件之间的连接,为硬件设计人员提供了关键的信息。下面我们将来详细解析STM32F103C8T6原理图的各个部分。 1. 电源部分 在STM32F103C8T6的电路中,电源部分是最基础的部分。正常的工作电压范围是2.0V-3.6V,所以需要两个电源滤波电容C5和C6,这两个电容起到稳压作用,可以滤除 杂波和偏离电源范围的干扰信号。VDD和GND分别连接到芯片的电源引脚。 2. 时钟部分 时钟部分是STM32F103C8T6芯片中的重要组成部分之一。它包括两个部分:一个是外部时钟,另一个是内部时钟。 外部时钟通常是由晶振产生的,需要接入两个电容C1、C2进行自激振荡。因为STM32F103C8T6需要在晶振时钟的驱动下工作,所以它需要将输出引脚连接到OSC_IN和OSC_OUT引脚上。 内部时钟通常有两种选择:PLL(锁相环)和HSI(内部高速振荡器)。PLL是一种高精度的时钟建立器,它通常用于要求高精度的应用场合,如工业控制、医疗设备等。HSI是芯片内部固有的一种高速振荡器,它的精度和稳定性都非常高,在低成本和低功耗的场合下可用。 3. 重启部分 重启部分主要包括复位电路、串行接口和引脚。芯片可以通过电源复位、看门狗、外部复位、内部复位等多种方式进行重启。 4. 通信部分 通信部分包括串行接口和其他通信接口。STM32F103C8T6芯片具有多种通信方式,如SPI、IIC、USART,可以方便地和其他外设进行通信或数据传输。 5. 图像处理部分 图像处理部分是STM32F103C8T6芯片中的重要组成部分之一。STM32F103C8T6芯片的图像处理部分通常由DMA控制器、ADC、DAC和定时器等组成。除此之外,此部分还需要通过加入LED和触摸屏等人机交互方式以方便用户使用。 综上所述,STM32F103C8T6原理图是STM32F103C8T6芯片电路中的关键部分,它展示了芯片各个部分之间的连接和功能,为硬件设计人员提供了重要信息。掌握STM32F103C8T6原理图的知识,能够更好地理解STM32F103C8T6芯片的工作原理,以及更好地进行电路设计和调试。 ### 回答3: STM32F103C8T6是一款高性能的32位单片机,常用于工业控制、自动化控制等领域。它具有强大的处理能力、丰富的外设和良好的性价比,因此备受广大工程师的青睐。 STM32F103C8T6原理图主要包括三个部分:处理器核心、外设接口和支持电路。 处理器核心部分主要包括STM32F103C8T6的主控芯片和相关的电路。在这个部分,我们可以看到STM32F103C8T6主控芯片的引脚布局,如复位引脚、时钟引脚、电源引脚等等。同时,在原理图中也包括了主芯片周围的扩展接口以及相应的电路,如USB接口、CAN总线、串口通信、GPIO等等。 外设接口部分就是STM32F103C8T6的核心部分,其中包括了各种常用的外设接口。例如ADC模块、DAC模块、比较器、PWM输出、定时器、I2C总线、SPI总线等等。这些外设接口在不同的应用场景下都能提供很好的支持。 支持电路部分是STM32F103C8T6原理图的重要部分,它包括了各种支持电路,如时钟电路、复位电路、电源电路、调试接口电路等等。这些电路都是为了保证STM32F103C8T6运行的稳定性和安全性所必需的。 总而言之,STM32F103C8T6原理图的详细描述了这个芯片的各种特性及其使用方式,并且提供了一个可编程的平台,使我们能够定制适合自己应用的解决方案。因此,了解STM32F103C8T6原理图是非常重要的,它有助于我们更好地了解芯片的功能和使用方法,进而在应用中得到更好的发挥。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值