stm32f10x_usart

STM32F10x USART 外设标准库函数参考文档

数据类型定义

USART_InitTypeDef - USART初始化结构体

typedef struct
{
  uint32_t USART_BaudRate;            /* 配置USART通信波特率 */
  uint16_t USART_WordLength;          /* 指定传输或接收的数据位数 */
  uint16_t USART_StopBits;            /* 指定传输的停止位数 */
  uint16_t USART_Parity;              /* 指定奇偶校验模式 */
  uint16_t USART_Mode;                /* 指定接收或发送模式是否使能 */
  uint16_t USART_HardwareFlowControl; /* 指定硬件流控制模式是否使能 */
} USART_InitTypeDef;

成员说明:

  • USART_BaudRate:配置USART通信波特率,范围:0 < 波特率 < 0x0044AA21
  • USART_WordLength:指定数据帧中传输或接收的数据位数,可选值见@ref USART_Word_Length
  • USART_StopBits:指定传输的停止位数,可选值见@ref USART_Stop_Bits
  • USART_Parity:指定奇偶校验模式,可选值见@ref USART_Parity
  • USART_Mode:指定接收或发送模式,可选值见@ref USART_Mode
  • USART_HardwareFlowControl:指定硬件流控制模式,可选值见@ref USART_Hardware_Flow_Control

USART_ClockInitTypeDef - USART时钟初始化结构体

typedef struct
{
  uint16_t USART_Clock;   /* 指定USART时钟是否使能 */
  uint16_t USART_CPOL;    /* 指定串行时钟的稳态值 */
  uint16_t USART_CPHA;    /* 指定位捕获的时钟转换 */
  uint16_t USART_LastBit; /* 指定最后传输数据位对应的时钟脉冲 */
} USART_ClockInitTypeDef;

成员说明:

  • USART_Clock:指定USART时钟是否使能,可选值见@ref USART_Clock
  • USART_CPOL:指定串行时钟的稳态值,可选值见@ref USART_Clock_Polarity
  • USART_CPHA:指定位捕获的时钟转换,可选值见@ref USART_Clock_Phase
  • USART_LastBit:指定最后数据位对应的时钟脉冲,可选值见@ref USART_Last_Bit

USART参数定义

数据位长度定义

#define USART_WordLength_8b  ((uint16_t)0x0000)  /* 8位数据位 */
#define USART_WordLength_9b  ((uint16_t)0x1000)  /* 9位数据位 */

停止位定义

#define USART_StopBits_1     ((uint16_t)0x0000)  /* 1个停止位 */
#define USART_StopBits_0_5   ((uint16_t)0x1000)  /* 0.5个停止位 */
#define USART_StopBits_2     ((uint16_t)0x2000)  /* 2个停止位 */
#define USART_StopBits_1_5   ((uint16_t)0x3000)  /* 1.5个停止位 */

奇偶校验定义

#define USART_Parity_No      ((uint16_t)0x0000)  /* 无奇偶校验 */
#define USART_Parity_Even    ((uint16_t)0x0400)  /* 偶校验 */
#define USART_Parity_Odd     ((uint16_t)0x0600)  /* 奇校验 */

传输模式定义

#define USART_Mode_Rx        ((uint16_t)0x0004)  /* 接收模式 */
#define USART_Mode_Tx        ((uint16_t)0x0008)  /* 发送模式 */

硬件流控制定义

#define USART_HardwareFlowControl_None     ((uint16_t)0x0000)  /* 无硬件流控制 */
#define USART_HardwareFlowControl_RTS      ((uint16_t)0x0100)  /* RTS硬件流控制 */
#define USART_HardwareFlowControl_CTS      ((uint16_t)0x0200)  /* CTS硬件流控制 */
#define USART_HardwareFlowControl_RTS_CTS  ((uint16_t)0x0300)  /* RTS和CTS硬件流控制 */

USART中断标志定义

基本中断类型

#define USART_IT_PE      ((uint16_t)0x0028)  /* 奇偶校验错误中断 */
#define USART_IT_TXE     ((uint16_t)0x0727)  /* 发送数据寄存器空中断 */
#define USART_IT_TC      ((uint16_t)0x0626)  /* 传输完成中断 */
#define USART_IT_RXNE    ((uint16_t)0x0525)  /* 接收数据寄存器非空中断 */
#define USART_IT_IDLE    ((uint16_t)0x0424)  /* 空闲线检测中断 */
#define USART_IT_LBD     ((uint16_t)0x0846)  /* LIN断路检测中断 */
#define USART_IT_CTS     ((uint16_t)0x096A)  /* CTS中断 */
#define USART_IT_ERR     ((uint16_t)0x0060)  /* 错误中断 */

具体错误中断标志

#define USART_IT_ORE_RX  ((uint16_t)0x0325)  /* 溢出错误中断(RXNEIE位置位时) */
#define USART_IT_ORE_ER  ((uint16_t)0x0360)  /* 溢出错误中断(EIE位置位时) */
#define USART_IT_NE      ((uint16_t)0x0260)  /* 噪声错误中断 */
#define USART_IT_FE      ((uint16_t)0x0160)  /* 帧错误中断 */

