0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

串口通讯(Serial Communication) 简介2

jf_78858299 来源:汇极星科技 作者:汇极星科技 2023-04-23 11:29 次阅读

USART校验控制

STM32F103 系列控制器 USART 支持奇偶校验。当使用校验位时,串口传输的长度将是 8 位的数据帧加上 1 位的校验位总共 9 位,此时 USART_CR1 寄存器的 M 位需要设置为 1,即 9 数据位。

将 USART_CR1 寄存器的 PCE 位置 1 就可以启动奇偶校验控制,奇偶校验由硬件自动完成启动了奇偶校验控制之后,在发送数据帧时会自动添加校验位,接收数据时自动验证校验位。接收数据时如果出现奇偶校验位验证失败,会见 USART_SR 寄存器的 PE 位置 1,并可以产生奇偶校验中断。

使能了奇偶校验控制后,每个字符帧的格式将变成:起始位 + 数据帧 + 校验位 + 停止位。

中断控制

图片

与USART配置有关的固件库函数

USART 初始化结构体

标准库函数对每个外设都建立了一个初始化结构体,比如 USART_InitTypeDef,结构体成员用于 设置外设工作参数,并由外设初始化配置函数,比如 USART_Init() 调用,这些设定参数将会设置 外设相应的寄存器,达到配置外设工作环境的目的。

初始化结构体定义在 stm32f10x_usart.h 文件中,初始化库函数定义在 stm32f10x_usart.c 文件中。

typedef struct 
{
    uint32_t USART_BaudRate; // 波特率
    uint16_t USART_WordLength; // 字长
    uint16_t USART_StopBits; // 停止位
    uint16_t USART_Parity; // 校验位
    uint16_t USART_Mode; // USART 模式
    uint16_t USART_HardwareFlowControl; // 硬件流控制
} USART_InitTypeDef;
●USART_BaudRate:波特率设置。

    一般设置为 2400、9600、19200、115200。标准库函数会根据设定值计算得到 USARTDIV 值,从而设置 USART_BRR 寄存器值。

 ●USART_WordLength:数据帧字长,可选 8 位或 9 位。

    它设定 USART_CR1 寄存器的 M 位的值。如果没有使能奇偶校验控制,一般使用 8 数据位;如果使能了奇偶校验则一般设置为 9 数据位。
#define USART_WordLength_8b                  ((uint16_t)0x0000)
#define USART_WordLength_9b                  ((uint16_t)0x1000)


#define IS_USART_WORD_LENGTH(LENGTH) (((LENGTH) == USART_WordLength_8b) || \\
                                      ((LENGTH) == USART_WordLength_9b))

● USART_StopBits:停止位设置。

停止位可选 0.5 个、1 个、1.5 个和 2 个停止位,它设定 USART_CR2寄存器的 STOP[1:0] 位的值,一般我们选择 1 个停止位。
#define USART_StopBits_1                     ((uint16_t)0x0000)
#define USART_StopBits_0_5                   ((uint16_t)0x1000)
#define USART_StopBits_2                     ((uint16_t)0x2000)
#define USART_StopBits_1_5                   ((uint16_t)0x3000)
#define IS_USART_STOPBITS(STOPBITS) (((STOPBITS) == USART_StopBits_1) || \\
                                     ((STOPBITS) == USART_StopBits_0_5) || \\
                                     ((STOPBITS) == USART_StopBits_2) || \\
                   ((STOPBITS) == USART_StopBits_1_5))

● USART_Parity:奇偶校验控制选择。

奇偶校验位可选 USART_Parity_No(无校验)、USART_Parity_Even(偶校验) 以及 USART_Parity_Odd(奇校验),它设定 USART_CR1 寄存器的 PCE 位和 PS 位的值。
#define USART_Parity_No                      ((uint16_t)0x0000)
#define USART_Parity_Even                    ((uint16_t)0x0400)
#define USART_Parity_Odd                     ((uint16_t)0x0600) 
#define IS_USART_PARITY(PARITY) (((PARITY) == USART_Parity_No) || \\
                                 ((PARITY) == USART_Parity_Even) || \\
                                 ((PARITY) == USART_Parity_Odd))

