小实验1:通过串口发送/接收一个字符
实验目的
使用串口1发送/接收一个字符。
1、串口初始化
#include "uart.h"
UART_HandleTypeDef uart_handle = {0};
void uart1_init(uint32_t baudrate)//baudrate是波特率
{
uart1_handle.Instance = USART1; //选择通用异步收发器
uart1_handle.Init.BaudRate = baudrate; //baudrate 是波特率
uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; //字长参数列表用用的8位
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(&uart_handle);
}
2、Msp
msp公用的一个函数这里有三个串口,都会调用msp先进行一个判断
参考8.1.11 外设的GPIO配置
RXNE
void HAL_UART_MspInit(UART_HandleType *huart)
{
if(huart->Instance == USART1)//先进行一个判断
{
//GPIO配置
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef gpio_initstruct;
//配置TX
gpio_initstruct.Pin = GPIO_PIN_9; //PA9是TX 写
gpio_initstruct.Mode = GPIO_MODE_AF_PP;
//由参考手册GPIO口,外设GPIO口配置要求 stm
//32中文参考手册V10
//每个GPIO口在其他用用场景下应该把它配制成怎样的模式串口模式一般是复用
gpio_initstruct.Pull = GPIO_PULLUP;
gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA,&gpio_initstruct);
//配置RX
gpio_initstruct.Pin = GPIO_PIN_10; //PA10是RX 写
gpio_initstruct.Mode = GPIO_MODE_AF_INPUT;//复用输入模式和输入模式是一样的
HAL_GPIO_Init(GPIOA,&gpio_initstruct);
//NVIC
HAL_NVIC_EnableIRQ(USART1_IRQn);//使能中断
HAL_NVIC_SetPriority(USART1_IRQn,2,2);//设置中断优先级,随便设置
//如何确定RXNE被置为1 __HAL_UART_ENABLE_IT(*,RXNE) 非空中断使能
__HAL_UART_ENABLE_IT(&UASRT1_IRQn,RXNE);
}
}
3、中断服务函数
void USART1_IRQHandler(void)
{
//判断什么时候数据的收发 如何判断是否收到数据
//看RXNE RDR接收数据寄存器内不为空 就会触发一个中断就可以进行一个操作
//被置1不为RESET
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 "uart1.h"
void mian(void)
{
HAL_Init(); /* 初始化HAL库 */
stm32_clock_init(RCC_PLL_MUL9);/* 设置时钟, 72Mhz */
uart1_init(115200);/* LED初始化 */
}
uart1_init(115200);