STM32 DMA 應(yīng)用之(二) DMA 串口 數(shù)據(jù)傳輸--發(fā)送
一、DMA請(qǐng)求映像
由此我們知道如果需要使用串口1的發(fā)送功能需要用到的是DMA1_Channel4
使用串口1的接收功能需要用到的是DMA1_Channel5
二、怎樣配置軟件來使用DMA 把數(shù)據(jù)傳到串口發(fā)送?
(1)配置dma
/**************************************************************************
*函數(shù)名稱:Dma_Init
*功能描述:利用DMA把內(nèi)存的數(shù)據(jù)傳輸?shù)酱诎l(fā)送達(dá)到高速傳輸?shù)哪康?/p>
*
*輸入?yún)?shù):無
*返回值:無
*其他說明:無
*當(dāng)前版本: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);//外設(shè)地址
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)Uart_Send_Buffer;
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;//外設(shè)作為目的地址//DMA_DIR_PeripheralSRC;//外設(shè)作為DMA的源端
DMA_InitStructure.DMA_BufferSize=5;//BufferSize;//傳輸大小
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外設(shè)遞增模式禁止DMA_PeripheralInc_Enable;//外設(shè)地址增加
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//內(nèi)存地址自增
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//傳輸方式:字節(jié)DMA_PeripheralDataSize_Word;//字(32位)
DMA_InitStructure.DMA_MemoryDataSize=DMA_PeripheralDataSize_Byte;//內(nèi)存存儲(chǔ)方式:字節(jié)DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//DMA_Mode_Normal正常模式,只傳送一次;DMA_Mode_Circular:循環(huán)模式,不停的傳送;
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方式發(fā)送
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
//啟動(dòng)串口
USART_Cmd(USART1,ENABLE);
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
傳輸完成則進(jìn)入DMA1_Channel4中斷;
注意這句話:USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); 這是使能指定USART的DMA請(qǐng)求;(不同的外設(shè)都有這個(gè) xxx_DMACmd()請(qǐng)求;)
USART_DMAReq_Tx:發(fā)送DMA請(qǐng)求
USART_DMAReq_Rx:接收DMA請(qǐng)求
串口配置
/*****************************************************************
*函數(shù)名稱:USART1_Init
*功能描述:配置串口1初始化
*
*輸入?yún)?shù):無
*返回值:無
*其他說明:無
*當(dāng)前版本: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 =