串口通信USART(标准库)

1、通信的基本概念

(1)串行通讯和并行通讯

按数据传输的方式,通讯可以分为串行通讯和并行通讯。

并行通信:数据各个位同时传输

优点:速度快

缺点:占用引脚资源多,通讯距离较近,抗干扰能力较弱

串行通信:数据按位顺序传输

优点:占用引脚资源少,通讯距离较远,抗干扰能力较强

缺点:速度相对较慢

由于并行传输对于同步要求你较高,且随着通讯速率的提升,信号干扰的问题会显著影响通讯性能。现在随着计数的发展,越来越多的应用场合采用高速率的串行差分传输。

(2)全双工、半双工及单工通讯

依据数据的传输方向,可以将通讯分为全双工、半双工以及单工,主要以信道的方向区分。

全双工:在同一时刻,两个设备之间可以同时收发数据。

半双工:两个设备之间可是收发数据,但是不能再同一时刻进行。

单工:在任何时刻都只能进行一个方向的通讯,即一个固定为发送设备,另一个固定为接受设备。

(3)同步通讯和异步通讯

依据数据的同步方式,分为同步和异步两种,可以根据通信过程中是否使用到时钟信号进行简单的区分。

同步通讯:收发设备双方使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据。通讯中双方通常会统一规定在时钟信号的上升沿或下降沿对数据进行采样。

异步通讯:在通讯中不使用时钟信号进行数据同步,他们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据。某些通讯中还要双方约定数据的传输速率,以便更好的同步。

同步通讯中,数据传输内容绝大部分是有效数据,而异步通讯中会包含帧的各种标识符,所以同步通讯效率更高。

同步通讯双方的时钟误差允许误差较小,而异步通讯双方的时钟允许误差较大。

(4)通讯速率

衡量通讯性能的一个重要的参数就是通讯速率,通常以比特率来表示。

比特率,即每秒钟传输的二进制位数。单位比特每秒(bit/s)。

波特率,表示每秒钟传输了多少个码元。码元是通讯信号调制的概念。

2、串口通讯USART

(1)物理层

  • RS-232标准

串口通讯的物理层有很多标准机变种。RS-232标准主要规定了信号的用途,通讯接口以及信号的电平标准。

  • 电平标准

根据通讯使用的电平标准不同,串口通讯可以分为TTL标准和RS-232标准。

5V TTL:逻辑1:2.4V~5V

逻辑0:0~0.5V

RS-232:逻辑1:-15V~-3V

逻辑0:+3V~+15V

常使用MA3232芯片对TTL及RS-232电平的信号进行互相转换。

  • DB9接口

DB9接口就是常说的串口。

在目前的工业控制中使用的串口一般只使用RXD、TXD以及GND三条信号线,直接传输数据信号。

(2)协议层

串口通讯的协议层中规定了数据包的内容,它由起始位、主体数据、校验位以及停止位组成。

通讯双方的数据包格式要约定一致才能正常收发数据。

  • 波特率

串口异步通讯中由于没有时钟信号,所以两个设备直接需要约定好波特率。常见的波特率为4800/9600/115200等。

  • 通讯的起始和停止信号

数据包的起始信号由一个逻辑0的数据位表示,数据包的停止信号可由0.5/1/1.5/2个逻辑1的数据表示。

  • 有效数据

有效数据的长度常被约定为5/6/7或8位长。

  • 数据校验

有效数据之后,有一个可选的数据校验位。校验方法有奇校验(odd)。偶校验(even)、0校验(space)、1校验(Mark)以及无校验(noparity)。

3、STM32的USART

STM32芯片具有多个USART外设用于串口通信。

USART,即通用同步异步收发器。可以灵活地与外部设备进行全双工数据交换。

有别于USART,STM32还具有UART外设,UART在USART的基础上裁剪了同步通信功能,只有异步通讯。

我们平时用的串口通信基本都是UART。

