目录
一、DMA与中断模式的区别
(1)中断方式是在数据缓冲寄存区满后,发中断请求,CPU进行中断处理。
(2)DMA方式则是以数据块为单位传输的,在所要求传送的数据块全部传送结束时要求CPU进行中断处理,这样大大减少CPU进行中断处理的次数。 DMA方式不需CPU干预传送操作 ,不占用CPU任何资源, 整个数据传输操作在一个称为"DMA控制器"的控制下进行的。CPU除了在数据传输开始和结束时做一点处理外,在传输过程中CPU可以进行其他的工作。这样,在大部分时间里,CPU和输入输出都处于并行操作。因此,使整个计算机系统的效率大大提高。 中断方式是程序切换,每次操作需要保护和恢复现场,中断次数多,CPU需要花较多的时间处理中断,中断次数多也会导致数据丢失。 但是DMA是必须利用中断的,否则CPU无法得到数据已经传输结束,当数据传输开始结束的时候,需要给CPU一个中断信号,CPU进行处理.这个就大大的节约了CPU的资源。
(3)中断方式的数据传送方向是由设备到CPU再到内存,或者相反。
DMA方式的数据传送则是将所传输的数据由设备直接送入内存,或是由内存直接送到设备。
二、基于DMA模式的串口通信
1.建立stm32CubeMX工程
打开软件,选择器件,建立工程.
然后设置RCC
设置USART1
添加两个通道
设置NVIC
然后创建工程名
创建工程后,直接转到Keil.
2.Keil代码编写与运行
打开Keil,先点击魔法棒进行相关配置,以便输出.hex文件。
设置好后,进行编译,若无错误,则说明工程创建完好,然后就是代码的编写。
完整代码如下:
#include "main.h"
#include "dma.h"
#include "usart.h"
#include "gpio.h"
#include "string.h"
void SystemClock_Config(void);
int shuru(char date[6],char date2[6])//判断输入若为“start”,则和数据匹配返回1,反之返回0
{
for(int i=0;i<6;i++)
{
if(date[i]!=date2[i]) return 0;
}
return 1;
}
int flag=1;//0停止发送,1开始发送
char date[6]="start";
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
char message[]="Hello windows!\n";//输出信息
HAL_UART_Receive_DMA(&huart1,(uint8_t*)&date,5);//设置串口DMA模式接收
while (1)
{
if(flag==1)//当输入"start",flag==1,此时发送&