STM32+UART串口+DMA收发

目录

1、cubemax端配置

1.1 初始化配置

1.2 GPIO配置

 1.3 UART配置

1.3.1 串口基础配置

1.3.2 DMA配置

2、keil端代码设计

2.1 初始化配置

2.2 DMA接收初始化配置

2.3 DMA发送配置

 2.4 接收回调函数设置

2.5 回调函数内容代码编写

2.5.1 接收回调函数

2.5.2 发送回调函数

2.6 回调函数内容代码优化


1、cubemax端配置

1.1 初始化配置

首先通过STM32cubemax进行基础配置:

 cubemax基础配置

1.2 GPIO配置

通过一个LED小灯(高电平有效)来观察效果,对PB0引脚进行GPIO配置,如下图所示:

 1.3 UART配置

1.3.1 串口基础配置

1.3.2 DMA配置

首先对RX进行配置,如下图所示:

 

接着对TX进行配置(默认就行),如下图所示:

2、keil端代码设计

2.1 初始化配置

首先在主函数上方进行发送、接收数组设置,如下图所示:

uint8_t tx[] = "TX ok";
uint8_t Rx[2]; 

2.2 DMA接收初始化配置

 HAL_UART_Receive_DMA(&huart1,Rx,sizeof(Rx));

2.3 DMA发送配置

HAL_UART_Transmit_DMA(&huart1,tx,sizeof(tx));
HAL_Delay(1000);

 2.4 接收回调函数设置

首先找到HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)函数,如下图所示:

接着将函数按下图所示复制到主函数上方:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function should not be modified, when the callback is needed,
           the HAL_UART_RxCpltCallback could be implemented in the user file
   */
}

2.5 回调函数内容代码编写

2.5.1 接收回调函数

//接收到数据 LED小灯电平翻转

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart1.Instance == USART1)
	{
		HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
	}
}

2.5.2 发送回调函数

将接收回调函数中R改成T即可实现发送回调函数功能。如下图所示:

 当有数据发送,回调函数进行工作,如下图所示:


uint8_t tx2[] = "TX_IT ok";

//发送回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart1.Instance == USART1)
	{
		HAL_UART_Transmit_DMA(&huart1,tx,sizeof(tx2));
	}
}

2.6 回调函数内容代码优化

当在回调函数中添加延时后,会发现程序卡死,因此需要对NVIC进行配置,如下图所示:

猜你喜欢

转载自blog.csdn.net/weixin_44597885/article/details/130897647