天天看點

STM32CubeMX生成代碼學習筆記(三)序列槽DMA不定長接收+序列槽列印1. 配置CubeMX工程USART2. 添加使用者代碼3. 測試代碼4.遇到的問題:

1. 配置CubeMX工程USART

首先配置時鐘,配置同學習筆記二。

配置USART1:選擇序列槽模式為Asynchronous(異步):

STM32CubeMX生成代碼學習筆記(三)序列槽DMA不定長接收+序列槽列印1. 配置CubeMX工程USART2. 添加使用者代碼3. 測試代碼4.遇到的問題:

配置波特率,位元組位數,校驗方式和停止位:

STM32CubeMX生成代碼學習筆記(三)序列槽DMA不定長接收+序列槽列印1. 配置CubeMX工程USART2. 添加使用者代碼3. 測試代碼4.遇到的問題:

配置DMA:點選Add添加序列槽1接收中斷

STM32CubeMX生成代碼學習筆記(三)序列槽DMA不定長接收+序列槽列印1. 配置CubeMX工程USART2. 添加使用者代碼3. 測試代碼4.遇到的問題:

配置中斷優先級:

在NVIC頁面勾選序列槽1中斷

STM32CubeMX生成代碼學習筆記(三)序列槽DMA不定長接收+序列槽列印1. 配置CubeMX工程USART2. 添加使用者代碼3. 測試代碼4.遇到的問題:

點選系統檢視中的NVIC

STM32CubeMX生成代碼學習筆記(三)序列槽DMA不定長接收+序列槽列印1. 配置CubeMX工程USART2. 添加使用者代碼3. 測試代碼4.遇到的問題:

在NVIC設定區中選中USART1中斷,在紅圈中設定優先級,注意不要與其他外設的優先級産生沖突

STM32CubeMX生成代碼學習筆記(三)序列槽DMA不定長接收+序列槽列印1. 配置CubeMX工程USART2. 添加使用者代碼3. 測試代碼4.遇到的問題:

設定完成後生成代碼,打開工程

2. 添加使用者代碼

在USART.C及USART.h中分别加入要用到的外部變量

USART.c中:

/* USER CODE BEGIN 0 */
volatile uint8_t Usart1_RX_LEN;//序列槽1接收到的資料長度
volatile uint8_t Usart1_RecvEndFlag; //序列槽1接收完成标志位
uint8_t	USART1_Tx_Buffer[USART1_TxBuffer_Size];	//序列槽1資料發送緩存數組
uint8_t USART1_Rx_Buffer[USART1_RxBuffer_Size]; //序列槽1資料接收緩存數組
/* USER CODE END 0 */
           
/* USER CODE BEGIN 1 */
void	USART_Init(void)
{
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//開啟USART1空閑中斷
	HAL_UART_Receive_DMA(&huart1,USART1_Rx_Buffer,USART1_RxBuffer_Size);//USART1使用DMA傳輸
}
void	USART1_Recv(void)//序列槽1接收處理
{
	if(Usart1_RecvEndFlag ==	1)
	{
		printf1("Usart1_RX_LEN=%d\r\n",Usart1_RX_LEN);//列印接收長度
		HAL_UART_Transmit(&huart1,USART1_Rx_Buffer, sizeof(USART1_Rx_Buffer),USART1_TxTimeOut);//接收資料列印出來
		printf1("\r\n");//換行
		
		for(uint8_t i=0;i<sizeof(USART1_Rx_Buffer);i++)
			{
				USART1_Rx_Buffer[i]=0;//清接收緩存
			}
		Usart1_RX_LEN=0;//清除計數
		Usart1_RecvEndFlag=0;//清除接收結束标志位
		HAL_UART_Receive_DMA(&huart1,USART1_Rx_Buffer,USART1_RxBuffer_Size);//重新打開DMA接收
	}
}
/* USER CODE END 1 */
           

USART.h中:

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
           
/* USER CODE BEGIN Private defines */
#define printf1(...) HAL_UART_Transmit(&huart1,(uint8_t *)USART1_Tx_Buffer,sprintf((char*)USART1_Tx_Buffer,__VA_ARGS__),0xffff)//序列槽1列印函數
	
#define	USART1_RxBuffer_Size	255
#define	USART1_TxBuffer_Size	255
#define	USART1_TxTimeOut	200
/* USER CODE END Private defines */
           
/* USER CODE BEGIN Prototypes */
extern	volatile uint8_t Usart1_RX_LEN;//序列槽1接收到的資料長度
extern	volatile uint8_t Usart1_RecvEndFlag; //序列槽1接收完成标志位
extern	uint8_t	USART1_Tx_Buffer[USART1_TxBuffer_Size];	//序列槽1資料發送緩存數組
extern	uint8_t USART1_Rx_Buffer[USART1_RxBuffer_Size]; //序列槽1資料接收緩存數組
void	USART_Init(void);
void	USART1_Recv(void);
/* USER CODE END Prototypes */
           

在stm32f1xx_it.c中插入代碼:

/* USER CODE BEGIN Includes */
#include "usart.h"
/* USER CODE END Includes */
           

USART1_IRQHandler

中加入空閑中斷處理:

/* USER CODE BEGIN USART1_IRQn 0 */
	uint32_t tmp_flag = 0;
	uint32_t temp;
	tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); 
	if((tmp_flag != RESET))
	{ 
			__HAL_UART_CLEAR_IDLEFLAG(&huart1);
			temp = huart1.Instance->SR;  
			temp = huart1.Instance->DR; 
			HAL_UART_DMAStop(&huart1); 
			temp  = hdma_usart1_rx.Instance->CNDTR;
			Usart1_RX_LEN =  USART1_RxBuffer_Size - temp; 
			Usart1_RecvEndFlag= 1;		
	}
  /* USER CODE END USART1_IRQn 0 */
           

在main.c中初始化部分插入開啟USART1空閑中斷和DMA傳輸:

/* USER CODE BEGIN 2 */
	USART_Init();
/* USER CODE END 2 */
           

3. 測試代碼

在主循環中加入:

/* USER CODE END WHILE */
	USART1_Recv();
/* USER CODE BEGIN 3 */
           

測試效果:

STM32CubeMX生成代碼學習筆記(三)序列槽DMA不定長接收+序列槽列印1. 配置CubeMX工程USART2. 添加使用者代碼3. 測試代碼4.遇到的問題:

4.遇到的問題:

一開始調試代碼都寫好了怎麼調試都不通!!!!!!!!

最後發現是口插錯了==

以後貼片器件還是畫在Bottom層吧==

參考文章:

列印函數:https://www.cnblogs.com/hjf-log/p/12522796.html

其他函數:https://blog.csdn.net/qq_33728095/article/details/97778147

繼續閱讀