1.USART/UART异步通信配置步骤
1,配置串口工作参数 HAL_UART_Init()
2,串口底层初始化 HAL_UART_MspInit() 使能USART和对应的IO时钟,初始化IO,使能USART中断,设置优先级
3,开启串口异步接收中断 HAL_UART_Receive_IT()
4,设置优先级,使能中断 HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
5,编写中断服务函数 USARTx_IRQHandler()、 UARTx_IRQHandler()
6,串口数据发送 USART_DR, HAL_UART_Transmit()
2.代码展示
2.1 usart.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
uint8_t g_usart1_rx_flag = 0; //串口接收到数据标志
uint8_t g_rx_buffer[1]; //HAL串口接收到数据缓冲区
//1.串口初始化,配置串口工作参数
UART_HandleTypeDef g_uart1_handle; //UART句柄
void usart_init(uint32_t baudrate)
{
g_uart1_handle.Instance = USART1; /* USART1 */
g_uart1_handle.Init.BaudRate = baudrate; /* 波特率 */
g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* 字长为8位数据格式 */
g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* 一个停止位 */
g_uart1_handle.Init.Parity = UART_PARITY_NONE ; /* 无奇偶校验位 */
g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* 无硬件流控 */
g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* 收发模式 */
HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()会使能UART1 */
//3,开启串口异步接收中断,以中断方式接收指定字节数据
HAL_UART_Receive_IT(&g_uart1_handle,(uint8_t*)g_rx_buffer,1);
}
//2,串口MSP回调函数 底层初始化配置GPIO、NVIC、CLOCK等
void HAL_USART_MspDeInit(USART_HandleTypeDef *husart)
{
GPIO_InitTypeDef gpio_init_struct;
if(husart->Instance == USART1)
{
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
gpio_init_struct.Pin = GPIO_PIN_9; //PA9引脚,TX引脚
gpio_init_struct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; //高速
gpio_init_struct.Alternate = GPIO_AF7_USART1; //复用为USART1
HAL_GPIO_Init(GPIOA, &gpio_init_struct); //初始化发送引脚
gpio_init_struct.Pin = GPIO_PIN_10; //PA10,RX引脚
gpio_init_struct.Pull = GPIO_PULLUP; //上拉
gpio_init_struct.Alternate = GPIO_AF7_USART1; //复用为USART1
HAL_GPIO_Init(GPIOA, &gpio_init_struct); //初始化发送引脚
//4,设置优先级,使能中断
HAL_NVIC_SetPriority(USART1_IRQn,3,3);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}
}
//5.中断服务处理函数
void USART1_IRQHandler()
{
//调用中断公共处理函数
HAL_UART_IRQHandler(&g_uart1_handle);
//接收失能中断
HAL_UART_Receive_IT(&g_uart1_handle,(uint8_t*)g_rx_buffer,1);
}
//串口数据接收完成回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
//串口数据接收接受完成,标志位为1
g_usart1_rx_flag = 1;
}
}
2.2 usart.h
#ifndef _USART_H
#define _USART_H
#include "stdio.h"
#include "./SYSTEM/sys/sys.h"
extern UART_HandleTypeDef g_uart1_handle; //UART句柄
extern uint8_t g_usart1_rx_flag; //串口接收到数据
extern uint8_t g_rx_buffer[1]; //HAL串口接收到数据缓冲区
void usart_init(uint32_t baudrate); //串口初始化函数
#endif
2.3 main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
led_init(); /* 初始化LED */
usart_init(115200); /* 初始化usart */
while(1)
{
//如果收到数据
if(g_usart1_rx_flag == 1)
{
//6.串口数据发送
HAL_UART_Transmit(&g_uart1_handle,(uint8_t*)g_rx_buffer,1,1000); //发送字符
while(__HAL_UART_GET_FLAG(&g_uart1_handle,UART_FLAG_TC) !=1); //接收是否完成
printf("\r\n");
g_usart1_rx_flag=0;
}
//如果没收到数据
else
{
delay_ms(10);
}
}
}