2 STM32库函数 之 通用同步异步收发器(USART、串口)所有函数的介绍及使用

2 STM32库函数 之 通用同步异步收发器(USART、串口)所有函数的介绍及使用

  • 前言
  • 一、USART固件库函数预览
  • 二、USART固件库函数具体介绍
    • 2.1 库函数 USART_DeInit
    • 2.2 库函数 USART_Init
      • 2.2.1 USART_InitTypeDef structure
      • 2.2.2 USART_InitTypeDef 成员 USART 模式对比
      • 2.2.3 USART_BaudRate
      • 2.2.4 USART_WordLength
      • 2.2.5 USART_StopBits
      • 2.2.6 USART_Parity
      • 2.2.7 USART_HardwareFlowControl
      • 2.2.8 USART_Mode
      • 2.2.9 USART_CLOCK
      • 2.2.10 USART_CPOL
      • 2.2.11 USART_CPHA
      • 2.2.12 USART_LastBit
    • 2.3 库函数 USART_StructInit
      • 2.3.1 USART_InitStruct 默认值
    • 2.4 库USART_ClockInit
      • 2.4.1 USART_ClockInitTypeDef
      • 2.4.2 USART_Clock 时钟使能控制
      • 2.4.3 USART_CPOL 时钟极性
      • 2.4.4 USART_CPHA 时钟相位
      • 2.4.5 USART_LastBit 最尾位时钟脉冲
    • 2.5 库函数 USART_ClockStructInit
      • 2.5.1 USART_ClockInitTypeDef 默认值
    • 2.6 库函数 USART_ Cmd
    • 2.7 库函数 USART_SetPrescaler
    • 2.8 库函数 USART_OverSampling8Cmd
    • 2.9 库函数 USART_OneBitMethodCmd
    • 2.10 库函数 USART_SendData
    • 2.11 函数USART_ReceiveData
    • 2.12 函数 USART_SetAddress
    • 2.13 库函数 USART_WakeUpConfig
      • 2.13.1 USART_WakeUp
    • 2.14 库函数 USART_ReceiverWakeUpCmd
    • 2.15 库函数 USART_LINBreakDetectiLengthConfig
      • 2.15.1 USART_LINBreakDetectLength
    • 2.16 库函数 USART_LINCmd
    • 2.17 库函数 USART_SendBreak
    • 2.18 库函数 USART_HalfDuplexCmd
    • 2.19 库函数 USART_SmartCardCmd
    • 2.20 库函数 USART_SmartCardNackCmd
    • 2.21 库函数 USART_SetGuardTime
    • 2.22 库函数 USART_IrDAConfig
      • 2.22.1 USART_IrDAMode
    • 2.23 库函数 USART_IrDACmd
    • 2.24 库函数 USART_ DMACmd
      • 2.24.1 USART_DMAreq
    • 2.25 库函数 USART_ITConfig
      • 2.25.1 USART_IT
    • 2.26 库函数 USART_ GetFlagStatus
      • 2.26.1 USART_FLAG
    • 2.27 库函数 USART_ ClearFlag
    • 2.28 库函数 USART_ GetITStatus
      • 2.28.1 SART_IT
    • 2.29 函数 USART_ ClearITPendingBit
  • 三 项目中部分函数的使用
    • 3.1 串口1的初始化:
    • 3.2 串口2-RS232初始化
    • 3.2 串口2-RS485初始化
  • 该文档修改记录:
  • 总结

前言

通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准 NRZ 异步串行数据格式的外部
设备之间进行全双工数据交换。USART 利用分数波特率发生器提供宽范围的波特率选择。它支持同步单
向通信和半双工单线通信。它也支持 LIN(局部互连网),智能卡协议和 IrDA(红外数据组织)SIR ENDEC 规
范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。使用多缓冲器配置的 DMA 方式,可以实
现高速数据通信。

函数描述格式:

函数名 外设函数的名称
函数原形 原形声明
功能描述 简要解释函数是如何执行的
输入参数{x} 输入参数描述
输出参数{x} 输出参数描述
返回值 函数的返回值
先决条件 调用函数前应满足的要求
被调用函数 其他被该函数调用的库函数

缩写定义

缩写 外设/单元
ADC 模数转换器
BKP 备份寄存器
CAN 控制器局域网模块
DMA 直接内存存取控制器
EXTI 外部中断事件控制器
FLASH 闪存存储器
GPIO 通用输入输出
I2C 内部集成电路
IWDG 独立看门狗
NVIC 嵌套中断向量列表控制器
PWR 电源/功耗控制
RCC 复位与时钟控制器
RTC 实时时钟
SPI 串行外设接口
SysTick 系统嘀嗒定时器
TIM 通用定时器
TIM1 高级控制定时器
USART 通用同步异步接收发射端
WWDG 窗口看门狗

一、USART固件库函数预览

