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 < 波特率 < 0x0044AA21USART_WordLength:指定数据帧中传输或接收的数据位数,可选值见@ref USART_Word_LengthUSART_StopBits:指定传输的停止位数,可选值见@ref USART_Stop_BitsUSART_Parity:指定奇偶校验模式,可选值见@ref USART_ParityUSART_Mode:指定接收或发送模式,可选值见@ref USART_ModeUSART_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_ClockUSART_CPOL:指定串行时钟的稳态值,可选值见@ref USART_Clock_PolarityUSART_CPHA:指定位捕获的时钟转换,可选值见@ref USART_Clock_PhaseUSART_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);
}注意事项
- 时钟配置:使用USART前必须先使能相应的外设时钟和GPIO时钟
- GPIO配置:TX引脚需配置为复用推挽输出,RX引脚配置为浮空输入或上拉输入
- 波特率限制:波特率的设置受到外设时钟频率的限制,需要根据实际时钟频率计算
- 中断处理:在中断服务程序中,需要检查具体的中断源并及时清除中断标志
- 数据长度:当使用9位数据长度时,需要相应地配置奇偶校验
- 硬件流控制:使用硬件流控制时,需要额外配置CTS和RTS引脚
- DMA传输:使用DMA传输时,需要正确配置DMA通道和内存地址
总结
STM32F10x USART外设标准库提供了完整的串行通信功能,支持异步通信、同步通信、单线通信、LIN通信、IrDA通信和智能卡接口。库函数涵盖了初始化配置、数据传输、中断处理、状态检测等各个方面,为开发者提供了灵活而强大的串行通信解决方案。通过合理配置各项参数,可以满足不同应用场景下的通信需求。