串口基本配置的寄存器,配置过程总结为:
1、串口时钟使能。这里的串口1设置是APB2ENR寄存器的第4位。
2、串口波特率设置。每个串口都有一个自己独立的波特 率寄存器 USART_BRR,通过设置该寄存器就可以达到配置不同波特率的目的。
3、串口控制。STM32F429 的每个串口都有 3 个控制寄存器 USART_CR1~3,串口的很多 配置都是通过这 3 个寄存器来设置的。这里我们只要用到 USART_CR1 就可以实现我们的功能。
4、数据发送与接收。STM32F429 的发送与接收是通过数据寄存器 USART_DR 来实现的, 这是一个双寄存器,包含了 TDR 和 RDR。
5、串口状态。串口的状态可以通过状态寄存器 USART_SR 读取。
思考:假如用HAL库进行配置的话,实现过程是什么?
第一:初始化函数 HAL_UART_Init 相关函数:
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);
解释:函数只有一个入口参数 huart,为 UART_HandleTypeDef 结构体指针类型,称为:句柄。
第二:使能串口和 GPIO 口时钟
使用串口,我们必须使能串口时钟和使用到的 GPIO 口时钟。
__HAL_RCC_USART1_CLK_ENABLE(); //使能 USART1 时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); //使能 GPIOA 时钟
第三:GPIO 口初始化设置(速度,上下拉等)以及复用映射配置
GPIO_InitTypeDef GPIO_Initure;
GPIO_Initure.Pin=GPIO_PIN_9|GPIO_PIN_10; //PA9/PA10 GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速
GPIO_Initure.Alternate=GPIO_AF7_USART1; //复用为 USART1 HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化 PA9/PA10
第四:开启串口相关中断,配置串口中断优先级
__HAL_UART_ENABLE_IT(huart,UART_IT_RXNE); //开启接收完成中断
第一个参数:huart为串口句柄 第二个参数:要开启的中断类型。
__HAL_UART_DISABLE_IT(huart,UART_IT_RXNE); //关闭接收完成中断
HAL_NVIC_EnableIRQ(USART1_IRQn); //使能 USART1 中断通道 HAL_NVIC_SetPriority(USART1_IRQn,3,3); //抢占优先级 3,子优先级3
第五:编写中断服务函数
void USART1_IRQHandler(void);
第六:串口数据接收和发送
发送与接收是通过数据寄存器 USART_DR 来实现。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也 是存在该寄存器内。
HAL 库操作 USART_DR 寄存器发送数据的函数是:
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
通过该函数向串口寄存器 USART_DR 写入一个数据:
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);