● USART_Mode:USART 模式选择。

USART的模式有 USART_Mode_Rx 和 USART_Mode_Tx,允许使用逻辑或运算选择两个,它设定 USART_CR1 寄存器的 RE 位和 TE 位。
#define USART_Mode_Rx                        ((uint16_t)0x0004)
#define USART_Mode_Tx                        ((uint16_t)0x0008)
#define IS_USART_MODE(MODE) ((((MODE) & (uint16_t)0xFFF3) == 0x00) && ((MODE) != (uint16_t)0x00))

●USART_HardwareFlowControl:硬件流控制选择。

#define USART_HardwareFlowControl_None       ((uint16_t)0x0000)
#define USART_HardwareFlowControl_RTS        ((uint16_t)0x0100)
#define USART_HardwareFlowControl_CTS        ((uint16_t)0x0200)
#define USART_HardwareFlowControl_RTS_CTS    ((uint16_t)0x0300)
#define IS_USART_HARDWARE_FLOW_CONTROL(CONTROL)\\
                              (((CONTROL) == USART_HardwareFlowControl_None) || \\
                               ((CONTROL) == USART_HardwareFlowControl_RTS) || \\
                               ((CONTROL) == USART_HardwareFlowControl_CTS) || \\
                               ((CONTROL) == USART_HardwareFlowControl_RTS_CTS))

USART 时钟初始化结构体

typedef struct 
{
    uint16_t USART_Clock; // 时钟使能控制
    uint16_t USART_CPOL; // 时钟极性
    uint16_t USART_CPHA; // 时钟相位
    uint16_t USART_LastBit; // 最尾位时钟脉冲
} USART_ClockInitTypeDef;
USART_Clock:同步模式下 SCLK 引脚上时钟输出使能控制。

    可选禁止时钟输出 (USART_Clock_Disable) 或开启时钟输出 (USART_Clock_Enable);如果使用同步模式发送,一般都需要开启时钟。它设定 USART_CR2 寄存器的 CLKEN 位的值。
#define USART_Clock_Disable                  ((uint16_t)0x0000)
#define USART_Clock_Enable                   ((uint16_t)0x0800)
#define IS_USART_CLOCK(CLOCK) (((CLOCK) == USART_Clock_Disable) || \\
                               ((CLOCK) == USART_Clock_Enable))

● USART_CPOL:同步模式下 SCLK 引脚上输出时钟极性设置。

可设置在空闲时 SCLK 引脚为低电平 (USART_CPOL_Low) 或高电平 (USART_CPOL_High)。它设定 USART_CR2 寄存器的 CPOL位的值。
#define USART_CPOL_Low                       ((uint16_t)0x0000)
#define USART_CPOL_High                      ((uint16_t)0x0400)
#define IS_USART_CPOL(CPOL) (((CPOL) == USART_CPOL_Low) || ((CPOL) == USART_CPOL_High))
USART_CPHA:同步模式下 SCLK 引脚上输出时钟相位设置。

    可设置在时钟第一个变化沿捕获数据 (USART_CPHA_1Edge) 或在时钟第二个变化沿捕获数据。它设定 USART_CR2 寄存器的CPHA 位的值。USART_CPHAUSART_CPOL 配合使用可以获得多种模式时钟关系。
#define USART_CPHA_1Edge                     ((uint16_t)0x0000)
#define USART_CPHA_2Edge                     ((uint16_t)0x0200)
#define IS_USART_CPHA(CPHA) (((CPHA) == USART_CPHA_1Edge) || ((CPHA) == USART_CPHA_2Edge))

● USART_LastBit:选择在发送最后一个数据位的时候时钟脉冲是否在 SCLK 引脚输出。

可以是不输出脉冲 (USART_LastBit_Disable)、输出脉冲 (USART_LastBit_Enable)。它设定USART_CR2 寄存器的 LBCL 位的值。
#define USART_LastBit_Disable                ((uint16_t)0x0000)
#define USART_LastBit_Enable                 ((uint16_t)0x0100)
#define IS_USART_LASTBIT(LASTBIT) (((LASTBIT) == USART_LastBit_Disable) || \\
                                   ((LASTBIT) == USART_LastBit_Enable))
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 物理层
    +关注

    关注

    1

    文章

    142

    浏览量

    34214
  • 串口通讯
    +关注

    关注

    1

    文章

    249

    浏览量

    24548
  • 串行通讯
    +关注

    关注

    2

    文章

    77

    浏览量

    16263