USART满足外部设备对工业标准NRZ异步穿行数据格式的要求,并且使用了小数波特率发生器,可以提供多种波特率。

USART支持同步单向通信和半双工单线通信,还支持局与互联网LIN,智能卡(SmartCard)协议和IrDA(红外线数据协会)SIR ENDEC规范。

USART支持使用DMA,可实现高速数据通信。

STM32的USART输出的是TTL电平信号,若需要RS-232标准的信号可使用MAX3232芯片进行转换。

(1)功能引脚

TX:发送数据输出引脚

RX:接收数据输入引脚

SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。

nRTS:请求已发送,n表示低电平有效。

nCTS:清除以发送,n表示低电平有效。

SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

(2)数据寄存器

USART_DR数据寄存器,低9位有效,且第9位数据是否有效取决于控制寄存器1USART_CR1的M位设置,当M位为0表示8位数据字长,当M位为1时表示9位数据字长。一般使用8位数据字长。

USART_DR包含了已发送的数据或者接受的数据。USART_DR实际包含有两个寄存器,一个是专门用于发送的可写TDR,一个专门用于接受的可读RDR。

(3)控制器

USART有专门控制发送的发送器、控制接受的接收器,还有唤醒单元,中断控制等。

发送器

USART_CR1寄存器 UE位置1使能USART.

M位置0,8位数据字长,M位置1,9位数据字长。

TE位置1启动数据发送,发送移位寄存器的数据在TX引脚输出,同步模式时SCLK也输出时钟信号。

TCIE位置1,将产生中断。

USART_CR2寄存器 STOP盘[1:0]控制停止位的长短。默认1停止位,2个停止位适用于正常USART模式、单线模式和调制解调器模式。0.5个和1.5个停止位用于智能卡模式。

USART_SR USART状态寄存器。 在USART_DR寄存器写入最后一位数据之后,USART_SR的TC位置1,表示数据传输完成。

几个重要的标志位:

TE 发送使能

TXE 发送寄存器为空,发送单个字节的时候使用

TC 发送完成,发送多个字节数据的时候使用

TXIE 发送完成中断使能

接收器

USART_CR1的RE位置1,使能USART接受。

RX线开始搜索起始位。确定起始位后根据RX线电平状态把数据存放在接受移位寄存器内。

接受完后将接受移位寄存器的数据移到RDR内,并将USART_SR寄存器的RXNE位置1,如果USART_CR2寄存器的RXNEIE置1的话可以产生中断。

(4)小数波特率生成

波特率指数据信号对载波的调制速率。

USART波特率和比特率相等,波特率越大,传输速率越快。

USART的发送器和接收器使用相同的波特率。

波特率 = f_PLCK /(8*(2-OVER8)*USARTDIV)

f_PLCK为USART时钟。OVER8为USART_CR1寄存器的OVER8位对应的值。USARTDIV是一个存放在波特率寄存器(USART_BRR)的一个无符号定点数。

其中DIV_Mantissa[11:0]位定义USARTDIV的整数部分。DIV_Function[3:0]位定义USARTDIV的小数部分,DIV_Function[3]位只有在OVER8位为0时有效,否则必须为零。

例如:STM32F407ZGT6芯片的USART1和USART6使用APB2总线时钟,最高可达84MHz,即f_PLCK = 84MHz.

当使用16倍采样即OVER8 = 0,为得到115200bps波特率,此时:

115200 = 840000000 / 8*2 * USARTDIV.

USARTDIV = 45.57.DIV_Function = 0.57*16 = 9.12取整9,DIV_Function = 0x9,DIV_Mantissa= 45 = 0x2d.

即设置USART_BRR的值为0x2d9.

(5)校验控制/中断控制

USART_CR1的PCE位置1就可以启动奇偶校验控制,奇偶校验有硬件自动完成。当接受数据时如果出现奇偶校验位验证失败,会见USART_SR寄存器的PE位置1,并可以产生奇偶校验中断。

4、USART通信实践

