网站建设南阳/网站代运营推广
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复用为USART1GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1//USART1端口配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHzGPIO_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); //初始化串口1USART_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;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3NVIC_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 RXGPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_USART2); //GPIOD5复用为USART2GPIO_PinAFConfig(GPIOD,GPIO_PinSource6,GPIO_AF_USART2); //GPIOD6复用为USART2GPIO_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;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority =1; //子优先级1NVIC_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->DRif(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复用为USART2GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //GPIOA3复用为USART2//USART2 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //GPIOA2与GPIOA3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHzGPIO_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; //GPIOG8GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHzGPIO_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); //初始化串口2USART_Cmd(USART2, ENABLE); //使能串口 2USART_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;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3NVIC_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; //默认为0delay_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、串口))所有函数的简单使用。
有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。
创作不容,如果文档对您有帮助,记得给个赞。
相关文章:

2 STM32库函数 之 通用同步异步收发器(USART、串口)所有函数的介绍及使用
2 STM32库函数 之 通用同步异步收发器(USART、串口)所有函数的介绍及使用 前言一、USART固件库函数预览二、USART固件库函数具体介绍2.1 库函数 USART_DeInit2.2 库函数 USART_Init2.2.1 USART_InitTypeDef structure2.2.2 USART_InitTypeDef 成员 USART…...

SpringCloudAlibaba整合Sentinel实现流量控制熔断降级
目录 一、概念 二、整合Sentinel控制台 三、Sentinel规则配置 四、@SentinelResource资源保护注解...

CentOS 7安装 Postgre
零、前置条件 系统CentOS 7,并已联网,已安装gcc或者g编译器,GNU make版本3.80或以上,系统有至少一个除root之外的普通用户user gcc安装-参考链接查看make命令的版本——make --version更新make版本-参考链接postgresql的使用一般…...

rpc 异步非阻塞 io 配置 线程池和队列
相关 雪崩 - 如何重试 - sla和重试风暴的双保证_个人渣记录仅为自己搜索用的博客-CSDN博客 接口耗时公式 耗时 cpu时间 io时间 线程池数量 最佳数目 1s / 平均cpu时间 * 内核数. 最大平均cpu时间 接口耗时- all外部io时间. 结合gc , linux本身其他线程, 只会还少点. …...

【Turfjs的java版本JTS】前面讲了Turfjs可以实现几何计算,空间计算的功能,如果后端要做这项功能也有类似的类库,JTS
JTS Java Topology Suite 几何计算: 1. 前端js就用这个 Turfjs的类库。参考网站: 计算两线段相交点 | Turf.js中文网 2. 后端java语言就可以用 JTS这个类库,参考网站: JTS参考网站: 1. https://github.com/locatio…...

从Window中先多瞥几眼
JavaFx17官方文档中有如下的描述: Window类是一个顶层窗口类,在其中可以承载场景,并与用户交互。窗口可以是Stage、PopupWindow或其他类似的顶层窗口。 JavaFX Stage类是顶级的JavaFX容器。初级阶段由平台搭建。其他Stage对象可以由应用程序构造。 许多Stage属性是只读的…...

【STM32训练—WiFi模块】第二篇、STM32驱动ESP8266WiFi模块获取天气
目录 第一部分、前言 1、获取心知天气API接口 2、硬件准备 第二部分、电脑串口助手调试WIFI模块获取天气 1、ESP8266获取天气的流程 2、具体步骤 第三部分、STM32驱动ESP8266模块获取天气数据 1、天气数据的解析 1.1、什么函数来解析天气数据? 2.1、解析后…...

Maven私服
Maven 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。 建立了 Maven 私服后,当局域网内的用户需要某个构件时,会按照如下顺序进行请求…...

手写RPC总结篇
协议制定:client到server做交互的通信协议,比如request response 网络端点peer 难点1 : Jetty嵌入 ◆jetty Server ◆ServletContextHandler ◆ServletHolder jetty server 起到网络监听的作用ServletContextHandler注册到jetty server中ServletHolde…...

