stm32 DMA 配置 串口程序
生活随笔
收集整理的這篇文章主要介紹了
stm32 DMA 配置 串口程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
| STM32的串口1發送、接收DMA模式函數配置,已經調試可用,大家可以交流學習下 /********************************************************************************** **函數名稱:void USART1_Config(void) **函數功能:USART1串口引腳初始化 **輸入參數:無 **返回參數:無 **函數調用:內部調用 **********************************************************************************/ static void USART1_Config(void) { ? ?GPIO_InitTypeDef GPIO_InitStructure; ? ?USART_InitTypeDef USART_InitStructure; ? ?RCC_APB2PeriphClockCmd(USART1_RCC | RCC_APB2Periph_USART1, ENABLE);? ? ? ? //打開串口時鐘 ? ? ? ? ? ?/* 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發送DMA請求? ? ?USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);? ? ? ?? ?//使能USART1接收DMA請求 ? ?? ?? ? ?USART_Cmd(USART1, ENABLE);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?//啟動串口? } /********************************************************************************** **函數名稱:void USART1_NVIC_Configuration(void) **函數功能:USART1串口中斷初始化 **輸入參數:無 **返回參數:無 **函數調用:內部調用 **********************************************************************************/ static void USART1_NVIC_Configuration(void) { ? ? NVIC_InitTypeDef NVIC_InitStructure; ? ? //設置NVIC優先級分組為Group2:0-3搶占式優先級,0-3的響應式優先級 ? ? NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); ? ?? ??? ? ? NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;? ? ? ? ? ? ? ?? ?? ?? ?? ?? ?? ?? ???//串口接收中斷打開 ? ? NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = USART1_IRQn_Priority;??//設置中斷優先級 ? ? NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; ? ? NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ? ? NVIC_Init(&NVIC_InitStructure); } /********************************************************************************** **函數名稱:void USART1_Init(void) **函數功能:USART1串口初始化 **輸入參數:無 **返回參數:無 **函數調用:內部調用 **********************************************************************************/ static void USART1_Init(void) { ? ? USART1_Config();? ? ? ?? ?? ?? ?? ? //USART1引腳功能初始化 ? ? ? ? USART1_NVIC_Configuration();? ? ? ? //USART1中斷初始化 } /********************************************************************************** **函數名稱:static void DMA1_USART1_TX_Configuration(void) **函數功能:DMA1_USART1_TX初始化 **輸入參數:無 **返回參數:無 **函數調用:外部調用 **********************************************************************************/ static void DMA1_USART1_TX_Configuration(void) { ? ? DMA_InitTypeDef DMA_InitStructure; ? ? ? ? RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);? ? ? ?? ???//開啟DMA時鐘? ? ? ? ? /* ? ? ? ???*??DMA設置: ? ???*??設置DMA源:內存地址&串口數據寄存器地址 ? ???*??方向:內存-->外設 ? ???*??每次傳輸位:8bit ? ???*??傳輸大小DMA_BufferSize=SENDBUFF_SIZE ? ???*??地址自增模式:外設地址不增,內存地址自增1 ? ???*??DMA模式:一次傳輸,非循環 ? ???*??優先級:高 ? ? ? ???*/? ?? ? ? DMA_DeInit(DMA1_Channel4);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//串口1的DMA傳輸通道是通道4 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?? ? ? DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);? ???//設置DMA源 ? ? DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART1_SendBuff;? ? ? ?? ? //DMA內存基地址 ? ? DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;? ?? ?? ?? ?? ???//外設作為DMA的目的端 ? ? DMA_InitStructure.DMA_BufferSize = USART1_SENDBUFF_SIZE;? ?? ?? ???//傳輸大小 ? ? DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;? ?//外設地址不增加 ? ? DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;? ?? ?? ?? ?//內存地址自增1 ? ? DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;? ? ? ? ? ? ? ? //外設數據寬度8bit ? ? DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //內存數據寬度8bit ? ? DMA_InitStructure.DMA_Mode =??DMA_Mode_Circular;? ?? ?? ?? ?? ?? ? //DMA_Mode_Normal(只傳送一次), DMA_Mode_Circular (不停地傳送) ? ? DMA_InitStructure.DMA_Priority = DMA_Priority_High;? ?? ?? ?? ?? ? //(DMA傳送優先級為高) ? ? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? //非內存到內存 ? ?? ? ? ? ? DMA_Init(DMA1_Channel4, &DMA_InitStructure);? ? ? ?? ?? ?? ??? ? ? ? ? DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);? ?? ? //使能DMA通道4傳輸完成中斷 } /********************************************************************************** **函數名稱:static void DMA1_USART1_TX_NVIC_Configuration(void) **函數功能:DMA中斷初始化 **輸入參數:無 **返回參數:無 **函數調用:外部調用 **********************************************************************************/ 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); } /********************************************************************************** **函數名稱:static void DMA1_USART1_TX_Init(void) **函數功能:USART1串口初始化 **輸入參數:無 **返回參數:無 **函數調用:外部調用 **********************************************************************************/ static void DMA1_USART1_TX_Init(void) { ? ?? ? ? ? DMA1_USART1_TX_Configuration(); ? ? ? ? DMA1_USART1_TX_NVIC_Configuration(); } /********************************************************************************** **函數名稱:static void DMA1_USART1_RX_Configuration(void) **函數功能:DMA1_RX初始化 **輸入參數:無 **返回參數:無 **函數調用:外部調用 **********************************************************************************/ 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外設基地址 ? ? ? ? DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART1_RecvBuff; ? ? ? ? ? ? ? ?? ? //DMA內存基地址 ? ? ? ? DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???? ? ? ?? ? //外設作為數據傳輸的來源 ? ? ? ? DMA_InitStructure.DMA_BufferSize = USART1_RECVBUFF_SIZE; ? ? ? ? ? ? ? ? ? ? ? ?? ? //DMA緩存大小 ? ? ? ? DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; ? ? ? ?? ? //外設地址寄存器不變 ? ? ? ? DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; ? ? ? ? ? ? ? ???? ? ? ?? ? //內存地址寄存器遞增 ? ? ? ? DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外設數據寬度8bit? ? ? ? ? DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; ? ? ? ?? ? //內存數據寬度8bit ? ? ? ? DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? //循環模式 ? ? ? ? DMA_InitStructure.DMA_Priority = DMA_Priority_High; ? ? ? ? ? ? ? ? ? ? ? ?? ?? ???//優先級:高 ? ? ? ? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?? ???//非內存到內存 ? ? ? ? DMA_Init(DMA1_Channel5, &DMA_InitStructure);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? //初始化DMA ? ? ? ? DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE); //使能DMA通道5傳輸完成中斷 ? ? ? ? DMA_Cmd(DMA1_Channel5, ENABLE);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //使能DMA通道5 ? ? ? ?? } /************************************************************** ** 函數名稱 :DMA1_USART1_RX_NVIC_Configuration(void) ** 功能說明 :NVIC初始化 ** 輸入參數 :無 ** 輸出參數 :無 ** 返回參數 :無 ** 注? ? 意 :無 ***************************************************************/ 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);? ? ? ?? } /********************************************************************************** **函數名稱:void DMA1_USART1_RX_Init(void) **函數功能:USART1串口初始化 **輸入參數:無 **返回參數:無 **函數調用:外部調用 **********************************************************************************/ static void DMA1_USART1_RX_Init(void) { ? ?? ? ? ? DMA1_USART1_RX_Configuration(); ? ? ? ? DMA1_USART1_RX_NVIC_Configuration(); } /********************************************************************************** **函數名稱:static void DMA1_USART1_Init(void) **函數功能:DMA1串口初始化 **輸入參數:無 **返回參數:無 **函數調用:外部調用 **********************************************************************************/ static void DMA1_USART1_Init(void) { ? ?? ? ? ? DMA1_USART1_TX_Init(); ? ? DMA1_USART1_RX_Init(); } /********************************************************************************** **函數名稱:void USART1_Send_Buf(u8 *buf , unsigned int len) **函數功能:通過DMA發送串口數據 **輸入參數:data -- 發送數據 **返回參數:0--發送不成功 **? ?? ?? ? 1--發送成功 **函數調用:外部調用 **********************************************************************************/ void USART1_Send_Buf(u8 *buf , unsigned int len) { ? ? ? ? DMA_InitTypeDef DMA_InitStructure; ? ? ? ? RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);? ? ? ?? ???//開啟DMA時鐘? ? ? ? ? /* ? ? ? ???*??DMA設置: ? ???*??設置DMA源:內存地址&串口數據寄存器地址 ? ???*??方向:內存-->外設 ? ???*??每次傳輸位:8bit ? ???*??傳輸大小DMA_BufferSize=SENDBUFF_SIZE ? ???*??地址自增模式:外設地址不增,內存地址自增1 ? ???*??DMA模式:一次傳輸,非循環 ? ???*??優先級:高 ? ? ? ???*/? ?? ? ? DMA_DeInit(DMA1_Channel4);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//串口1的DMA傳輸通道是通道4 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?? ? ? DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);? ???//設置DMA源 ? ? DMA_InitStructure.DMA_MemoryBaseAddr = (u32)buf;? ? ? ? ? ? ? ? ? ? ? ?? ?? ???//DMA內存基地址 ? ? DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;? ?? ?? ?? ?? ???//外設作為DMA的目的端 ? ? DMA_InitStructure.DMA_BufferSize = len;? ?? ?? ?? ?? ?? ?? ?? ?? ? //傳輸大小 ? ? DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;? ?//外設地址不增加 ? ? DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;? ?? ?? ?? ?//內存地址自增1 ? ? DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;? ? ? ? ? ? ? ? //外設數據寬度8bit ? ? DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //內存數據寬度8bit ? ? DMA_InitStructure.DMA_Mode =??DMA_Mode_Normal;? ?? ?? ?? ?? ?? ?? ?//DMA_Mode_Normal(只傳送一次), DMA_Mode_Circular (不停地傳送) ? ? DMA_InitStructure.DMA_Priority = DMA_Priority_High;? ?? ?? ?? ?? ? //(DMA傳送優先級為高) ? ? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? //非內存到內存 ? ?? ? ? ? ? DMA_Init(DMA1_Channel4, &DMA_InitStructure);? ? ? ?? ?? ?? ??? ? ? ? ? DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);? ?? ? //使能DMA通道4傳輸完成中斷? ? ? ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? ? ? ? DMA_Cmd(DMA1_Channel4, ENABLE); ? ? ? ??? } |
總結
以上是生活随笔為你收集整理的stm32 DMA 配置 串口程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32F105使用固件库的时候串口乱
- 下一篇: stm32启动文件ld md hd cl