STM32CubeMx開發之路—4採用DMA方式收發數據
運行環境
- Windows10
- STM32CubeMX___Version 5.0.0
- Keil5(MDK5)___Version 5.15
簡介
本例程主要講解如何通過串口發送數據和重定向printf
STM32CubeMx基本配置
基礎配置過程請參考 STM32CubeMx(Keil5)開發之路—配置第一個項目
STM32CubeMx USART1配置
1——點擊USART1進行設置
2——模式選擇Asynchronous異步傳輸
3——可以看到右邊自動出現了Tx和Rx
4——可以自行設置波特率,停止位,校驗位等參數
1——選擇DMA設置
2——添加DMA
3——添加DMA的Tx和Rx通道
1——選擇NVIC設置
2——打開USART1全局中斷
3——隨便設置一個優先級
代碼修改
- 在usart.c文件中添加如下代碼,定義全局變量
uint8_t Rx_Flag = 0;
uint16_t Rx_Len = 0;
uint8_t Rx_Buf[Rx_Max] = {0};
- 在usart.h文件中添加如下代碼,聲明全局變量
#define Rx_Max 1024
extern uint8_t Rx_Flag;
extern uint16_t Rx_Len;
extern uint8_t Rx_Buf[Rx_Max];
- 1——在stm32f1xx_it.c文件中添加對usart.h的聲明
- 2——在stm32f1xx_it.c文件中添加如下代碼,對中斷的處理
uint32_t temp;
if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET))
{
/*清除狀態寄存器和串口數據寄存器*/
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
/*失能DMA接收*/
HAL_UART_DMAStop(&huart1);
/*讀取接收長度,總大小-剩餘大小*/
temp = huart1.hdmarx->Instance->CNDTR;
Rx_Len = Rx_Max - temp;
/*接收標誌位置1*/
Rx_Flag=1;
/*使能接收DMA接收*/
HAL_UART_Receive_DMA(&huart1,Rx_Buf,Rx_Max);
}
- 在main.c文件中添加如下代碼
/*Enable DMA IRQ*/
HAL_UART_Receive_DMA(&huart1, Rx_Buf, Rx_Max);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
- 和
if(Rx_Flag) // Receive flag
{
Rx_Flag=0; // clean flag
HAL_UART_Transmit_DMA(&huart1, Rx_Buf, Rx_Len);
}
- 燒錄代碼後打開出口調試助手
- 正確的話會看到如下輸出
小結
DMA常用場合
- 對接收和發送數據量比較大的時候,減輕CPU工作
- 對嵌入式系統實時性要求比較高的時候建議使用
本節主要講如何採用DMA的方式進行串口數據的接收和發送,使用DMA主要就是減輕CPU的工作,讓CPU有更多的時間去處理其他的工作。