序号 函数名 描述
1 USART_DeInit 将外设 USARTx 寄存器重设为默认值
2 USART_Init 根据USART_InitStruct 中指定的参数初始化外设 USARTx 寄存器
3 USART_StructInit 把 USART_InitStruct 中的每一个参数按默认值填入
4 USART_ClockInit 初始化USARTx外围时钟
5 USART_ClockStructInit 将每个usart_clockkinitstruct成员填充为默认值
6 USART_Cmd 使能或者失能 USART 外设
7 USART_SetPrescaler 设置 USART 时钟预分频
8 USART_OverSampling8Cmd 启用或禁用USART的8倍过采样模式
9 USART_OneBitMethodCmd 启用或禁用USART的一位采样方法
10 USART_SendData 通过外设 USARTx 发送单个数据
11 USART_ReceiveData 返回 USARTx 最近接收到的数据
12 USART_SetAddress 设置 USART 节点的地址
13 USART_WakeUpConfig 选择USART 的唤醒方式
14 USART_ReceiverWakeUpCmd 检查 USART 是否处于静默模式
15 USART_LINBreakDetectLengthConfig 设置 USART LIN 中断检测长度
16 USART_LINCmd 使能或者失能 USARTx 的 LIN 模式
17 USART_SendBreak 发送中断字
18 USART_HalfDuplexCmd 使能或者失能 USART 半双工模式
19 USART_SmartCardCmd 使能或者失能指定 USART 的智能卡模式
20 USART_SmartCardNackCmd 使能或者失能 NACK 传输
21 USART_SetGuardTime 设置指定的 USART 保护时间
22 USART_IrDAConfig 设置 USART IrDA 模式
23 USART_IrDACmd 使能或者失能 USART IrDA 模式
24 USART_DMACmd 使能或者失能指定 USART 的 DMA 请求
25 USART_ITConfig 使能或者失能指定的 USART 中断
26 USART_GetFlagStatus 检查指定的 USART 标志位设置与否
27 USART_ClearFlag 清除 USARTx 的待处理标志位
28 USART_GetITStatus 检查指定的 USART 中断发生与否
29 USART_ClearITPendingBit 清除 USARTx 的中断待处理位

函数功能分类:

序号数量 函数功能分类说明
序号1 函数 是将USART配置设置为默认重置状态的函数;
序号2~9函数 是USART初始化和配置函数;
序号10~11函数 是USART数据传输函数功能;
序号12~14函数 是USART多处理器通信功能;
序号12~14函数 是USART多处理器通信功能;
序号15~17函数 是USART LIN模式函数功能;
序号18函数 是USART 半双工模式函数功能;
序号19~21函数 是USART 智能卡模式功能功能;
序号22~23函数 是USART IrDA模式函数功能;
序号24~29函数 是USART 中断和标记管理功能;

二、USART固件库函数具体介绍

2.1 库函数 USART_DeInit

函数名 USART_DeInit
函数原形 void USART_DeInit(USART_TypeDef* USARTx)
功能描述 将外设 USARTx 寄存器重设为默认值
输入参数 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输出参数
返回值
先决条件
被调用函数 RCC_APB2PeriphResetCmd() ;RCC_APB1PeriphResetCmd()

代码如下(示例):

/* 将 USART1 寄存器重置为默认重置值 */
USART_DeInit(USART1);

2.2 库函数 USART_Init

注:该函数是以F1系列单片机的函数来进行解释的,F4系列单片机的USART_InitTypeDef 结构体把时钟初始化单独拿出来了;下面有介绍。

函数名 USART_Init
函数原形 void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
功能描述 根据 USART_InitStruct 中指定的参数初始化外设 USARTx 寄存器
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 USART_InitStruct:指向结构 USART_InitTypeDef 的指针,包含了外设 USART 的配置信息。
输出参数
返回值
先决条件
被调用函数

2.2.1 USART_InitTypeDef structure

USART_InitTypeDef structure USART_InitTypeDef 定义于文件“stm32fxxx_usart.h”: typedef struct
{
u32 USART_BaudRate;
u16 USART_WordLength;
u16 USART_StopBits;
u16 USART_Parity;
u16 USART_HardwareFlowControl;
u16 USART_Mode;
u16 USART_Clock;
u16 USART_CPOL;
u16 USART_CPHA;
u16 USART_LastBit;
} USART_InitTypeDef;

.下面 描述了结构 USART_InitTypeDef 在同步和异步模式下使用的不同成员。

2.2.2 USART_InitTypeDef 成员 USART 模式对比

成员 异步模式 同步模式
USART_BaudRate X X
USART_WordLength X X
USART_StopBits X X
USART_Parity X X
USART_HardwareFlowControl X X
USART_Mode X X
USART_Clock X
USART_CPOL X
USART_CPHA X
USART_LastBit X

2.2.3 USART_BaudRate

该成员设置了 USART 传输的波特率,波特率可以由以下公式计算: IntegerDivider = ((APBClock) / (16 * (USART_InitStruct->USART_BaudRate))) FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 16)+0.5

