STM32CubeMx開發之路—4採用DMA方式收發數據

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有更多的時間去處理其他的工作。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章