STM32---03---USART(串口通信)

    科技2026-01-30  7

    STM32—03—USART(串口通信)

    3.编程要点解析:以USART1为例

    3.1 结构体详解 USART结构体有两个,分别如下: /*USART初始化结构体:该结构体必须配置*/ 1 typedef struct { 2 uint32_t USART_BaudRate; // 波特率 3 uint16_t USART_WordLength; // 字长 4 uint16_t USART_StopBits; // 停止位 5 uint16_t USART_Parity; // 校验位 6 uint16_t USART_Mode; // USART模式:可以配置成收发一体 7 uint16_t USART_HardwareFlowControl; // 硬件流控制 8 } USART_InitTypeDef;

    以及

    /*USART时钟初始化结构体,一般USART用作异步通信,不需要配置*/ 1 typedef struct { 2 uint16_t USART_Clock; // 时钟使能控制 3 uint16_t USART_CPOL; // 时钟极性 4 uint16_t USART_CPHA; // 时钟相位 5 uint16_t USART_LastBit; // 最尾位时钟脉冲 6 } USART_ClockInitTypeDef;

    配置USART相关寄存器的过程:先初始化结构体,然后调用函数:void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

    3.2 编程要点

    ① 开时钟(GPIO、USART的时钟): 除了打开USART1时钟之外,也要打开对于的GPIO时钟,USART1的TX对应的引脚PA9的时钟,调用函数:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); USART1挂载在APB2高速时钟线上,调用函数:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    值得注意的是此时不需要打开AFIO的时钟,至于AFIO时钟什么时候打开,可以看这个人,讲的很好

    ②配置模式(复用推挽输出,浮空输入): USART1的TX对应引脚PA9的输出模式为:推挽复用模式,因为USART功能均为引脚的复用功能,输入模式为浮空输入。

    ③配置串口的工作参数,使用上述3.1中的函数配置即可。

    ④如果需要使用USART中断,则需要配置写配置NVIC的函数。

    ⑤调用函数:void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);来启用或禁用指定的USART中断,可以启用下列中断。 具体中断事件如下: 发送期间:发送完成、清除发送、发送数据寄存器空 接收期间:空闲总线检测、溢出错误、接收数据寄存器非空、校验错误、LIN断开符号检测

    ⑥使能串口(使CR1寄存器的UE位置1),调用函数:void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);

    3.3 编程过程中疏忽的点

    ①判断数据已经发送完成的标志有两个:TXE和TC位,TXE位用于检测发送数据寄存器空,而TC位检测数据是否发送完成,因为USART_CR寄存器只有DR[8:0]9位有效,因此在发送一个字节的数据时,可以判断TXE或者TC标志位,但是对于大数据传输时,使用TC位判断更加准确。 ②判断数据已被接收,可以读取时,仅根据RXNE位判断即可

    3.4 USART编程常用函数讲解 void USART_DeInit(USART_TypeDef* USARTx);/*串口初始化重置*/ void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);/*串口初始化*/ void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);/*串口使能,配置USART-CR1的UE位置1*/ void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);/*串口中断配置*/ void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);/*串口发生数据函数*/ uint16_t USART_ReceiveData(USART_TypeDef* USARTx);/*串口接收数据函数*/ FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);/*检查USART-SR寄存器的状态标志位是否设置*/ void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);/*清除USART的标志位*/ ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);/*中断状态位获取函数*/ void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);/*中断状态位清除函数*/

    其中FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);和ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);函数检查的标志位是一样的,只是用途不一样,前者用于检测数据是否发送、接收等等,而后者的函数主要用于中断。

    Processed: 0.022, SQL: 9