2.2.4 USART_WordLength

USART_WordLength 提示了在一个帧中传输或者接收到的数据位数。
USART_WordLength 定义

USART_WordLength 描述
USART_WordLength_8b 8 位数据
USART_WordLength_9b 9 位数据

2.2.5 USART_StopBits

USART_StopBits 定义了发送的停止位数目。
USART_StopBits 定义

USART_StopBits 描述
USART_StopBits_0.5 在帧结尾传输 0.5 个停止位
USART_StopBits_1 在帧结尾传输 1 个停止位
USART_StopBits_1.5 在帧结尾传输 1.5 个停止位
USART_StopBits_2 在帧结尾传输 2 个停止位

2.2.6 USART_Parity

USART_Parity 定义了奇偶模式。
USART_Parity 定义

USART_Parity 描述
USART_Parity_No 奇偶失能
USART_Parity_Even 偶模式
USART_Parity_Odd 奇模式

注意:奇偶校验一旦使能,在发送数据的 MSB 位插入经计算的奇偶位(字长 9 位时的第 9 位,字长 8 位
时的第 8 位)。

2.2.7 USART_HardwareFlowControl

USART_HardwareFlowControl 指定了硬件流控制模式使能还是失能。

USART_HardwareFlowControl 定义

USART_HardwareFlowControl 描述
USART_HardwareFlowControl_None 硬件流控制失能
USART_HardwareFlowControl_RTS 发送请求 RTS 使能
USART_HardwareFlowControl_CTS 清除发送 CTS 使能
USART_HardwareFlowControl_RTS_CTS RTS 和 CTS 使能

2.2.8 USART_Mode

USART_Mode 指定了使能或者失能发送和接收模式。

USART_Mode 定义

USART_Mode 描述
USART_Mode_Tx 发送使能
USART_Mode_Rx 接收使能

2.2.9 USART_CLOCK

USART_CLOCK 提示了 USART 时钟使能还是失能。
USART_CLOCK 定义

USART_CLOCK 描述
USART_Clock_Enable 时钟高电平活动
USART_Clock_Disable 时钟低电平活动

2.2.10 USART_CPOL

USART_CPOL 指定了下 SLCK 引脚上时钟输出的极性。
USART_CPOL 定义

USART_CPOL 描述
USART_CPOL_High 时钟高电平
USART_CPOL_Low 时钟低电平

2.2.11 USART_CPHA

USART_CPHA 指定了下 SLCK 引脚上时钟输出的相位,和 CPOL 位一起配合来产生用户希望的时钟/数据的采样关系。
USART_CPHA 定义

USART_CPHA 描述
USART_CPHA_1Edge 时钟第一个边沿进行数据捕获
USART_CPHA_2Edge 时钟第二个边沿进行数据捕获

2.2.12 USART_LastBit

USART_LastBit 来控制是否在同步模式下,在 SCLK 引脚上输出最后发送的那个数据字 (MSB)对应的时钟脉冲。
USART_LastBit 定义

USART_LastBit 描述
USART_LastBit_Disable 最后一位数据的时钟脉冲不从 SCLK 输出
USART_LastBit_Enable 最后一位数据的时钟脉冲从 SCLK 输出

代码如下(示例):

/*  下面的示例说明如何配置USART1*/
 USART_InitTypeDef USART_InitStructure; 
 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_Odd; 
 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS;
 USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
 USART_InitStructure.USART_Clock = USART_Clock_Disable;
 USART_InitStructure.USART_CPOL = USART_CPOL_High; 
 USART_InitStructure.USART_CPHA = USART_CPHA_1Edge;
 USART_InitStructure.USART_LastBit = USART_LastBit_Enable;
 USART_Init(USART1, &USART_InitStructure);

2.3 库函数 USART_StructInit

函数名 USART_StructInit
函数原形 void USART_StructInit(USART_InitTypeDef* USART_InitStruct)
功能描述 把 USART_InitStruct 中的每一个参数按默认值填入
输入参数 USART_InitStruct:指向结构 USART_InitTypeDef 的指针,待初始化
输出参数
返回值
先决条件
被调用函数

2.3.1 USART_InitStruct 默认值

成员 默认值
USART_BaudRate 9600
USART_WordLength USART_WordLength_8b
USART_StopBits USART_StopBits_1
USART_Parity USART_Parity_No
USART_HardwareFlowControl USART_HardwareFlowControl_None
USART_Mode USART_Mode_Rx
USART_Clock USART_Clock_Disable
USART_CPOL USART_CPOL_Low
USART_CPHA USART_CPHA_1Edge
USART_LastBit USART_LastBit_Disable

代码如下(示例):

/*下面的例子说明了如何初始化USART_InitTypeDef结构 */
USART_InitTypeDef USART_InitStructure; 
USART_StructInit(&USART_InitStructure);

2.4 库USART_ClockInit

