硬件资源
串口1 (PA9/PA10连接在板载USB转串口芯片CH340C上面)
原理图
USB转串口硬件部分的原理图
程序设计
USART/UART异步通信配置步骤
1、配置串口工作参数 HAL_UART_Init()
2,串口底层初始化 HAL_UART_MspInit() 配置GPIO、NVIC、CLOCK等
3,开启串口异步接收中断 HAL_UART_Receive_IT()
4,设置优先级,使能中断 HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
5,编写中断服务函数 USARTx_IRQHandler()、 UARTx_IRQHandler()
6,串口数据发送 USART_DR, HAL_UART_Transmit()
详细配置步骤
1) 串口参数初始化(波特率、字长、奇偶校验等)
HAL库通过调用串口初始化函数 HAL_UART_Init 完成对串口参数初始化,详见例程源码 注意:该函数会调用:HAL_UART_MspInit 函数来完成对串口底层的初始化,包括:串口 及GPIO时钟使能、GPIO模式设置、中断设置等。
2)使能串口和GPIO口时钟
本实验用到USART1串口,使用PA9和PA10作为串口的TX和RX脚,因此需要先使能 USART1 和GPIOA时钟。参考代码如下:
__HAL_RCC_USART1_CLK_ENABLE();
/* 使能USART1时钟 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/* 使能GPIOA时钟 */
3)GPIO模式设置(速度、上下拉、复用功能等)
GPIO 模式设置通过调用HAL_GPIO_Init函数实现。
4)开启串口相关中断,配置串口中断优先级
本实验我们使用串口中断来接收数据。我们使用 HAL_UART_Receive_IT 函数开启串口中 断接收,并设置接收 buffer 及其长度。通过 HAL_NVIC_EnableIRQ 函数使能串口中断,通过 HAL_NVIC_SetPriority 函数设置中断优先级。
5)编写中断服务函数
串口1中断服务函数为:USART1_IRQHandler,当发生中断的时候,程序就会执行中断服 务函数。HAL 库为了使用方便,提供了一个串口中断通用处理函数 HAL_UART_IRQHandler , 该函数在串口接收完数据后,又会调用回调函数 HAL_UART_RxCpltCallback ,用于给用户处 理串口接收到的数据。 因此我们需要在 HAL_UART_RxCpltCallback 函数实现数据接收处理。
6)串口数据接收和发送
最后我们可以通过读写USART_DR寄存器,完成串口数据的接收和发送,HAL库也给我 们提供了:HAL_UART_Receive 和 HAL_UART_Transmit 两个函数用于串口数据的接收和发送。
大家可以根据实际情况选择使用以上介绍的方式来收发串口数据。
(这些步骤摘抄于STM32F103战舰开发板)
源码
usart.c
uint8_t g_rx_buffer[1]; //串口接受数据的数据缓冲区
uint8_t g_uart1_rx_flag = 0; //串口接收到数据标志
UART_HandleTypeDef g_uart1_handle;
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(&g_uart1_handle);
HAL_UART_Receive_IT(&g_uart1_handle,(uint8_t *)g_rx_buffer , 1);
}
void HAL_UART_MspInit(UART_HandleTypeDef *huart) //串口MSP回调函数
{
if(huart->Instance == USART1) //如果是串口1,进行串口1 MSP初始化
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_USART1_CLK_ENABLE(); /* 使能USART1时钟 */
__HAL_RCC_GPIOA_CLK_ENABLE(); /* 使能GPIOA时钟 */
gpio_init_struct.Pin = GPIO_PIN_9;
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 推挽式输出 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(GPIOA, &gpio_init_struct); /* 初始化串口1的TX引脚 */
gpio_init_struct.Pin = GPIO_PIN_10;
gpio_init_struct.Mode = GPIO_MODE_INPUT; /* 输入 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
HAL_GPIO_Init(GPIOA, &gpio_init_struct); /* 初始化串口1的RX引脚 */
HAL_NVIC_SetPriority(USART1_IRQn, 3,0); //设置中断优先级
HAL_NVIC_EnableIRQ(USART1_IRQn); //使能中断
}
}
void USART1_IRQHandler(void) //串口1中断服务函数,在.s里面找
{
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)
{
g_uart1_rx_flag = 1;
}
}
这里的 g_uart1_rx_flag = 1为啥等于1是应为TX线带启动位之前是高电平
uint8_t g_uart1_rx_flag = 0; //串口接收到数据标志
usart.h
#ifndef __USART_H
#define __USART_H
#include "stdio.h"
#include "./SYSTEM/sys/sys.h"
extern UART_HandleTypeDef g_uart1_handle; //HAL UART句柄
extern uint8_t g_rx_buffer[1]; //串口接受数据的数据缓冲区
extern uint8_t g_uart1_rx_flag; //串口接收到数据标志
void usart_init(uint32_t bound); /* 串口初始化函数 */
#endif
main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include <stdio.h>
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟,72M */
delay_init(72); /* 初始化延时函数 */
led_init(); /* 初始化LED */
usart_init(115200); //波特率设为115200
printf("请输入一个英文字符:\r\n\r\n");
while(1)
{
if(g_uart1_rx_flag == 1)
{
printf("你输入的字符为:\r\n");
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_uart1_rx_flag = 0;
}
else
{
delay_ms(10);
}
}
}
标签:handle,uart1,HAL,UART,STM32,串口,GPIO,F103
From: https://blog.csdn.net/2302_79878697/article/details/136887667