原创 STM32 DMA 应用之(二) DMA 串口 数据传输--发送

2019-10-10 10:52 1054 5 2 分类: MCU/ 嵌入式 文集: 程序设计

一、DMA请求映像





由此我们知道如果需要使用串口1的发送功能需要用到的是DMA1_Channel4

使用串口1的接收功能需要用到的是DMA1_Channel5

二、怎样配置软件来使用DMA 把数据传到串口发送?

(1)配置dma

/**************************************************************************

*函数名称:Dma_Init

*功能描述:利用DMA把内存的数据传输到串口发送达到高速传输的目的

*

*输入参数:无

*返回值:无

*其他说明:无

*当前版本:v1.0


*-----------------------------------------------------------------

*

******************************************************************/

#defineUART_RX_LEN5

u8Uart_Send_Buffer[UART_RX_LEN]={0x12,0x34,0x56,0x78,0x90};

u8i=0;

u8Flag_Uart_Send=0;

voidDma_Init(void)

{

DMA_InitTypeDefDMA_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

/*DMAchannel6configuration*/

DMA_DeInit(DMA1_Channel1);

DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)(&USART1->DR);//外设地址

DMA_InitStructure.DMA_MemoryBaseAddr=(u32)Uart_Send_Buffer;

DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;//外设作为目的地址//DMA_DIR_PeripheralSRC;//外设作为DMA的源端

DMA_InitStructure.DMA_BufferSize=5;//BufferSize;//传输大小

DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设递增模式禁止DMA_PeripheralInc_Enable;//外设地址增加

DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//内存地址自增

DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//传输方式:字节DMA_PeripheralDataSize_Word;//字(32位)

DMA_InitStructure.DMA_MemoryDataSize=DMA_PeripheralDataSize_Byte;//内存存储方式:字节DMA_MemoryDataSize_Word;

DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//DMA_Mode_Normal正常模式,只传送一次;DMA_Mode_Circular:循环模式,不停的传送;

DMA_InitStructure.DMA_Priority=DMA_Priority_High;

DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//DMA_M2M_Enable;

DMA_Init(DMA1_Channel4,&DMA_InitStructure);

/*EnableDMAChannel4TransferCompleteinterrupt*/

DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);

//

//USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);//串口接收器DMA

//采用DMA方式发送

USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);

//启动串口

USART_Cmd(USART1,ENABLE);

DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);

传输完成则进入DMA1_Channel4中断;



注意这句话:USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); 这是使能指定USART的DMA请求;(不同的外设都有这个 xxx_DMACmd()请求;)

USART_DMAReq_Tx:发送DMA请求

USART_DMAReq_Rx:接收DMA请求


串口配置


/*****************************************************************

*函数名称:USART1_Init

*功能描述:配置串口1初始化

*

*输入参数:无

*返回值:无

*其他说明:无

*当前版本:v1.0


*-----------------------------------------------------------------

*

******************************************************************/

voidUSART1_Init(uint32baud)

{

GPIO_InitTypeDefGPIO_InitStructure;

USART_InitTypeDefUSART_InitStructure;

USART_ClockInitTypeDefUSART_ClockInitStructure;

//使能串口1,PA,AFIO总线

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|

RCC_APB2Periph_AFIO|

RCC_APB2Periph_USART1,

(FunctionalState)ENABLE);

//A9USART1_Tx

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOA,&GPIO_InitStructure);

//A10USART1_Rx

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA,&GPIO_InitStructure);

USART_InitStructure.USART_BaudRate=baud;

USART_InitStructure.USART_WordLength=USART_WordLength_8b;

USART_InitStructure.USART_StopBits=USART_StopBits_1;

USART_InitStructure.USART_Parity=USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;

USART_ClockInitStructure.USART_Clock =

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

curton 2019-10-10 22:31

学习
相关推荐阅读
minicaihong 2020-10-22 16:44
场效应管放大电路的直流偏置电路详解
什么是偏置电路晶体管构成的放大器要做到不失真地将信号电压放大,就必须保证晶体管的发射结正偏、集电结反偏。即应该设置它的工作点。所谓工作点就是通过外部电路的设置使晶体管的基极、发射极和集电极处于所要求的...
minicaihong 2020-10-22 16:37
场效应管偏置电路-场效应管偏置电路的工作原理及作用分析
什么是偏置电路晶体管构成的放大器要做到不失真地将信号电压放大,就必须保证晶体管的发射结正偏、集电结反偏。即应该设置它的工作点。所谓工作点就是通过外部电路的设置使晶体管的基极、发射极和集电极处于所要求的...
minicaihong 2020-10-22 16:27
MOS管偏置电路-MOS管直流、恒流等偏置电路图文及方程详解
MOS管偏置电路MOS管直流偏置电路MOS管的单电源直流偏置电路有两种:1、只能用于结型和耗尽型MOS管的自给偏置电路。2、可用于各种MOS管的分压式偏置电路自给MOS管偏置电路(1)图解法根据图中电...
minicaihong 2020-05-27 09:50
sprintf 格式化字符串
sprintf 格式化字符串好久没写博客了,又遇到自己觉得很傻的问题,格式化字符串还要找下定义和用法sprintf() 函数把格式化的字符串写入变量中。arg1、arg2、++ 参数将被插入...
minicaihong 2020-05-25 15:07
12T和1T的单片机
标准51是12T的,就是说12个时钟周期(晶振周期,例如12M的,周期是1/12M,单位秒),机器做一个指令度周期,刚好就是1/12M*12=1uS,常见指令例如nop就是一个周期,刚好1uS,其他的...
minicaihong 2020-05-23 16:22
4HC595驱动8*8点阵屏
74HC595驱动8*8点阵屏置顶 菜袅1号 2020-05-19 10:00:03   52   收藏展开该项目使用国产M0核单片机,驱动方式类似于stm32平台;点阵驱动芯片:...
我要评论
1
5
关闭 站长推荐上一条 /3 下一条