注:该函数是F4系列单片机的函数。

函数名 USART_ClockInit
函数原形 void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct)
功能描述 初始化USARTx外围时钟
输入参数 1 USARTx:其中x可以是1、2、3或6来选择USART外设
输出参数 2 指向usart_clockkinittypedef结构的指针,包含指定USART外设的配置信息。
返回值
先决条件
被调用函数

2.4.1 USART_ClockInitTypeDef

typedef struct
{
uint16_t USART_Clock;
uint16_t USART_CPOL;
uint16_t USART_CPHA;
uint16_t USART_LastBit;
} USART_ClockInitTypeDef;

2.4.2 USART_Clock 时钟使能控制

USART_Clock 该参数指定USART时钟是启用还是禁用。如果使用同步模式发送,一般都
需要开启时钟。它设定USART_CR2 寄存器的CLKEN 位的值。
USART_Clock 定义

USART_Clock 描述
USART_Clock_Disable 时钟高电平活动
USART_Clock_Enable 时钟低电平活动

2.4.3 USART_CPOL 时钟极性

USART_CPOL 该参数指定串行时钟的稳定状态, 即空闲的时候是高电平还是低电平。它设定USART_CR2 寄存器的CPOL位的值。

USART_CPOL定义

USART_CPOL 描述
USART_CPOL_Low 时钟低电平
USART_CPOL_High 时钟高电平

2.4.4 USART_CPHA 时钟相位

USART_CPHA该参数指定进行位捕获的时钟转换。同步模式下SCLK 引脚上输出时钟相位设置,可设置在时钟第一个变化沿捕获数据(USART_CPHA_1Edge) 或在时钟第二个变化沿捕获数据。它设定USART_CR2 寄存器的CPHA 位的值。USART_CPHA 与USART_CPOL 配合使用可以获得多种模式时钟关系。

USART_CPHA定义

USART_CPHA 描述
USART_CPHA_1Edge 时钟第一个边沿进行数据捕获
USART_CPHA_2Edge 时钟第二个边沿进行数据捕获

2.4.5 USART_LastBit 最尾位时钟脉冲

指定上次发送的时钟脉冲是否对应数据位(MSB)必须以同步模式在SCLK引脚上输出。选择在发送最后一个数据位的时候时钟脉冲是否在SCLK 引脚输出,可以是不输出脉冲(USART_LastBit_Disable)、输出脉冲(USART_LastBit_Enable)。它设定USART_CR2 寄存器的LBCL 位的值。
USART_LastBit定义

USART_LastBit 描述
USART_LastBit_Disable 最后一位数据的时钟脉冲不从 SCLK 输出
USART_LastBit_Enable 最后一位数据的时钟脉冲从 SCLK 输出

代码如下(示例):

/*  下面的示例说明如何配置USART1 的时钟*/
 USART_ClockInitTypeDef USART_ClockInitStructure; 
 USART_ClockInitStructure.USART_Clock= USART_Clock_Disable;
 USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
 USART_ClockInitStructure.USART_CPHA= USART_CPHA_1Edge; 
 USART_ClockInitStructure.USART_LastBit = USART_CPHA_1Edge; 
 SART_Init(USART1, &USART_ClockInitStructure);

2.5 库函数 USART_ClockStructInit

注:该函数是F4系列单片机的函数。

函数名 USART_ClockStructInit
函数原形 void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct)
功能描述 把 USART_InitStruct 中的每一个参数按默认值填入
输入参数 USART_ClockInitStruct :指向结构 USART_ClockInitTypeDef的指针,待初始化
先决条件
被调用函数

2.5.1 USART_ClockInitTypeDef 默认值

成员 默认值
USART_Clock USART_Clock_Disable
USART_CPOL USART_CPOL_Low
USART_CPHA USART_CPHA_1Edge
USART_LastBit USART_LastBit_Disable

代码如下(示例):

/*  下面的示例说明如何配置USART1 的时钟*/
 USART_ClockInitTypeDef USART_ClockInitStructure; 
 USART_ClockStructInit(&USART_ClockInitStructure);

2.6 库函数 USART_ Cmd

函数名 USART_ Cmd
函数原形 void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)
功能描述 使能或者失能 USART 外设
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 NewState: 外设 USARTx 的新状态;这个参数可以取:ENABLE 或者 DISABLE
输出参数
返回值
先决条件
被调用函数

代码如下(示例):

/* 使能 USART1 */
 USART_Cmd(USART1, ENABLE);

2.7 库函数 USART_SetPrescaler

函数名 USART_SetPrescaler
函数原形 void USART_SetPrescaler(USART_TypeDef* USARTx, u8 USART_Prescaler)
功能描述 设置 USART 时钟预分频
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 USART_Prescaler: 时钟预分频
输出参数
返回值
先决条件
被调用函数

代码如下(示例):

/* 设置系统时钟预分频为0x56 */ 
USART_SetPrescaler(0x56);

