資源簡介
天下文章一般抄,只能靠自己實踐。本代碼用于STM32F429,使用HAL庫版本:STM32Cube_FW_F4_V1.11.0。精簡其他不需要的程序段,只留c和h文件,直接添加可用,已測試過。

代碼片段和文件信息
#include?“BSP_USARTDMA.h“
//stm32f4xx_hal_conf.h文件中修改啟用??#define?HAL_UART_MODULE_ENABLED
//stm32f4xx_hal_conf.h文件中修改啟用??#define?HAL_DMA_MODULE_ENABLED
/*
1、STM32F429有2個DMA控制器(DMA1和DMA2)每個控制器有8個數據流,每個數據流有8個通道(請求)。
2、支持外設到存儲器、存儲器到外設、存儲器到存儲器傳輸的常規通道。(僅DMA2支持存儲器到存儲器的傳輸)
*/
UART_HandleTypeDef?UARTDMA_HD;
DMA_HandleTypeDef?UARTDMATX_HD;
DMA_HandleTypeDef?UARTDMARX_HD;
uint8_t?RX_BUF[RXBUF_SIZE];
volatile?uint8_t?RX_OK?=?0;
volatile?uint16_t?RX_CNT?=?0;
//初始化
void?_BSP_USARTDMA_Configuration(uint32_t?bRate)
{
??UARTDMA_HD.Instance?=?USARTx_NUM;??????????????????//串口編號
??UARTDMA_HD.Init.BaudRate?=?bRate;??????????????????//波特率
??UARTDMA_HD.Init.WordLength?=?UART_WORDLENGTH_8B;???//字長為8位格式
??UARTDMA_HD.Init.StopBits?=?UART_STOPBITS_1;????????//一個停止位
??UARTDMA_HD.Init.Parity?=?UART_PARITY_NONE;?????????//無奇偶校驗位
??UARTDMA_HD.Init.HwFlowCtl?=?UART_HWCONTROL_NONE;???//無硬件流控制
??UARTDMA_HD.Init.Mode?=?UART_MODE_TX_RX;????????????//全雙工收發模式
??UARTDMA_HD.Init.OverSampling?=?UART_OVERSAMPLING_16;???//16倍過采樣獲取更好的容錯性
??HAL_UART_Init(&UARTDMA_HD);????????????????????????//內部調用__HAL_UART_ENABLE(handler);函數
????
??__HAL_UART_ENABLE_IT(&UARTDMA_HD?UART_IT_IDLE);???//開啟IDLE中斷,以幀方式接收不定長數據
??__HAL_DMA_ENABLE_IT(&UARTDMATX_HD?DMA_IT_TC);?????//開啟DMA傳輸完成中斷
??__HAL_DMA_ENABLE_IT(&UARTDMARX_HD?DMA_IT_TC);
??HAL_UART_Receive_DMA(&UARTDMA_HD?RX_BUF?RXBUF_SIZE);
}
//調用初始化函數HAL_UART_Init時,會先調用MSP初始化回調函數,進行引腳配置和NVIC配置
void?HAL_UART_MspInit(UART_HandleTypeDef?*huart)
{
??//GPIO端口設置
??GPIO_InitTypeDef?GPIO_InitStructure;
??if(huart->Instance?==?USART1)?????//如果是串口1,進行串口1?MSP初始化
??{
????__HAL_RCC_GPIOA_CLK_ENABLE();?????//使能GPIOA時鐘
????__HAL_RCC_USART1_CLK_ENABLE();????//使能USART1時鐘
????__HAL_RCC_DMA2_CLK_ENABLE();??????//DMA2時鐘使能
????GPIO_InitStructure.Pin?=?GPIO_PIN_9?|?GPIO_PIN_10; //PA9(USART1_TX)\PA10(USART1_RX)
????GPIO_InitStructure.Mode?=?GPIO_MODE_AF_PP;??????????????//復用推挽輸出
????GPIO_InitStructure.Pull?=?GPIO_PULLUP;??????????????????//上拉
????GPIO_InitStructure.Speed?=?GPIO_SPEED_FREQ_VERY_HIGH; //高速
????GPIO_InitStructure.Alternate?=?GPIO_AF7_USART1;?????????//復用為USART1
????HAL_GPIO_Init(GPIOA?&GPIO_InitStructure);??????????????//初始化
????????
????//Tx?DMA配置
????//數據流選擇
????UARTDMATX_HD.Instance?=?DMA2_Stream7;
????//通道選擇
????UARTDMATX_HD.Init.Channel?=?DMA_CHANNEL_4;
????//存儲器到外設
????UARTDMATX_HD.Init.Direction?=?DMA_MEMORY_TO_PERIPH;
????//外設非增量模式UART只有一個DR寄存器,地址不能變化
????UARTDMATX_HD.Init.PeriphInc?=?DMA_PINC_DISABLE;
????//存儲器增量模式
????UARTDMATX_HD.Init.MemInc?=?DMA_MINC_ENABLE;
????//外設數據長度:8位一個字節
????UARTDMATX_HD.Init.PeriphDataAlignment?=?DMA_PDATAALIGN_BYTE;
????//存儲器數據長度:8位
????UARTDMATX_HD.Init.MemDataAlignment?=?DMA_MDATAALIGN_BYTE;
????//外設普通模式
????UARTDMATX_HD.Init.Mode?=?DMA_NORMAL;
????//中等優先級
????UARTDMATX_HD.Init.Priority?=?DMA_PRIORITY_LOW;
????//關閉FIFO
????UARTDMATX_HD.Init.FIFOMode?=?DMA_FIFOMODE_DISABLE;??????????????
????//FIFO閥值選擇
????UARTDMATX_HD.Init.FIFOThres
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????6437??2019-06-03?00:13??USART使用DMA方式收發數據\BSP_USARTDMA.c
?????文件????????682??2019-06-03?00:06??USART使用DMA方式收發數據\BSP_USARTDMA.h
?????文件???????1019??2019-06-03?00:19??USART使用DMA方式收發數據\main.c
?????文件?????????92??2019-06-03?00:21??USART使用DMA方式收發數據\readme.txt
?????文件?????195675??2019-06-03?00:22??USART使用DMA方式收發數據\USART.jpg
?????目錄??????????0??2019-06-03?00:22??USART使用DMA方式收發數據
-----------?---------??----------?-----??----
???????????????203905????????????????????6
評論
共有 條評論