当前位置:首页 > 公众号精选 > 硅农亚历山大
[导读]在之前的内容里,我们使用过UART、SPI、I2C等接口进行过数据传输,在处理通信数据时,几乎都是在主程序或中断服务程序中进行数据的转存,这样耗费了大量的CPU时间。幸运的是,微控制器的设计者也考虑到这个问题,设计出了DMA(DirectMemoryAccess,直接存储器访问)...

在之前的内容里,我们使用过UART、SPI、I2C等接口进行过数据传输,在处理通信数据时,几乎都是在主程序或中断服务程序中进行数据的转存,这样耗费了大量的CPU时间。幸运的是,微控制器的设计者也考虑到这个问题,设计出了DMA(Direct Memory Access,直接存储器访问)传输功能,使得数据可以从一个地址空间复制到另一个地址空间,而不经过CPU,从而让CPU专注在其他功能上。本期内容我们以UARTDMA传输为例,简单介绍DMA的应用方法。
系统环境

Windows 10-64bit
软件平台

NucleiStudio IDE 202102版或 PlatformIO IDECoolTer
硬件需求

RV-STAR开发板

TTL-USB串口转换





DMA(直接内存访问)原理



DMA,全称Direct Memory Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另外一个地址空间。传输动作的初始化由CPU完成,而传输动作本身由DMA控制器来实行。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。DMA的方式并没有让处理器工作拖延,反而可以去处理其他的工作。DMA对于高效能嵌入式系统算法和网络传输是很重要的。

在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。




GD32VF103的DMA控制器


GD32VF103的DMA控制器有12个通道(DMA0有7个通道,DMA1有5个通道)。每个通道都是专门用来处理一个或多个外设的存储器访问请求的。DMA控制器内部实现了一个仲裁器,用来仲裁多个DMA请求的优先级。

DMA控制器和RISC-V内核共享系统总线,当DMA和CPU访问同样的地址空间时,DMA访问可能会阻挡CPU访问系统总线几个总线周期。总线矩阵中实现了循环仲裁算法来分配DMA与CPU的访问权,它可以确保CPU得到至少一半的系统总线带宽。



主要特征如下:

  • 传输数据长度可编程配置,最大到65536

  • 12个通道,并且每个通道都可配置(DMA0有7个通道,DMA1有5个通道)

  • AHB和APB外设,片上闪存和SRAM都可以作为访问的源端和目的端

  • 每个通道连接固定的硬件DMA请求

  • 支持软件优先级(低、中、高、极高)和硬件优先级(通道号越低,优先级越高)

  • 存储器和外设的数据传输宽度可配置:字节,半字,字

  • 存储器和外设的数据传输支持固定寻址和增量式寻址

  • 支持循环传输模式

  • 支持外设到存储器,存储器到外设,存储器到存储器的数据传输

  • 每个通道有3种类型的事件标志和独立的中断

  • 支持中断的使能和清除




实验部分


原理部分已经介绍过,DMA的工作过程比较简单,开发起来也比较容易,用户只需要结合数据手册,明确微控制器DMA通道和外设间对应关系,明确DMA的源地址、目的地址、数据宽度等信息,在开发时对DMA控制器和外设进行相应的使能和配置即可。

由于RV-STAR的USB串口(UART4)不支持DMA功能,本次的实验使用UART3进行:首先使用串口的DMA发送功能,让数据不经CPU直接从内存(txbuffer)传输到串口的发送端,然后使用串口的DMA接收功能接收10个字节的数据,保存到rxbuffer中,最后在主循环中(使用CPU)将rxbuffer接收到的数据再通过串口发送出去。


#include "nuclei_sdk_hal.h"

uint8_t rxbuffer[10];
uint8_t txbuffer[] = "\nUART DMA receive and transmit example, please input 10 bytes:\n";
#define ARRAYNUM(arr_name) (uint32_t)(sizeof(arr_name) / sizeof(*(arr_name)))

void uart_init();
void uart_send(int ch);

int main()
{
    dma_parameter_struct dma_init_struct;
    /* enable DMA1 */
    rcu_periph_clock_enable(RCU_DMA1);
    /* initialize UART3 */
    uart_init();

    /* deinitialize DMA Channel4(UART3_TX) */
    dma_deinit(DMA1, DMA_CH4);
    dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
    dma_init_struct.memory_addr = (uint32_t)txbuffer;
    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
    dma_init_struct.number = ARRAYNUM(txbuffer) - 1;
    dma_init_struct.periph_addr = (uint32_t)
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