日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stm32 DMA 配置 串口程序

發(fā)布時間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm32 DMA 配置 串口程序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
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);? ? ? ? //打開串口時鐘
? ?
? ?
? ?/* 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請求?
? ?USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);? ? ? ?? ?//使能USART1接收DMA請求
? ?? ??
? ?USART_Cmd(USART1, ENABLE);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?//啟動串口?

}


/**********************************************************************************
**函數(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)先級分組為Group2:0-3搶占式優(yōu)先級,0-3的響應(yīng)式優(yōu)先級
? ? NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
? ?? ???
? ? NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;? ? ? ? ? ? ? ?? ?? ?? ?? ?? ?? ?? ???//串口接收中斷打開
? ? NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = USART1_IRQn_Priority;??//設(shè)置中斷優(yōu)先級
? ? 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時鐘?

? ? ? ? /*
? ? ? ???*??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)先級:高
? ? ? ???*/? ??
? ? 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)先級為高)
? ? 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)先級:高
? ? ? ? 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時鐘?

? ? ? ? /*
? ? ? ???*??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)先級:高
? ? ? ???*/? ??
? ? 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)先級為高)
? ? 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);
? ? ? ???
}
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的stm32 DMA 配置 串口程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。