(1)实验设计

实现开发板与电脑通信,在开发板上电时通过USART发送一串字符串给电脑,然后开发板进入中断接受等待状态,如果电脑有发送数据来,开发板产生中断,在中断服务函数中接受数据,并马上返回给电脑。

(2)硬件

CH340G芯片 USB转USART、USB转IrDA红外或者USB转打印机接口。

USART1的TX线连接 PA9/PB6,RX线连接PA10/PB7。这里选择 PA9/PA10.

(3)库函数编程要点

  • 使能RX和TX引脚的GPIO时钟和USART时钟

    • 串口时钟使能 RCC_APBxPeriphClockCmd();

      串口1和串口6是 APB2

      串口2/3/4/5是 APB1

    • GPIO时钟使能 RCC_AHB1PeriphClockCmd();

  • 初始化GPIO,并将GPIO复用到USART上

    • GPIO TX引脚初始为复用推挽输出 RX引脚初始化为浮空输入

    • GPIO_PinAFConfig();

      void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);
    • GPIO_Init();

  • 配置USART参数

    • USART配置通过USART_InitTypeDef结构体实现

      初始化结构体定义在stm32f4xx_usart.h文件中,初始化库函数定义在stm32f4xx_usart.c文件中。

    typedef struct
    {
      uint32_t USART_BaudRate;  /*波特率 一般设置为2400,9600,19200,115200,标准库会自动计算并设置 */
      uint16_t USART_WordLength;/*字长 可选8位或9位,使能了奇偶校验一般设置9位,没有使能奇偶校验一般设置8位*/
      uint16_t USART_StopBits;  /*停止位 可选0.5个,1个,1.5个,2个。一般选择1个停止位*/
      uint16_t USART_Parity;    /*校验位 
                                        USART_Parity_No(无校验)
                                        USART_Parity_Even(偶校验)
                                        USART_Parity_Odd(奇校验)*/
      uint16_t USART_Mode;     /*USART模式 USART_Mode_Rx/USART_Mode_Tx,允许使用逻辑或运算选择两个*/
      uint16_t USART_HardwareFlowControl; /*硬件流控制*/
    } USART_InitTypeDef;
    • USART_Init();

    • USART_Cmd();

  • 配置中断控制寄存器并使能USART接受中断

    • NVIC配置通过NVIC_InitTypeDef结构体实现

      typedef struct
      {
        uint8_t NVIC_IRQChannel;                    
          /*!< 中断源 中断源在IRQn_Type结构体中定义,
              USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                   
              USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                   
              USART3_IRQn                 = 39,     /*!< USART3 global Interrupt
              UART4_IRQn                  = 52,     /*!< UART4 global Interrupt                     
              UART5_IRQn                  = 53,     /*!< UART5 global Interrupt
              USART6_IRQn                 = 71,     /*!< USART6 global interrupt      
          */
      ​
        uint8_t NVIC_IRQChannelPreemptionPriority;  /*!< 抢占优先级*/
      ​
        uint8_t NVIC_IRQChannelSubPriority;         /*!< 次优先级*/
      ​
        FunctionalState NVIC_IRQChannelCmd;         /*!< 中断使能或者失能*/   
      } NVIC_InitTypeDef;
      • NVIC_Init();

      • USART_ITConfig();

        void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);

  • 在USART接受中断服务函数实现数据接受和发送

    • USARTx_IRQHerdler();

      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);
      void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);

  • 同步模式时需要配置SCLK引脚输出脉冲的属性,一般使用USART_ClockInitTypeDef来设置。

    typedef struct
    {
      uint16_t USART_Clock;   /*时钟使能控制 
                                USART_Clock_Disable 禁止时钟输出
                                USART_Clock_Enabkle 开启时钟输出*/
      uint16_t USART_CPOL;    /*时钟极性 可设置空闲时SCLK引脚
                                USART_CPOL_Low 低电平
                                USART_CPOL_Hight 高电平*/
      uint16_t USART_CPHA;    /*时钟相位 设置在时钟的第一个变化沿捕获数据或时钟第二个变化沿捕获数据*/
      uint16_t USART_LastBit; /*最尾位时钟脉冲 选择发送最后一个数据位的时候脉冲是否在SCLK引脚输出
                                USART_LastBit_Disable 不输出脉冲
                                USART_LastBit_Enable 输出脉冲*/
    } USART_ClockInitTypeDef;

