天天看点

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

继续阅读