c++11 标准模板(STL)(std::ios_base)成员类型与常量
流打开模式类型 std::ios_base::openmode typedef /*implementation defined*/ openmode; static constexpr openmode app /*implementation defined*/ static constexpr openmode binary /*implementation defined*/ static constexpr openmode in /*implementation defi…...

我用 ChatGPT 写 2023 高考语文作文:全国卷(一)
【2023】新高考|卷 “好的故事,可以帮我们更好地表达和沟通,可以触动心灵、启迪智慧:好的故事以改变一个人的命运,可以展现一个民族的形象故事是有力量的。” 以上材料引发了你怎样的联想和思考?请写一篇文章 要求&…...

4.java转义符,javadoc 标签
java常用转义字符 在控制台,输入tab键,可以实现命令补全 (如何解决cmd中Tab键不能自动补充的问题?百度一下) \t : 一个制表符,实现对齐功能\n : 换行符\ \ : 一个\\ " :一个"\ ’ : 一个’\r : 一个回车 …...

PinYin4j库的使用
一、PinYin4j库简介 1、PinYin4j简介 Pinyin4j 是一个流行的 Java 库,支持汉字和大多数流行的拼音系统之间的转换(汉语拼音,罗马拼音等)。可自定义拼音输出格式,功能强大。 官网地址:http://pinyin4j.sou…...

日志框架 --- Logback
文章目录 1. 什么是logback2. logback的日志级别3. 日志级别的层级4. logback配置文件4.1 logger标签4.2 root标签4.3 appender标签4.4 filter标签4.5 encoder标签 5. 整体演示5.1 配置文件5.2 运行结果 1. 什么是logback Logback是一个用于Java应用程序的日志框架,…...

QML 与 Python 交互
在 Qt 中,C 和 QML 交互一般有如下三种方法 上下文属性:setContextProperty( )向引擎注册类型:调用 qmlRegisterType( )QML 扩展插件:虽然有很大的灵活性,但是用 Python 创建 QML 插件比较麻烦,所以这种方法…...

React基础教程(三):JSX语法
React基础教程(三):JSX语法 1、JSX简介 全称:JavaScript XMLreact定义的一种类似于XML的JS扩展语法:JSXML本质是React.createElement(component, props, ...children)方法的语法糖作用:用来简化创建虚拟DOM(注意&…...

软件测试岗位都是女孩子在做吗?
听我一朋友说,测试岗位基本都是女孩子做。” 不知道是不是以前“软件测试岗”给人印象是“不需要太多技术含量”的错觉,从而大部分外行认为从业软件测试的人员中女生应占了大多数。比如有人就觉得:软件测试主要是细心活,所以女生…...

ARP协议,带你了解ARP协议
目录 一、ARP协议概述 二、使用ARP的四种情况 三、ARP缓存 四、ARP的工作原理 1. 地址解析 2. 地址缓存 五、ARP报文格式 1. ARP请求报文格式 2. ARP响应报文格式 六、免费ARP 七、代理ARP 一、ARP协议概述 ARP(Address Resolution Protocol)地…...

基于Java汽车客运站管理系统设计实现(源码+lw+部署文档+讲解等)
博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…...

0203使用规则-索引-MySQL
文章目录 1 联合索引1.1 最左前缀法则1.2 范围查询 2 索引失效2.1 常见情况2.2 数据分布影响 3 SQL提示4 覆盖索引和回表查询5 前缀索引6 单列和联合索引7 设计原则结语 1 联合索引 1.1 最左前缀法则 在Mysql数据库中创建了联合索引(或称复合索引,即包含…...

LVS+Keepalived群集
一、Keepalived概述 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。 在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,…...

抖音矩阵系统源代码开发部署--源码搭建
抖音矩阵系统是一个具有强大功能的开放性平台,通过数据挖掘技术能够实现精准的用户画像和个性化推荐,这也是抖音成为国内最受欢迎的短视频平台之一的原因之一。矩阵系统的开发需要大量的技术支持和数据分析,同时也需要综合运用大数据、机器学…...

如何用Jmeter进行接口测试 ,这应该是全网最详细的教程了
一、Jmeter 的使用步骤 打开Jmeter 安装包,进入\bin 中,找到"jmeter.bat", 点击打开即可。 在下图打开的Jmeter 页面中,右键“测试计划” -> “添加” -> "Threads(Users)" -> “线程组”, 建立线…...

C语言---malloc(0)会产生什么结果,真的是空指针吗?
前言 (1)几天前在一个交流群中看到有人说,面试问malloc(0)会怎么样是真的恶心。 (2)这个突然激起了我的好奇心。居然还可以malloc(0)?! (3)经过测试最后,发现…...

建模助手618 | 谁不囤点Revit插件我都会生气!
大家好,这里是建模助手。 早在5月份,我们已经就“618”这个事情高调了一番,以提前放“价”的姿势,让许多用户以躺赢的状态拉开了年中大促的序幕。(5月购买的盆友,切记看完全文,内附彩蛋 活动反…...

【“职场程序员是否会保护自己的隐私?为何要求程序员之间保密薪资?”】
职场程序员之间确实有一些秘密,其中之一便是对薪资保密。这并非完全是程序员们的独立行为,而是因为一些公司或组织规定员工之间不能互相透露薪水信息。 第一个原因是保护公司自身利益。如果一个程序员知道其他同事的薪资水平比自己高,他可能…...

企业工程管理系统源码之提高工程项目管理软件的效率
高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中,管理不畅以及不良的项目执行,往往会导致项目延期、成本上升、回款拖后,最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统,确保…...

创新指南 | 推动销售的17个可落地的集客式营销示例
无论您是开启集客式的营销有一段时间还是处于起步阶段,了解像您这样的企业是如何粉碎竞争对手的的集客式策略总是有帮助的。无论您的公司做什么,它所服务的行业,是B2B还是B2C ,您都可以在这里找到许多可以使用的示例。 在本文中&…...

ASEMI代理光宝光耦LTV-0314的应用与优势
编辑-Z 在电子设备的设计和制造过程中,光耦合器是一种至关重要的组件。它们在电路中起到隔离作用,保护电子设备免受电压冲击和电流过载的影响。今天,我们将深入探讨一种特殊的光耦合器——LTV-0314,它的特性、应用以及优势。 一、…...

Apikit 自学日记: Apikit 如何发起测试
进入 API 文档详情页,点击上方 测试 标签,进入 API 测试页,系统会根据API文档自动生成测试界面并且填充测试数据。 填写请求参数 首先填写好请求参数。 请求头部 您可以输入或导入请求头部。批量导入的数据格式为 key : value ,…...