2.8 库函数 USART_OverSampling8Cmd

函数名 USART_OverSampling8Cmd
函数原形 void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState)
功能描述 启用或禁用USART的8倍过采样模式
输入参数 1 USARTx:x 可以是 1~8,来选择 USART 外设
输入参数 2 NewState: USART 8倍过采样模式的新状态。该参数包括:ENABLE或DISABLE。
输出参数
返回值
先决条件
被调用函数

代码如下(示例):

/* 启用USART1 的8倍过采样模式 */ 
USART_OverSampling8Cmd(usart1,ENABLE);

2.9 库函数 USART_OneBitMethodCmd

函数名 USART_OneBitMethodCmd
函数原形 void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState)
功能描述 启用或禁用USART的一位采样方法
输入参数 1 USARTx:x 可以是 1~8,来选择 USART 外设
输入参数 2 NewState: USART 8倍过采样模式的新状态。该参数包括:ENABLE或DISABLE。
输出参数
返回值
先决条件
被调用函数

代码如下(示例):

/* 启用USART的一位采样方法 */ 
USART_OneBitMethodCmd(usart1,ENABLE);

2.10 库函数 USART_SendData

函数名 USART_ SendData
函数原形 void USART_SendData(USART_TypeDef* USARTx, u8 Data)
功能描述 通过外设 USARTx 发送单个数据
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 Data: 待发送的数据
输出参数
返回值
先决条件
被调用函数

代码如下(示例):

/* 在USART3上发送一个 0x26*/ 
USART_SendData(USART3, 0x26);

2.11 函数USART_ReceiveData

函数名 USART_ ReceiveData
函数原形 u8 USART_ReceiveData(USART_TypeDef* USARTx)
功能描述 返回 USARTx 最近接收到的数据
输入参数 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输出参数
返回值 接收到的字
先决条件
被调用函数

代码如下(示例):

/* 在USART2上收到数据,保存RxData */ 
u16 RxData;
RxData = USART_ReceiveData(USART2);

2.12 函数 USART_SetAddress

函数名 USART_SetAddress
函数原形 void USART_SetAddress(USART_TypeDef* USARTx, u8 USART_Address)
功能描述 设置 USART 节点的地址
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 USART_Address:提示 USART 节点的地址。
输出参数
返回值
先决条件
被调用函数

代码如下(示例):

/* 将USART2地址节点设置为0x5 */
 USART_SetAddress(USART2, 0x5);

2.13 库函数 USART_WakeUpConfig

函数名 USART_WakeUpConfig
函数原形 void USART_WakeUpConfig(USART_TypeDef* USARTx, u16 USART_WakeUp)
功能描述 选择 USART 的唤醒方式
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 USART_WakeUp:USART 的唤醒方式
输出参数
返回值
先决条件
被调用函数

2.13.1 USART_WakeUp

USART_WakeUp选择USART的唤醒方式。
USART_WakeUp 值

USART_WakeUp 描述
USART_WakeUp_IdleLine 空闲总线唤醒
USART_WakeUp_AddressMark 地址标记唤醒

代码如下(示例):

/* 选择IDLE线路作为USART1唤醒 */
 USART_WakeUpConfig(USART1, USART_WakeUpIdleLine);

2.14 库函数 USART_ReceiverWakeUpCmd

函数名 USART_ReceiverWakeUpCmd
函数原形 void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState Newstate)
功能描述 检查 USART 是否处于静默模式
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 NewState: USART 静默模式的新状态;这个参数可以取:ENABLE 或者 DISABLE
输出参数
返回值
先决条件
被调用函数

代码如下(示例):

/*USART3在正常模式  */
 USART_ReceiverWakeUpCmd(USART3, DISABLE);

2.15 库函数 USART_LINBreakDetectiLengthConfig

函数名 USART_LINBreakDetectiLengthConfig
函数原形 void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, u16 USART_LINBreakDetectLength)
功能描述 设置 USART LIN 中断检测长度
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 USART_LINBreakDetectLength:LIN 中断检测长度;
输出参数
返回值
先决条件
被调用函数

2.15.1 USART_LINBreakDetectLength

USART_LINBreakDetectLength选择USART的唤醒方式。
USART_LINBreakDetectLength 值

USART_LINBreakDetectLength 描述
USART_LINBreakDetectLength_10b 10 位中断检测
USART_LINBreakDetectLength_11b 11 位中断检测

代码如下(示例):

/* 为USART1选择10位中断检测 */ 
USART_LINBreakDetectLengthConfig(USART1, USART_LINDetectLength_10b);

2.16 库函数 USART_LINCmd

函数名 USART_LINCmd
函数原形 void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState Newstate)
功能描述 使能或者失能 USARTx 的 LIN 模式
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 NewState: USART LIN 模式的新状态这个参数可以取:ENABLE 或者 DISABLE
输出参数
返回值
先决条件
被调用函数

代码如下(示例):

