串口通讯(Serial Communication) 简介2

电子说

1.3w人已加入

描述

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))
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分