收藏 人收藏

    评论

    相关推荐

    Serial Communication based on Modbus Protocol

    This is my program about Serial Communication based on Modbus Protocol.And there is no errors
    发表于 11-01 09:27

    串口通讯是什么

    串口通讯目录物理层协议层USART简介代码讲解串口通讯(Serial
    发表于 08-05 06:47

    串口通讯协议简介

    1 串口通讯协议简介串口通讯(Serial Communic
    发表于 08-12 06:30

    串口通讯简介

    串口通讯简介串口通讯(Serial Communicati
    发表于 11-30 06:56

    串口通讯基本知识简介

    基本知识串口通讯 (Serial Communication)串口中断其实也是依靠判断寄存器的状态进行中断服务的通信的速率Bitrate—比
    发表于 12-08 08:30

    串口通信Serial简介

    简介按一次按钮在串口监视器输出当前状态以及一共按下按钮多少次我现在就缺一个 默认单刀双掷按钮。。按下是A状态,不安默认就是B状态代码void setup() {//开启串口通信,波特率9600
    发表于 01-11 06:08

    串口通讯协议与RS-232标准简介

    文章目录一、串口通讯协议1.简介2.物理层(1)RS-232 标准一、串口通讯协议1.
    发表于 02-15 06:03

    串口通讯串口通信协议简介

    目录一、串口二、STM32系统给上位机(win10)连续发送“hello windows!”1、接线:2、代码实现3、烧录4、串口调试一、串口串口
    发表于 02-15 07:21

    Serial Communication (COM) Dev

    the software to configure a ZigBee ZIC2410 for a Serial Communication application. In this application, when the device receives the da
    发表于 11-04 14:15 4次下载

    什么是串口通讯/同轴电缆

    什么是串口通讯/同轴电缆 串口通讯    Serial communic
    发表于 03-26 09:21 2105次阅读

    如何判断串口通讯是否正常(方法步骤详解)

    串口通讯Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。
    发表于 02-01 16:51 6.3w次阅读
    如何判断<b class='flag-5'>串口</b><b class='flag-5'>通讯</b>是否正常(方法步骤详解)

    STM32的串口通讯协议

    本文主要讲解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;介绍"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。一、串口协议1.1 串口通信协议简介
    发表于 12-24 18:37 8次下载
    STM32的<b class='flag-5'>串口</b><b class='flag-5'>通讯</b>协议

    串口通讯(Serial Communication) 简介1

    串口通讯 (Serial Communication) 是一种设备间极为常用的串行通讯方式,目前多存在于工控机及部分通信设备中。
    的头像 发表于 04-23 11:25 6361次阅读
    <b class='flag-5'>串口</b><b class='flag-5'>通讯</b>(<b class='flag-5'>Serial</b> <b class='flag-5'>Communication</b>) <b class='flag-5'>简介</b>1

    串口通讯(Serial Communication) 简介3

    串口通讯 (Serial Communication) 是一种设备间极为常用的串行通讯方式,目前多存在于工控机及部分通信设备中。
    的头像 发表于 04-23 11:30 2163次阅读
    <b class='flag-5'>串口</b><b class='flag-5'>通讯</b>(<b class='flag-5'>Serial</b> <b class='flag-5'>Communication</b>) <b class='flag-5'>简介</b>3

    串口通讯(Serial Communication) 简介4

    串口通讯 (Serial Communication) 是一种设备间极为常用的串行通讯方式,目前多存在于工控机及部分通信设备中。
    的头像 发表于 04-23 11:30 793次阅读
    <b class='flag-5'>串口</b><b class='flag-5'>通讯</b>(<b class='flag-5'>Serial</b> <b class='flag-5'>Communication</b>) <b class='flag-5'>简介</b>4