/*开启USART2 LIN模式  */ 
USART_LINCmd(USART2, ENABLE);

2.17 库函数 USART_SendBreak

函数名 USART_SendBreak
函数原形 void USART_SendBreak(USART_TypeDef* USARTx)
功能描述 发送中断字
输入参数 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输出参数
返回值
先决条件
被调用函数

代码如下(示例):

/* 在USART1上发送中断字符 */ 
USART_SendBreak(USART1);

2.18 库函数 USART_HalfDuplexCmd

函数名 USART_HalfDuplexCmd
函数原形 void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState Newstate)
功能描述 使能或者失能 USART 半双工模式
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 NewState: USART 半双工模式传输的新状态;这个参数可以取:ENABLE 或者 DISABLE
输出参数
返回值
先决条件
被调用函数

代码如下(示例):

/*使能USART2的半双工模式  */ 
USART_HalfDuplexCmd(USART2, ENABLE);

2.19 库函数 USART_SmartCardCmd

函数名 USART_SmartCardCmd
函数原形 void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState Newstate)
功能描述 使能或者失能指定 USART 的智能卡模式
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 NewState: USART 智能卡模式的新状态;这个参数可以取:ENABLE 或者 DISABLE
输出参数
返回值
先决条件
被调用函数

代码如下(示例):

/*启用USART1智能卡模式  */ 
USART_HalfDuplexCmd(USART2, ENABLE);

2.20 库函数 USART_SmartCardNackCmd

函数名 USART_SmartCardNackCmd
函数原形 void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState Newstate)
功能描述 使能或者失能 NACK 传输
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 NewState: NACK 传输的新状态;这个参数可以取:ENABLE 或者 DISABLE
输出参数
返回值
先决条件
被调用函数

代码如下(示例):

/*在奇偶校验错误时启用USART1 NACK传输*/
USART_SmartCardNACKCmd(USART1, ENABLE);

2.21 库函数 USART_SetGuardTime

函数名 USART_SetGuardTime
函数原形 void USART_SetGuardTime(USART_TypeDef* USARTx, u8 USART_GuardTime)
功能描述 设置指定的 USART 保护时间
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 USART_GuardTime: 指定的保护时间
输出参数
返回值
先决条件
被调用函数

代码如下(示例):

/*设置守护时间为0x78 */
USART_SetGuardTime(0x78);

2.22 库函数 USART_IrDAConfig

函数名 USART_IrDAConfig
函数原形 void USART_IrDAConfig(USART_TypeDef* USARTx, u16 USART_IrDAMode)
功能描述 设置 USART IrDA 模式
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 USART_IrDAMode:LIN 中断检测长度
输出参数
返回值
先决条件
被调用函数

2.22.1 USART_IrDAMode

USART_IrDAMode选择IrDA的模式。
USART_IrDAMode 值

USART_IrDAMode 描述
USART_IrDAMode_LowPower IrDA 低功耗模式
USART_IrDAMode_Normal IrDA 正常模式

代码如下(示例):

/* USART2 IrDA低功耗选择*/
USART_IrDAConfig(USART2,USART_IrDAMode_LowPower);

2.23 库函数 USART_IrDACmd

函数名 | USART_IrDACmd
函数原形 | void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState Newstate)
功能描述 | 使能或者失能 USART IrDA 模式
输入参数 1 | USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 | NewState: USART IrDA 模式的新状态;这个参数可以取:ENABLE 或者 DISABLE
输出参数 | 无
返回值 | 无
先决条件 | 无
被调用函数 | 无

代码如下(示例):

/*开启USART1 IrDA模式*/
USART_IrDACmd(USART1, ENABLE);

2.24 库函数 USART_ DMACmd

函数名 USART_ DMACmd
函数原形 USART_DMACmd(USART_TypeDef* USARTx, FunctionalState NewState)
功能描述 使能或者失能指定 USART 的 DMA 请求
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 USART_DMAreq:指定 DMA 请求
输入参数 3 NewState: USARTx DMA 请求源的新状态;这个参数可以取:ENABLE 或者 DISABLE
输出参数
返回值
先决条件
被调用函数

2.24.1 USART_DMAreq

USART_DMAreq选择待使能或者失能的DMA请求。
USART_LastBit 值

USART_DMAreq 描述
USART_DMAReq_Tx 发送 DMA 请求
USART_DMAReq_Rx 接收 DMA 请求

代码如下(示例):

/*启用USART2的Rx和Tx DMA传输动作*/
USART_DMACmd(USART2, USART_DMAReq_Rx | USART_DMAReq_Tx, ENABLE);

2.25 库函数 USART_ITConfig

函数名 USART_ITConfig
函数原形 void USART_ITConfig(USART_TypeDef* USARTx, u16 USART_IT, FunctionalState NewState)
功能描述 使能或者失能指定的 USART 中断
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 USART_IT:待使能或者失能的 USART 中断源
输入参数 3 NewState:USARTx 中断的新状态;这个参数可以取:ENABLE 或者 DISABLE
输出参数
返回值
先决条件
被调用函数

