
1.为什么需要DMA
首先看串口来传递信息:发送字符串。
发送函数:在uart.c里增加下面发送函数:

接下来在main.c里调用:


编译make,

烧写到开发板:
制作SD卡,设置开发板从SD卡启动,设置好minicom后给开发板上电,紧接着按着空格键:

选择[1]格式化NandFlash:


按照上面,选择从USB烧写image,然后选择1,烧写uboot。然后把USB线拉到虚拟机,会显示USB按着成功了。接下来就可以烧写编译好的.bin文件了。

在Linux里按着USB驱动:

接下来烧写:


串口信息:

设置开发板从NandFlash启动:

可以看到我们串口的信息已经打印出来了。说明串口发送信息成功了。
接下来看原始数据的传输:

上面就是原始数据的传输机制,输出的传输需要CPU全程参与,当buf里的数据很大的时候,这机制就浪费了CPU的大部分资源。
所以DMA机制就出现了,有DMA的机制如下:

该机制里,当需要传输数据的时候,CPU给DMA控制器命令,告诉DMA要去源地址拿数据,送到目的地址,然后就可以去干别的事了。DMA控制器接受到CPU的命令后,通过内存与串口的数据通道,会不停从源地址获取数据,送到目的地址,知道结束。这就是DMADirect Memory Access机制。
接下来看看2440的DMA:

可以看到2440的DMA是四通道的。
每一个通道的请求源:

DMA的基本时序:
例如UART0的请求源,对应的是通道0(Ch-0),UART2对应的是通道3.
DMA请求到启动的过程时序图:

首先是DREQ,DMA请求信号生效,当请求信号生效两个时钟之后,响应信号DACK生效,生效的时间是3个时钟。DMA控制器正式接管了总线,就可以实现Read and Write了。
DMA的两种工作模式:

6410的DMA:

可以看到6410有四个DMA控制器,每一个控制器有8个通道,就是说6410支持的是32DMA通道。
32通道支持的DMA源:

第一行的意思是:在DMA0或者SDMA0控制器的0通道上面,可以使用的是UART0源。依此类推。
四个控制器是DMA0,DMA1和SDMA0和SDMA1。在默认的情况使用的是SDMA控制器,默认值是0.
基本工作时序:

原理跟2440一样的。
210的DMA:


上面可以看到210支持两种类型的DMA:一种是内存到内存的,另一种是内存到外设的。
210有三个控制器:DMA(内存)、DMA0、DMA1.
三个控制器对应的DMA源:



可以看到DMA源的后面都的是by only DMA0或DMA1,说明这种的DMA源只能给对应的DMA控制器处理,如果是空白的则两个都可以处理。
关键字:DMA 字符串
引用地址:
16.6410DMA简述
推荐阅读最新更新时间:2026-03-22 11:15
如何利用STM32单片机发送字符串
一、STM32有自己的字符发送函数。 void PC_SendChar(uint8_t DataToSend) { USART_SendData (USART1 ,DataToSend); while(USART_GetFlagStatus (USART1 ,USART_FLAG_TC )!=SET ); } 二、发送字符串函数是在字符发送函数的基础上编写的 void PC_SendString(uint8_t *str) { while(*str) { PC_SendChar (*str); str++; } } 三、发送字符串示例 PC_SendString((u8*) Welcome to the NDIR wo
[单片机]
STM8L151C8单片机学习例程(4)——串口发送字符,字符串
STM8L_4_USART: 1.User:工程及main文件 2.Hardware:USART,CLK,LED,Delay 3.STM8L15x_StdPeriph_Driver:STM8自带库文件 4.Debug:hex文件存放于EXE文件夹 5.Function: 发送字符,字符串,整形,浮点,hex等 /** ****************************************************************************** * @file main.c * @author Alex——小白 * @version V1.0 * @date
[单片机]
浮点数转换成字符串函数
sprintf函数太大,在STM8上面根本不敢用,动不动就.text overflow。为了将采集的数值通过串口上传到计算机,只能自己写了一个浮点数转换成字符串的函数: #include stdio.h #include stdint.h static char table ={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; void num2char(char *str, double number, u
[单片机]
unsigned char 转字符串
通常送显示的都是字符串,对于int long float转字符串有对应的函数,还有sprintf进行格式输出,对于嵌入式和单片机大多都用unsigned char型变量,转字符串需要自己编写函数,需要自己编写函数,一下是网上人写的一个函数。 unsigned char Dec2Asc(unsigned char input, char* output ) { unsigned char ucLen; unsigned char ucDiv; //判断有效数字最高位 for ( ucDiv = 100; 1 ucDiv; ucDiv /= 10 ){ if ( input / ucDiv ){
[单片机]
51单片机串口通信(字符串接收和发送)
#include reg52.h //------------------串口通信协议-----------------// /* 客户端数据包格式解释(长度恒为15): 例如:A01_fmq_01Off___# A--------数据包的开始标记(可以为A到Z,意味着数据包可以有26种) 01-----设备代号 fmq_01Off___--------指令(长度恒为10),指令的前4个人字符是指令头部,指令的后6个字符是指令尾部 #---------数据包的结束标记 服务器端数据包格式解释(长度恒为15): 例如:A02_SenT010250# A--------数据包的开始标记(可以为
[单片机]
MSP430的485通信程序(接收字符串指令)
************************************************************** 程序功能:通过RS485端口一次一次地收发数据 --------------------------------------------------------------- 测试说明:用示波器观察RS485端口A、B信号线上的波形或者用RS485接收器接收发回的字符,在串口助手上显示。 ***************************************************************/ #include msp430x14x.h #define DRE_out P3DI
[单片机]
STM32用USART发送字符串,以USART_FLAG_TXE和USART_FLAG_TC怎么用
一:STM32用USART发送字符串 void UART_Send_Message(u8 *Data) { while(*Data!='') { USART_SendData(USART1, *Data); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//读取串口状态 Data++; } } void main(void) { u8 str_buf ; memset((char *) &str_buf, 0, sizeof(str_buf)); UART_Send_Message(str_buf); }
[单片机]
MSP430单片机USART串口发送字符和字符串
在MSP430单片机的官方历程中有使用串口中断发送字符以及字符串的程序,但是移植性不高,我专门写了两个函数,用于发送单个字符合字符串,不需要使用中断,供大家参考。 /********************************************** *程序描述:单片机的P3.4、P3.5作为串口发送字符和字符串 *作者 :Zhenhua Liu *时间 :2017.11.01 23:00 ***********************************************/ #include msp430x14x.h #define uchar unsigned char uchar DATA = he
[单片机]