(4)代码实例

void USART_Init_xd()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
​
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_Init(USART1,&USART_InitStructure);
    USART_Cmd(USART1,ENABLE);
    
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
    
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
}
​
void usart1_send_data(char ch)
{
    USART_SendData(USART1,ch);
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
}
void usart1_send_str(char *str)
{
    unsigned int k = 0;
    do{
        usart1_send_data(*(str+k));
        k++;
    }while(*(str+k) != '\0');
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET)
    {}
}
void USART1_IRQHandler(void)
{
    uint8_t res;
    if(USART_GetITStatus(USART1,USART_IT_RXNE))
    {
        res = USART_ReceiveData(USART1);
        USART_SendData(USART1,res);
    }
}
int main(void)
{
    char *str = "hello USART1!";
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    USART_Init_xd();
    while(1)
    {
        usart1_send_str(str);
        Delay();
    }
}

(5)注意事项

1、注意GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF),函数中的第二个参数类型是

uint16_t GPIO_PinSource,用于指定复用功能的引脚,具体值是GPIO_PinSourcex(x = 0-15)。区别于GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)等函数中的参数 uint16_t GPIO_Pin。

2、设置 的串口波特率与 实际接受需要的波特率不一致的问题。

现象:设置串口波特率为115200,但是在实际串口接收是会出现乱码,但是把接收时的串口波特率设置为38400时可以正常接收。

故障原因:由于在系统文件stm32f4xx.h中定义的HSE的频率与实际板载的晶振频率不一致导致。

/**
 * @brief In the following line adjust the value of External High Speed oscillator (HSE)
   used in your application 
   
   Tip: To avoid modifying this file each time you need to use different HSE, you
        can define the HSE value in your toolchain compiler preprocessor.
  */           
#if defined(STM32F40_41xxx) || defined(STM32F427_437xx)  || defined(STM32F429_439xx) || defined(STM32F401xx) || \
    defined(STM32F410xx) || defined(STM32F411xE) || defined(STM32F469_479xx)
 #if !defined  (HSE_VALUE) 
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
 #endif /* HSE_VALUE */

在上面的代码中可以看出,系统文件默认的HSE频率是25MHz,但是实际板载的晶振频率是8MHz。

解决方案:将上面代码中的 #define HSE_VALUE ((uint32_t)25000000) 改为 #define HSE_VALUE ((uint32_t)8000000)

5、标准库中的函数简介