2.25.1 USART_IT

输入参数 USART_IT 使能或者失能 USART 的中断。可以取下表的一个或者多个取值的组合作为该参数的值。
USART_IT 值

USART_IT 描述
USART_IT_PE 奇偶错误中断
USART_IT_TXE 发送中断
USART_IT_TC 传输完成中断
USART_IT_RXNE 接收中断
USART_IT_IDLE 空闲总线中断
USART_IT_LBD LIN 中断检测中断
USART_IT_CTS CTS 中断
USART_IT_ERR 错误中断

代码如下(示例):

/*启用USART1传输中断*/
USART_ITConfig(USART1, USART_IT_Transmit ENABLE);

2.26 库函数 USART_ GetFlagStatus

函数名 USART_ GetFlagStatus
函数原形 FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, u16 USART_FLAG)
功能描述 检查指定的 USART 标志位设置与否
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 USART_FLAG:待检查的 USART 标志位
输出参数
返回值 USART_FLAG 的新状态(SET 或者 RESET)
先决条件
被调用函数

2.26.1 USART_FLAG

给出了所有可以被函数USART_ GetFlagStatus检查的标志位列表。
USART_FLAG 值

USART_FLAG 描述
USART_FLAG_CTS CTS 标志位
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 Status;
Status = USART_GetFlagStatus(USART1, USART_FLAG_TXE);

2.27 库函数 USART_ ClearFlag

函数名 USART_ ClearFlag
函数原形 void USART_ClearFlag(USART_TypeDef* USARTx, u16 USART_FLAG)
功能描述 清除 USARTx 的待处理标志位
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 USART_FLAG:待清除的 USART 标志位
输出参数
返回值
先决条件
被调用函数

代码如下(示例):

/*清除溢出错误标志*/
 USART_ClearFlag(USART1,USART_FLAG_OR);

2.28 库函数 USART_ GetITStatus

函数名 USART_ GetITStatus
函数原形 ITStatus USART_GetITStatus(USART_TypeDef* USARTx, u16 USART_IT)
功能描述 检查指定的 USART 中断发生与否
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 USART_IT:待检查的 USART 中断源
输出参数
返回值 USART_IT 的新状态
先决条件
被调用函数

2.28.1 SART_IT

给出了所有可以被函数USART_ GetITStatus检查的中断标志位列表
USART_IT 值

USART_IT 描述
USART_IT_PE 奇偶错误中断
USART_IT_TXE 发送中断
USART_IT_TC 发送完成中断
USART_IT_RXNE 接收中断
USART_IT_IDLE 空闲总线中断
USART_IT_LBD LIN 中断探测中断
USART_IT_CTS CTS 中断
USART_IT_ORE 溢出错误中断
USART_IT_NE 噪音错误中断
USART_IT_FE 帧错误中断

代码如下(示例):

/*获取USART1溢出错误中断状态*/
ITStatus ErrorITStatus;
ErrorITStatus = USART_GetITStatus(USART1, USART_IT_OverrunError);

2.29 函数 USART_ ClearITPendingBit

函数名 USART_ ClearITPendingBit
函数原形 void USART_ClearITPendingBit(USART_TypeDef* USARTx, u16 USART_IT)
功能描述 清除 USARTx 的中断待处理位
输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设
输入参数 2 USART_IT:待检查的 USART 中断源
输出参数
返回值
先决条件
被调用函数

代码如下(示例):

/*清除溢出错误中断挂起位*/
USART_ClearITPendingBit(USART1,USART_IT_OverrunError);

三 项目中部分函数的使用

3.1 串口1的初始化:

该串口一般都是用于调试使用,以及使用HEX文件通过该串口下载程序。

//bound:波特率
void uart_init(u32 bound){
   //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
 
	//串口1对应引脚复用映射
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1
	
	//USART1端口配置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//速度50MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
	GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10

   //USART1 初始化设置
	USART_InitStructure.USART_BaudRate = bound;//波特率设置
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
    USART_Init(USART1, &USART_InitStructure); //初始化串口1
	
    USART_Cmd(USART1, ENABLE);  //使能串口1 
	
     USART_ClearFlag(USART1, USART_FLAG_TC);  //清除 串口1 的待处理标志位
 
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断

	//Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器、
	
}

void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	u8 Res;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
	{
		Res =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
		{
			if(USART_RX_STA&0x4000)//接收到了0x0d
			{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
				else USART_RX_STA|=0x8000;	//接收完成了 
			}
			else //还没收到0X0D
			{	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
				{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
				}		 
			}
		}   		 
  } 
} 

3.2 串口2-RS232初始化

我公司的ARM板 串口2芯片是232。


