/*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);
① 开时钟(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);
①判断数据已经发送完成的标志有两个:TXE和TC位,TXE位用于检测发送数据寄存器空,而TC位检测数据是否发送完成,因为USART_CR寄存器只有DR[8:0]9位有效,因此在发送一个字节的数据时,可以判断TXE或者TC标志位,但是对于大数据传输时,使用TC位判断更加准确。
②判断数据已被接收,可以读取时,仅根据RXNE位判断即可
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);函数检查的标志位是一样的,只是用途不一样,前者用于检测数据是否发送、接收等等,而后者的函数主要用于中断。