stm32 DMA 配置 串口程序
生活随笔
收集整理的這篇文章主要介紹了
stm32 DMA 配置 串口程序
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
| STM32的串口1發(fā)送、接收DMA模式函數(shù)配置,已經(jīng)調(diào)試可用,大家可以交流學(xué)習(xí)下 /********************************************************************************** **函數(shù)名稱:void USART1_Config(void) **函數(shù)功能:USART1串口引腳初始化 **輸入?yún)?shù):無 **返回參數(shù):無 **函數(shù)調(diào)用:內(nèi)部調(diào)用 **********************************************************************************/ static void USART1_Config(void) { ? ?GPIO_InitTypeDef GPIO_InitStructure; ? ?USART_InitTypeDef USART_InitStructure; ? ?RCC_APB2PeriphClockCmd(USART1_RCC | RCC_APB2Periph_USART1, ENABLE);? ? ? ? //打開串口時(shí)鐘 ? ? ? ? ? ?/* USART1 GPIO config */ ? ?/* Configure USART1 Tx (PA.9) as alternate function push-pull */ ? ?GPIO_InitStructure.GPIO_Pin? ?= USART1_TX; ? ?GPIO_InitStructure.GPIO_Mode??= GPIO_Mode_AF_PP; ? ?GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ? ?GPIO_Init(USART1_PORT, &GPIO_InitStructure);? ? ? ? ?/* Configure USART1 Rx (PA.10) as input floating */ ? ?GPIO_InitStructure.GPIO_Pin??= USART1_RX; ? ?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; ? ?GPIO_Init(USART1_PORT, &GPIO_InitStructure); ? ? ? ?/* USART1 mode config */ ? ?USART_InitStructure.USART_BaudRate? ?= BOOTRATE; ? ?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_Init(USART1, &USART_InitStructure);? ? ?//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);? ?//使能串口1中斷 ? ?USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);??? ? ? ?? ?//使能USART1發(fā)送DMA請(qǐng)求? ? ?USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);? ? ? ?? ?//使能USART1接收DMA請(qǐng)求 ? ?? ?? ? ?USART_Cmd(USART1, ENABLE);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?//啟動(dòng)串口? } /********************************************************************************** **函數(shù)名稱:void USART1_NVIC_Configuration(void) **函數(shù)功能:USART1串口中斷初始化 **輸入?yún)?shù):無 **返回參數(shù):無 **函數(shù)調(diào)用:內(nèi)部調(diào)用 **********************************************************************************/ static void USART1_NVIC_Configuration(void) { ? ? NVIC_InitTypeDef NVIC_InitStructure; ? ? //設(shè)置NVIC優(yōu)先級(jí)分組為Group2:0-3搶占式優(yōu)先級(jí),0-3的響應(yīng)式優(yōu)先級(jí) ? ? NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); ? ?? ??? ? ? NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;? ? ? ? ? ? ? ?? ?? ?? ?? ?? ?? ?? ???//串口接收中斷打開 ? ? NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = USART1_IRQn_Priority;??//設(shè)置中斷優(yōu)先級(jí) ? ? NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; ? ? NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ? ? NVIC_Init(&NVIC_InitStructure); } /********************************************************************************** **函數(shù)名稱:void USART1_Init(void) **函數(shù)功能:USART1串口初始化 **輸入?yún)?shù):無 **返回參數(shù):無 **函數(shù)調(diào)用:內(nèi)部調(diào)用 **********************************************************************************/ static void USART1_Init(void) { ? ? USART1_Config();? ? ? ?? ?? ?? ?? ? //USART1引腳功能初始化 ? ? ? ? USART1_NVIC_Configuration();? ? ? ? //USART1中斷初始化 } /********************************************************************************** **函數(shù)名稱:static void DMA1_USART1_TX_Configuration(void) **函數(shù)功能:DMA1_USART1_TX初始化 **輸入?yún)?shù):無 **返回參數(shù):無 **函數(shù)調(diào)用:外部調(diào)用 **********************************************************************************/ static void DMA1_USART1_TX_Configuration(void) { ? ? DMA_InitTypeDef DMA_InitStructure; ? ? ? ? RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);? ? ? ?? ???//開啟DMA時(shí)鐘? ? ? ? ? /* ? ? ? ???*??DMA設(shè)置: ? ???*??設(shè)置DMA源:內(nèi)存地址&串口數(shù)據(jù)寄存器地址 ? ???*??方向:內(nèi)存-->外設(shè) ? ???*??每次傳輸位:8bit ? ???*??傳輸大小DMA_BufferSize=SENDBUFF_SIZE ? ???*??地址自增模式:外設(shè)地址不增,內(nèi)存地址自增1 ? ???*??DMA模式:一次傳輸,非循環(huán) ? ???*??優(yōu)先級(jí):高 ? ? ? ???*/? ?? ? ? DMA_DeInit(DMA1_Channel4);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//串口1的DMA傳輸通道是通道4 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?? ? ? DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);? ???//設(shè)置DMA源 ? ? DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART1_SendBuff;? ? ? ?? ? //DMA內(nèi)存基地址 ? ? DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;? ?? ?? ?? ?? ???//外設(shè)作為DMA的目的端 ? ? DMA_InitStructure.DMA_BufferSize = USART1_SENDBUFF_SIZE;? ?? ?? ???//傳輸大小 ? ? DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;? ?//外設(shè)地址不增加 ? ? DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;? ?? ?? ?? ?//內(nèi)存地址自增1 ? ? DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;? ? ? ? ? ? ? ? //外設(shè)數(shù)據(jù)寬度8bit ? ? DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //內(nèi)存數(shù)據(jù)寬度8bit ? ? DMA_InitStructure.DMA_Mode =??DMA_Mode_Circular;? ?? ?? ?? ?? ?? ? //DMA_Mode_Normal(只傳送一次), DMA_Mode_Circular (不停地傳送) ? ? DMA_InitStructure.DMA_Priority = DMA_Priority_High;? ?? ?? ?? ?? ? //(DMA傳送優(yōu)先級(jí)為高) ? ? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? //非內(nèi)存到內(nèi)存 ? ?? ? ? ? ? DMA_Init(DMA1_Channel4, &DMA_InitStructure);? ? ? ?? ?? ?? ??? ? ? ? ? DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);? ?? ? //使能DMA通道4傳輸完成中斷 } /********************************************************************************** **函數(shù)名稱:static void DMA1_USART1_TX_NVIC_Configuration(void) **函數(shù)功能:DMA中斷初始化 **輸入?yún)?shù):無 **返回參數(shù):無 **函數(shù)調(diào)用:外部調(diào)用 **********************************************************************************/ static void DMA1_USART1_TX_NVIC_Configuration(void) { ? ?NVIC_InitTypeDef NVIC_InitStructure; ? ? ? ?NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;?? ? ?NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;?? ? ?NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;?? ? ?NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;?? ? ?NVIC_Init(&NVIC_InitStructure); } /********************************************************************************** **函數(shù)名稱:static void DMA1_USART1_TX_Init(void) **函數(shù)功能:USART1串口初始化 **輸入?yún)?shù):無 **返回參數(shù):無 **函數(shù)調(diào)用:外部調(diào)用 **********************************************************************************/ static void DMA1_USART1_TX_Init(void) { ? ?? ? ? ? DMA1_USART1_TX_Configuration(); ? ? ? ? DMA1_USART1_TX_NVIC_Configuration(); } /********************************************************************************** **函數(shù)名稱:static void DMA1_USART1_RX_Configuration(void) **函數(shù)功能:DMA1_RX初始化 **輸入?yún)?shù):無 **返回參數(shù):無 **函數(shù)調(diào)用:外部調(diào)用 **********************************************************************************/ static void DMA1_USART1_RX_Configuration(void) {? ? ? ?? ? ? ? ? DMA_InitTypeDef DMA_InitStructure; ? ? ? ? RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); ? ? ? ? DMA_DeInit(DMA1_Channel5); ? ? ? ? DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;? ?? ?? ???//DMA外設(shè)基地址 ? ? ? ? DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART1_RecvBuff; ? ? ? ? ? ? ? ?? ? //DMA內(nèi)存基地址 ? ? ? ? DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???? ? ? ?? ? //外設(shè)作為數(shù)據(jù)傳輸?shù)膩碓?br style="word-wrap:break-word" /> ? ? ? ? DMA_InitStructure.DMA_BufferSize = USART1_RECVBUFF_SIZE; ? ? ? ? ? ? ? ? ? ? ? ?? ? //DMA緩存大小 ? ? ? ? DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; ? ? ? ?? ? //外設(shè)地址寄存器不變 ? ? ? ? DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; ? ? ? ? ? ? ? ???? ? ? ?? ? //內(nèi)存地址寄存器遞增 ? ? ? ? DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外設(shè)數(shù)據(jù)寬度8bit? ? ? ? ? DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; ? ? ? ?? ? //內(nèi)存數(shù)據(jù)寬度8bit ? ? ? ? DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? //循環(huán)模式 ? ? ? ? DMA_InitStructure.DMA_Priority = DMA_Priority_High; ? ? ? ? ? ? ? ? ? ? ? ?? ?? ???//優(yōu)先級(jí):高 ? ? ? ? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?? ???//非內(nèi)存到內(nèi)存 ? ? ? ? DMA_Init(DMA1_Channel5, &DMA_InitStructure);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? //初始化DMA ? ? ? ? DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE); //使能DMA通道5傳輸完成中斷 ? ? ? ? DMA_Cmd(DMA1_Channel5, ENABLE);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //使能DMA通道5 ? ? ? ?? } /************************************************************** ** 函數(shù)名稱 :DMA1_USART1_RX_NVIC_Configuration(void) ** 功能說明 :NVIC初始化 ** 輸入?yún)?shù) :無 ** 輸出參數(shù) :無 ** 返回參數(shù) :無 ** 注? ? 意 :無 ***************************************************************/ static void DMA1_USART1_RX_NVIC_Configuration(void) { ? ? ? ? NVIC_InitTypeDef NVIC_InitStructure; ? ? ? ? NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); ? ? ? ? NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn; ? ? ? ? NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; ? ? ? ? NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; ? ? ? ? NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ? ? ? ? NVIC_Init(&NVIC_InitStructure);? ? ? ?? } /********************************************************************************** **函數(shù)名稱:void DMA1_USART1_RX_Init(void) **函數(shù)功能:USART1串口初始化 **輸入?yún)?shù):無 **返回參數(shù):無 **函數(shù)調(diào)用:外部調(diào)用 **********************************************************************************/ static void DMA1_USART1_RX_Init(void) { ? ?? ? ? ? DMA1_USART1_RX_Configuration(); ? ? ? ? DMA1_USART1_RX_NVIC_Configuration(); } /********************************************************************************** **函數(shù)名稱:static void DMA1_USART1_Init(void) **函數(shù)功能:DMA1串口初始化 **輸入?yún)?shù):無 **返回參數(shù):無 **函數(shù)調(diào)用:外部調(diào)用 **********************************************************************************/ static void DMA1_USART1_Init(void) { ? ?? ? ? ? DMA1_USART1_TX_Init(); ? ? DMA1_USART1_RX_Init(); } /********************************************************************************** **函數(shù)名稱:void USART1_Send_Buf(u8 *buf , unsigned int len) **函數(shù)功能:通過DMA發(fā)送串口數(shù)據(jù) **輸入?yún)?shù):data -- 發(fā)送數(shù)據(jù) **返回參數(shù):0--發(fā)送不成功 **? ?? ?? ? 1--發(fā)送成功 **函數(shù)調(diào)用:外部調(diào)用 **********************************************************************************/ void USART1_Send_Buf(u8 *buf , unsigned int len) { ? ? ? ? DMA_InitTypeDef DMA_InitStructure; ? ? ? ? RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);? ? ? ?? ???//開啟DMA時(shí)鐘? ? ? ? ? /* ? ? ? ???*??DMA設(shè)置: ? ???*??設(shè)置DMA源:內(nèi)存地址&串口數(shù)據(jù)寄存器地址 ? ???*??方向:內(nèi)存-->外設(shè) ? ???*??每次傳輸位:8bit ? ???*??傳輸大小DMA_BufferSize=SENDBUFF_SIZE ? ???*??地址自增模式:外設(shè)地址不增,內(nèi)存地址自增1 ? ???*??DMA模式:一次傳輸,非循環(huán) ? ???*??優(yōu)先級(jí):高 ? ? ? ???*/? ?? ? ? DMA_DeInit(DMA1_Channel4);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//串口1的DMA傳輸通道是通道4 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?? ? ? DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);? ???//設(shè)置DMA源 ? ? DMA_InitStructure.DMA_MemoryBaseAddr = (u32)buf;? ? ? ? ? ? ? ? ? ? ? ?? ?? ???//DMA內(nèi)存基地址 ? ? DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;? ?? ?? ?? ?? ???//外設(shè)作為DMA的目的端 ? ? DMA_InitStructure.DMA_BufferSize = len;? ?? ?? ?? ?? ?? ?? ?? ?? ? //傳輸大小 ? ? DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;? ?//外設(shè)地址不增加 ? ? DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;? ?? ?? ?? ?//內(nèi)存地址自增1 ? ? DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;? ? ? ? ? ? ? ? //外設(shè)數(shù)據(jù)寬度8bit ? ? DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //內(nèi)存數(shù)據(jù)寬度8bit ? ? DMA_InitStructure.DMA_Mode =??DMA_Mode_Normal;? ?? ?? ?? ?? ?? ?? ?//DMA_Mode_Normal(只傳送一次), DMA_Mode_Circular (不停地傳送) ? ? DMA_InitStructure.DMA_Priority = DMA_Priority_High;? ?? ?? ?? ?? ? //(DMA傳送優(yōu)先級(jí)為高) ? ? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? //非內(nèi)存到內(nèi)存 ? ?? ? ? ? ? DMA_Init(DMA1_Channel4, &DMA_InitStructure);? ? ? ?? ?? ?? ??? ? ? ? ? DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);? ?? ? //使能DMA通道4傳輸完成中斷? ? ? ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? ? ? ? DMA_Cmd(DMA1_Channel4, ENABLE); ? ? ? ??? } |
總結(jié)
以上是生活随笔為你收集整理的stm32 DMA 配置 串口程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32F105使用固件库的时候串口乱
- 下一篇: stm32启动文件ld md hd cl