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_cpha 与 usart_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))
【C语言进阶】C语言指针的高阶用法
这趟“高效节能”车没有老司机,全靠英飞凌功率技术带你飞!
池塘养殖溶解氧变化本质
北峰通信PDT手持终端机全面技术升级,融合全新功能应用
关于聚合物锂电池浆料干法混料工艺的分析
串口通讯(Serial Communication) 简介2
当设计物理层调制解调器时,如何满足AISG v3.0标准要求
2021年全球笔记本电脑出货量有望超2.17亿台
三星发布植物照明高光子效率全光谱LED器件
Synaptics展示不一样的触控技术
机器学习之特征提取 VS 特征选择
SiC MOSFET电动汽车牵引逆变器设计
华为WatchGT2正式发布 售价229欧元起
2017年的物联网安全还将面临哪些挑战?
关于STM32G0将会在今年爆发吗?
聚焦智能传感,为工业气体安全保驾护航
紫晶存储发布光存储数据报告 光存储具有独到的优势
三星Note7“炸机” 创新不受影响 S8背水一战
5G+工业互联网存在的问题与解决方法
通过微控制器集成能量消除物联网设备电池更换需求