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复用为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数据库中创建了联合索引(或称复合索引,即包含…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...
