目录
实验:使用串口一接收\发送一个字符
1.在uart1.c中进行串口初始化
UART_HandleTypeDef结构体中有这些参数:
uint32_t BaudRate; //波特率
uint32_t WordLength; //字长
uint32_t StopBits; //停止位
uint32_t Parity; //校验位
uint32_t Mode; //模式
uint32_t HwFlowCtl; //流控
uint32_t OverSampling; //采样次数
UART_HandleTypeDef uart1_handle = {0};
void uart1_init(uint32_t baudrate)
{
uart1_handle.Instance = USART1;
uart1_handle.Init.BaudRate = baudrate;
uart1_handle.Init.WordLength = UART_WORDLENGTH_8B;
uart1_handle.Init.StopBits = UART_STOPBITS_1;
uart1_handle.Init.Parity = UART_PARITY_NONE;
uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
uart1_handle.Init.Mode = UART_MODE_TX_RX;
HAL_UART_Init(&uart1_handle);
}
波特率我们通过参数的形式进行传参,字长为8字节,带有停止位,没有校验位,没有流控,模式为可接可发
2.在msp函数中对外设gpio口,nvic等进行配置
1.打开USART1和GPIOA的时钟
2.对GPIO口进行初始化,PA9为Tx1,PA10为Rx1,根据手册里面的gpio复用表,将PA9配置为推完复用输出,将PA10配置为浮空输入或上拉输入,代码中是复用输入一样的。
3.打开USART1的使能中断,通过调用HAL_NVIC_EnableIRQ()
函数,允许CPU响应USART1的中断请求。设置USART1中断的优先级。
4.__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE)
用于使能UART接收中断。当UART接收到数据并且接收缓冲区非空时,会触发中断。
最后三行代码可以概括为 配置中断系统,使能USART1的中断,并设置中断优先级,最后使能UART接收中断,以便在接收到数据时能够及时响应。
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef gpio_initstruct;
//调用GPIO初始化函数
gpio_initstruct.Pin = GPIO_PIN_9;
gpio_initstruct.Mode = GPIO_MODE_AF_PP;
gpio_initstruct.Pull = GPIO_PULLUP;
gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &gpio_initstruct);
gpio_initstruct.Pin = GPIO_PIN_10;
gpio_initstruct.Mode = GPIO_MODE_AF_INPUT;
HAL_GPIO_Init(GPIOA, &gpio_initstruct);
HAL_NVIC_EnableIRQ(USART1_IRQn);
HAL_NVIC_SetPriority(USART1_IRQn, 2, 2);
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
}
}
3.在中断服务函数中进行数据的收发
通过__HAL_UART_GET_FLAG(&uart1_handle, UART_FLAG_RXNE) 函数可以判断RXNE是否为空,如果不为空则会产生一个中断,就可以进行一个操作
void USART1_IRQHandler(void)
{
uint8_t receive_data = 0;
if(__HAL_UART_GET_FLAG(&uart1_handle, UART_FLAG_RXNE) != RESET)
{
HAL_UART_Receive(&uart1_handle, &receive_data, 1, 1000);
HAL_UART_Transmit(&uart1_handle, &receive_data, 1, 1000);
}
}
4.在main函数中进行实现
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
led_init(); /* 初始化LED灯 */
uart1_init(115200);
while(1)
{
led1_on();
led2_off();
delay_ms(500);
led1_off();
led2_on();
delay_ms(500);
}
}
led是以前的东西,没有影响就没删掉,在main函数中进行调用uart1_init()函数,并传入一个参数设置波特率。