USART状态标志定义

#define USART_FLAG_CTS   ((uint16_t)0x0200)  /* CTS标志 */
#define USART_FLAG_LBD   ((uint16_t)0x0100)  /* LIN断路检测标志 */
#define USART_FLAG_TXE   ((uint16_t)0x0080)  /* 发送数据寄存器空标志 */
#define USART_FLAG_TC    ((uint16_t)0x0040)  /* 传输完成标志 */
#define USART_FLAG_RXNE  ((uint16_t)0x0020)  /* 接收数据寄存器非空标志 */
#define USART_FLAG_IDLE  ((uint16_t)0x0010)  /* 空闲线检测标志 */
#define USART_FLAG_ORE   ((uint16_t)0x0008)  /* 溢出错误标志 */
#define USART_FLAG_NE    ((uint16_t)0x0004)  /* 噪声错误标志 */
#define USART_FLAG_FE    ((uint16_t)0x0002)  /* 帧错误标志 */
#define USART_FLAG_PE    ((uint16_t)0x0001)  /* 奇偶校验错误标志 */

USART DMA请求定义

#define USART_DMAReq_Tx  ((uint16_t)0x0080)  /* 发送DMA请求 */
#define USART_DMAReq_Rx  ((uint16_t)0x0040)  /* 接收DMA请求 */

标准库函数详解

1. USART_DeInit

/**
 * @brief  将USARTx外设寄存器重新设置为复位值
 * @param  USARTx: 指定要重置的USART外设,可以是USART1、USART2、USART3、UART4或UART5
 * @retval
 * @example
 *     USART_DeInit(USART1);  // 重置USART1外设
 */
void USART_DeInit(USART_TypeDef* USARTx);

功能说明: 此函数将指定的USART外设的所有寄存器重置为其复位值,用于外设的重新初始化。

2. USART_Init

/**
 * @brief  根据USART_InitStruct中指定的参数初始化USARTx外设
 * @param  USARTx: 指定要初始化的USART外设
 * @param  USART_InitStruct: 指向USART_InitTypeDef结构的指针,包含指定USART外设的配置信息
 * @retval
 * @example
 *     USART_InitTypeDef USART_InitStructure;
 *     USART_InitStructure.USART_BaudRate = 9600;
 *     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
 *     USART_InitStructure.USART_StopBits = USART_StopBits_1;
 *     USART_InitStructure.USART_Parity = USART_Parity_No;
 *     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 *     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
 *     USART_Init(USART1, &USART_InitStructure);
 */
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

功能说明: 此函数根据USART_InitStruct中的参数配置指定的USART外设,包括波特率、数据位长度、停止位、奇偶校验、传输模式和硬件流控制。

3. USART_StructInit

/**
 * @brief  将USART_InitStruct中的每个参数设置为默认值
 * @param  USART_InitStruct: 指向要初始化的USART_InitTypeDef结构的指针
 * @retval
 * @example
 *     USART_InitTypeDef USART_InitStructure;
 *     USART_StructInit(&USART_InitStructure);
 */
void USART_StructInit(USART_InitTypeDef* USART_InitStruct);

功能说明: 此函数将USART初始化结构体的所有成员设置为默认值,便于快速配置常用的USART参数。

4. USART_ClockInit

/**
 * @brief  根据USART_ClockInitStruct中指定的参数初始化USARTx的时钟配置
 * @param  USARTx: 指定要配置时钟的USART外设,可以是USART1、USART2或USART3
 * @param  USART_ClockInitStruct: 指向USART_ClockInitTypeDef结构的指针
 * @retval
 * @example
 *     USART_ClockInitTypeDef USART_ClockInitStructure;
 *     USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
 *     USART_ClockInit(USART1, &USART_ClockInitStructure);
 */
void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct);

功能说明: 此函数配置USART的时钟相关参数,主要用于同步模式下的时钟配置。

5. USART_Cmd

/**
 * @brief  使能或失能指定的USART外设
 * @param  USARTx: 指定要控制的USART外设
 * @param  NewState: USART外设的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     USART_Cmd(USART1, ENABLE);   // 使能USART1
 *     USART_Cmd(USART1, DISABLE);  // 失能USART1
 */
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);

功能说明: 此函数用于使能或失能指定的USART外设,是USART工作的必要步骤。

6. USART_ITConfig

/**
 * @brief  使能或失能指定的USART中断
 * @param  USARTx: 指定要配置中断的USART外设
 * @param  USART_IT: 指定要使能或失能的中断源
 * @param  NewState: 指定中断的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  // 使能接收中断
 *     USART_ITConfig(USART1, USART_IT_TXE, ENABLE);   // 使能发送中断
 */
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);

功能说明: 此函数用于配置USART的中断源,可以选择性地使能或失能各种中断。

7. USART_SendData

/**
 * @brief  通过USARTx外设发送单个数据
 * @param  USARTx: 指定要发送数据的USART外设
 * @param  Data: 要发送的数据,数据范围:0x00-0x1FF
 * @retval
 * @example
 *     USART_SendData(USART1, 'A');     // 发送字符'A'
 *     USART_SendData(USART1, 0x41);    // 发送十六进制0x41(对应字符'A')
 */
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