u8 RS232_RX_BUF[RS232_RX_BUFSIZE];
u16 RS232_RX_CNT=0;
void USART2_IRQHandler(void)//串口2中断服务程序
{
	u8 res;
	OSIntEnter();    
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  
	{
		res=USART_ReceiveData(USART2); 
		if(RS232_RX_CNT<RS232_RX_BUFSIZE)
		{
			RS232_RX_BUF[RS232_RX_CNT]=res;
			RS232_RX_CNT++;
		}
	} 
	USART_ClearITPendingBit(USART2,USART_IT_RXNE);
	OSIntExit();  											 
} 

//bound:波特率
void Usart2_Init(u32 bound)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef  NVIC_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//PA2 TX   PA3 RX
	
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_USART2); //GPIOD5复用为USART2
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource6,GPIO_AF_USART2); //GPIOD6复用为USART2
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
	GPIO_Init(GPIOD,&GPIO_InitStructure);
	
	USART_InitStructure.USART_BaudRate=bound;
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
	USART_InitStructure.USART_Parity=USART_Parity_No;
	USART_InitStructure.USART_StopBits=USART_StopBits_1;
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;
	USART_Init(USART2,&USART_InitStructure);
	
	 USART_Cmd(USART2, ENABLE);  //使能串口1 
	
//	USART_ClearFlag(USART2, USART_FLAG_TC);
	
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启相关中断

	//Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口1中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;		//子优先级1
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器、	
}

void usart2_senddata(u8 *buf,u8 len)
{
	u8 t;
	for(t=0;t<len;t++)
	{
		while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET){};
		USART_SendData(USART2,buf[t]);
	}
}

void RS232_Receive_Data(u8 *buf,u16 len)
{
	u16 rxlen=len;
	u16 i=0;
	if(rxlen==RS232_RX_CNT)
	{
		for(i=0;i<rxlen;i++)
		{
			buf[i]=RS232_RX_BUF[i];
		}
	
	RS232_RX_CNT=0;
	}
}


3.2 串口2-RS485初始化

正点原子的开发板 串口2的芯片是485。

#if EN_USART2_RX   		//如果使能了接收   	  
//接收缓存区 	
u8 RS485_RX_BUF[64];  	//接收缓冲,最大64个字节.
//接收到的数据长度
u8 RS485_RX_CNT=0;   
void USART2_IRQHandler(void)
{
	u8 res;	    
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
	{	 	
	  res =USART_ReceiveData(USART2);//;读取接收到的数据USART2->DR
		if(RS485_RX_CNT<64)
		{
			RS485_RX_BUF[RS485_RX_CNT]=res;		//记录接收到的值
			RS485_RX_CNT++;						//接收数据增加1 
		} 
	}  											 
} 
#endif										 
//初始化IO 串口2
//bound:波特率	  
void RS485_Init(u32 bound)
{  	 
	
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
	
  //串口2引脚复用映射
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); //GPIOA2复用为USART2
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //GPIOA3复用为USART2
	
	//USART2    
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //GPIOA2与GPIOA3
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
	GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA2,PA3
	
	//PG8推挽输出,485模式控制  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOG8
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
	GPIO_Init(GPIOG,&GPIO_InitStructure); //初始化PG8
	

   //USART2 初始化设置
	USART_InitStructure.USART_BaudRate = bound;//波特率设置
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
  USART_Init(USART2, &USART_InitStructure); //初始化串口2
	
  USART_Cmd(USART2, ENABLE);  //使能串口 2
	
	USART_ClearFlag(USART2, USART_FLAG_TC);
	
#if EN_USART2_RX	
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启接受中断

	//Usart2 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器、

#endif	
	
	RS485_TX_EN=0;				//默认为接收模式	
}

//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
	u8 t;
	RS485_TX_EN=1;			//设置为发送模式
  	for(t=0;t<len;t++)		//循环发送数据
	{
	  while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); //等待发送结束		
    USART_SendData(USART2,buf[t]); //发送数据
	}	 
	while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); //等待发送结束		
	RS485_RX_CNT=0;	  
	RS485_TX_EN=0;				//设置为接收模式	
}
//RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)
{
	u8 rxlen=RS485_RX_CNT;
	u8 i=0;
	*len=0;				//默认为0
	delay_ms(10);		//等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
	if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
	{
		for(i=0;i<rxlen;i++)
		{
			buf[i]=RS485_RX_BUF[i];	
		}		
		*len=RS485_RX_CNT;	//记录本次数据长度
		RS485_RX_CNT=0;		//清零
	}
}

该文档修改记录:

修改时间 修改说明
2023年3月1日 第一次发布,介绍了STM32通用同步异步收发器(USART、串口)所有函数的介绍及使用

总结

以上就是2 STM32库函数之通用同步异步收发器(USART、串口)所有函数的介绍及使用的内容,本文介绍了通用同步异步收发器(USART、串口))所有函数的简单使用。
有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。
创作不容,如果文档对您有帮助,记得给个赞。

你可能感兴趣的:(介绍STM32标准库函数,stm32,单片机,嵌入式硬件)