//同步通信时钟设置
typedef struct
{
​
  uint16_t USART_Clock;   /*!< 描述同步通信USART时钟是启用还是禁用*/
                          //USART_Clock_DIsable
                          //USART_Clock_Enable
​
  uint16_t USART_CPOL;    /*!< 配置串口空闲位高电平、低电平.(极性) */
                          //USART_CPOL_LOW
                          //USART_CPOL_Hight
​
  uint16_t USART_CPHA;    /*!< 配置选择边沿。(相位)*/
                          //USART_CPHA_1Edge
                          //USART_CPHA_2Edge
​
  uint16_t USART_LastBit; /*!< 最后一个时钟(配置使能还是关闭) */
                          //USART_LastBit_Disable 
                          //USART_LastBit_Enable 
} USART_ClockInitTypeDef;
/*  Function used to set the USART configuration to the default reset state ***/ 
/*用于将串口初始化为默认的初始状态*/
//关闭串口的RCC时钟
void USART_DeInit(USART_TypeDef* USARTx);
​
/* Initialization and Configuration functions *********************************/
/*初始化和配置功能*********************************/
/*以USART_InitStruct结构体中的参数初始化USARTx外设*/
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
/*用默认值初始化USART_Struct结构体*/
//波特率9600 数据位8位 停止位1位 无校验位 发送/接受模式  无流控 
void USART_StructInit(USART_InitTypeDef* USART_InitStruct);
/*以USART_ClockInitStruct结构体中的参数初始化USART外设同步通信时钟*/
void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct);
/*用默认值初始化USART_ClockInitStruct结构体*/
void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct);
/*启用或禁用USART外设*/
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
/*设置系统时钟预分频器*/
//该功能用于IrDA模式和智能卡模式
void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler);
/*启用或禁用USART的8倍过采样模式*/
//在调用USART_Init()函数之前必须调用此函数,以便具有正确的波特率除法器值
void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
/*启用或禁用USART的一位采样方法。*/
//0 三个采样位方法  1 一个采样位方法
void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState);
​
/* Data transfers functions ***************************************************/
/* 数据传输功能 ***************************************************/ 
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
​
/* Multi-Processor Communication functions ************************************/
/* 多处理器通信功能 ************************************/
/*设置USART节点的地址*/
void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address);
/*选择USART唤醒方法*/
/*USART_WakeUp: 指定USART唤醒方法.
                USART_WakeUp_IdleLine: 空闲线路检测唤醒
                USART_WakeUp_AddressMark:通过地址标记唤醒*/
void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp);
/*确定USART是否处于静默模式*/
/*NewState: USART静音模式的新状态.
            ENABLE or DISABLE.*/
void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState);
​
/* LIN mode functions *********************************************************/
/* LIN模式功能 *********************************************************/
//LIN总线是一种一主多从的单总线协议
/*设置USART LIN断路检测长度*/
/*USART_LINBreakDetectLength: 指定LIN中断检测长度.
                              USART_LINBreakDetectLength_10b:10位中断检测
                              USART_LINBreakDetectLength_11b: 11位中断检测*/
void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength);
/*启用或禁用USART的LIN模式*/
void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState);
/*传输中断字符*/
void USART_SendBreak(USART_TypeDef* USARTx);
​
/* Half-duplex mode function **************************************************/
/* 半双工模式 **************************************************/
/*启用或禁用USART的半双工通信*/
void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState);
​
/* Smartcard mode functions ***************************************************/
/* 智能卡模式 **************************************************/
/*启用或禁用USART的智能卡模式*/
void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState);
/*启用或禁用NACK传输*/
void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState);
/*设置指定的USART防护时间 (以波特时钟数为单位)*/
void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime);
​
/* IrDA mode functions ********************************************************/
/* IrDA模式 ********************************************************/
/*配置USART的IrDA接口*/
/*USART_IrDAMode: 指定IrDA模式.
                  USART_IrDAMode_LowPower 低功耗模式
                  USART_IrDAMode_Normal 正常模式*/
void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode);
/*启用或禁用USART的IrDA接口*/
void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState);
​
/* DMA transfers management functions *****************************************/
/* DMA 传输管理功能 *****************************************/
/*启用或禁用USART的DMA接口*/
/*USART_DMAReq: 指定DMA请求.
                USART_DMAReq_Tx: USART DMA传输请求
                USART_DMAReq_Rx: USART DMA接受请求*/