功能说明: 此函数用于通过指定的USART外设发送一个数据。发送前需要确保发送数据寄存器为空。

8. USART_ReceiveData

/**
 * @brief  返回USARTx外设最近接收的数据
 * @param  USARTx: 指定要接收数据的USART外设
 * @retval 接收到的数据
 * @example
 *     uint16_t received_data;
 *     if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
 *     {
 *         received_data = USART_ReceiveData(USART1);
 *     }
 */
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

功能说明: 此函数用于读取接收数据寄存器中的数据。读取前应检查RXNE标志确保有数据可读。

9. USART_GetFlagStatus

/**
 * @brief  检查指定的USART标志位是否设置
 * @param  USARTx: 指定要检查的USART外设
 * @param  USART_FLAG: 指定要检查的标志位
 * @retval USART_FLAG的新状态(SET或RESET)
 * @example
 *     if(USART_GetFlagStatus(USART1, USART_FLAG_TXE) != RESET)
 *     {
 *         // 发送数据寄存器为空,可以发送数据
 *         USART_SendData(USART1, data);
 *     }
 */
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

功能说明: 此函数用于检查指定USART标志位的状态,常用于判断发送/接收状态和错误状态。

10. USART_ClearFlag

/**
 * @brief  清除USARTx的指定标志位
 * @param  USARTx: 指定要清除标志的USART外设
 * @param  USART_FLAG: 指定要清除的标志位
 * @retval
 * @example
 *     USART_ClearFlag(USART1, USART_FLAG_TC);   // 清除传输完成标志
 *     USART_ClearFlag(USART1, USART_FLAG_RXNE); // 清除接收数据寄存器非空标志
 */
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);

功能说明: 此函数用于清除指定的USART状态标志位,避免重复触发中断或状态检测。

11. USART_GetITStatus

/**
 * @brief  检查指定的USART中断是否发生
 * @param  USARTx: 指定要检查的USART外设
 * @param  USART_IT: 指定要检查的中断源
 * @retval USART_IT的新状态(SET或RESET)
 * @example
 *     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
 *     {
 *         // 接收中断发生,处理接收数据
 *         uint16_t data = USART_ReceiveData(USART1);
 *     }
 */
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);

功能说明: 此函数用于在中断服务程序中检查特定中断源的状态,确定中断触发原因。

12. USART_DMACmd

/**
 * @brief  使能或失能指定USART的DMA接口
 * @param  USARTx: 指定要配置DMA的USART外设
 * @param  USART_DMAReq: 指定DMA请求类型,可以是USART_DMAReq_Tx或USART_DMAReq_Rx
 * @param  NewState: DMA请求的新状态,可以是ENABLE或DISABLE
 * @retval
 * @example
 *     USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);  // 使能发送DMA
 *     USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);  // 使能接收DMA
 */
void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState);

功能说明: 此函数用于配置USART的DMA功能,实现大量数据的高效传输。

使用示例

基本USART配置示例

#include "stm32f10x.h"

void USART1_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    
    // 使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
    
    // 配置GPIO
    // PA9 - USART1_TX
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // PA10 - USART1_RX
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // USART配置
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_Init(USART1, &USART_InitStructure);
    
    // 使能USART
    USART_Cmd(USART1, ENABLE);
}

USART中断配置示例

void USART1_NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    
    // 配置NVIC
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    
    // 使能接收中断
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}

void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        uint16_t data = USART_ReceiveData(USART1);
        // 处理接收到的数据
        USART_SendData(USART1, data); // 回显
    }
}

数据发送和接收示例

// 发送字符串
void USART_SendString(USART_TypeDef* USARTx, char* str)
{
    while(*str)
    {
        while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
        USART_SendData(USARTx, *str++);
    }
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
}

// 接收数据
uint16_t USART_ReceiveByte(USART_TypeDef* USARTx)
{
    while(USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET);
    return USART_ReceiveData(USARTx);
}

注意事项

  1. 时钟配置:使用USART前必须先使能相应的外设时钟和GPIO时钟
  2. GPIO配置:TX引脚需配置为复用推挽输出,RX引脚配置为浮空输入或上拉输入
  3. 波特率限制:波特率的设置受到外设时钟频率的限制,需要根据实际时钟频率计算
  4. 中断处理:在中断服务程序中,需要检查具体的中断源并及时清除中断标志
  5. 数据长度:当使用9位数据长度时,需要相应地配置奇偶校验
  6. 硬件流控制:使用硬件流控制时,需要额外配置CTS和RTS引脚
  7. DMA传输:使用DMA传输时,需要正确配置DMA通道和内存地址

总结

STM32F10x USART外设标准库提供了完整的串行通信功能,支持异步通信、同步通信、单线通信、LIN通信、IrDA通信和智能卡接口。库函数涵盖了初始化配置、数据传输、中断处理、状态检测等各个方面,为开发者提供了灵活而强大的串行通信解决方案。通过合理配置各项参数,可以满足不同应用场景下的通信需求。