void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState);
​
/* Interrupts and flags management functions **********************************/
/* 中断和标志管理功能 **********************************/
/*启用或禁用指定的USART中断*/
/*USART_IT: 指定要启用或禁用的USART中断源.
            USART_IT_CTS:  CTS变更中断
            USART_IT_LBD:  LIN中断检测中断
            USART_IT_TXE:  传输数据寄存器空中断
            USART_IT_TC:   传输完全中断
            USART_IT_RXNE: 接收数据寄存器非空中断
            USART_IT_IDLE: 空闲线路检测中断
            USART_IT_PE:   奇偶校验错误中断
            USART_IT_ERR:  错误中断(帧错误、噪声错误、超限错误)*/
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
/*检查是否设置了指定的USART标志*/
/*USART_FLAG: 指定要检查的标志.
                USART_FLAG_CTS:  CTS更改标志(不适用于UART4和UART5)
                USART_FLAG_LBD:  LIN中断检测标志
                USART_FLAG_TXE:  传输数据寄存器空标志
                USART_FLAG_TC:   传输完成标志
                USART_FLAG_RXNE: 接收数据寄存器非空标志
                USART_FLAG_IDLE: 空闲线路检测标志
                USART_FLAG_ORE:  过度运行错误标志
                USART_FLAG_NE:   噪声错误标志
                USART_FLAG_FE:   帧错误标志
                USART_FLAG_PE:   奇偶错误标志*/
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
/*清除USARTx的挂起标志*/
/*USART_FLAG:指定要清除的标志。
                USART_FLAG_CTS:CTS更改标志(不适用于UART4和UART5)。
                USART_FLAG_LBD:LIN断线检测标志。
                USART_FLAG_TC:传输完成标志。
                USART_FLAG_RXNE:接收数据寄存器非空标志。*/
/*PE(奇偶校验错误)、FE(成帧错误)、NE(噪声错误)、ORE(过载错误)和IDLE(检测到空闲线路)标志被软件清除
   顺序:对USART_SR寄存器的读取操作(USART_GetFlagStatus())
        然后对USART_DR寄存器进行读取操作(USART_ReceiveData())。*/
/*RXNE标志也可以通过读取USART_DR寄存器来清除(USART_ReceiveData())*/
/*TC标志也可以通过软件序列清除:读取操作USART_SR寄存器(USART_GetFlagStatus())
                            后接写操作到USART_DR寄存器(USART_SendData())。*/
/*TXE标志仅通过写入USART_DR寄存器来清除(USART_SendData())。*/
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);
/*检查指定的USART中断是否已发生。*/
/*USART_IT:指定要检查的USART中断源。
            USART_IT_CTS:CTS更改中断(不适用于UART4和UART5)
            USART_IT_LBD:LIN中断检测中断
            USART_IT_TXE:传输数据寄存器空中断
            USART_IT_TC:传输完全中断
            USART_IT_RXNE:接收数据寄存器非空中断
            USART_IT_IDLE:空闲线路检测中断
            USART_IT_ORE_RX:如果设置了RXNEIE位,则OverRun Error中断
            USART_IT_ORE_ER:如果设置了EIE位,则OverRun Error中断
            USART_IT_NE:噪声错误中断
            USART_IT_FE:帧错误中断
            USART_IT_PE:奇偶校验错误中断
返回值:USART_IT的新状态(SET或RESET)。*/
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
/*清除USARTx的中断挂起位。*/
/*USART_IT:指定要清除的中断挂起位。
            USART_IT_CTS:CTS更改中断(不适用于UART4和UART5)
            USART_IT_LBD:LIN中断检测中断
            USART_IT_TC:传输完成中断。
            USART_IT_RXNE:接收数据寄存器非空中断。*/
/*PE(奇偶校验错误)、FE(成帧错误)、NE(噪声错误)、ORE(过度运行错误)和IDLE(检测到空闲线路)位被软件清除。
清除的序列:对USART_SR寄存器的读取操作(USART_GetITStatus()),
           然后对USART_DR寄存器执行读取操作(USART_ReceiveData())。*/
/*RXNE挂起位也可以通过读取USART_DR寄存器来清除(USART_ReceiveData())。*/
/*TC挂起位也可以通过软件序列清除:读取USART_SR寄存器(USART_GetITStatus()),
                                然后写入USART_DR寄存器的操作(USART_SendData())。*/
/*TXE挂起位仅通过写入USART_DR寄存器来清除(USART_SendData())。*/
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

  • 0
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星顶照

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值