10.stm32f4串口 1 通信的基本概念 通信的方式可以分为多种, 按照数据传送方式可分为串行通信和并行通信。 按照通信的数据同步方式, 可分为异同通信和同步通信。 按照数据的传输方向又可分为单工、 半双工和全双工通信。 1.1.1串行通信 串行通信是指使用一条数据线, 将数据一位一位地依次传输, 每一位数据占据一个固定的时间长度。 串行通信的特点: 传输线少, 长距离传送时成本低, 且可以利用电话网等现成的设备, 但数据的传送控制比并行通信复杂。 1.1.2并行通信 并行通信通常是将数据字节的各位用多条数据线同时进行传送, 通常是 8位、 16 位、 32 位等数据一起传输。 并行通信的特点: 控制简单、 传输速度快; 由于传输线较多, 长距离传送时成本高且接收方的各位同时接收存在困难, 抗干扰能力差。 1.2.1 异步通信与同步通信 异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。 为使双方的收发协调, 要求发送和接收设备的时钟尽可能一致。异步通信是以字符(构成的帧) 为单位进行传输, 字符与字符之间的间隙(时间间隔) 是任意的, 但每个字符中的各位是以固定的时间传送的, 即字符之间不一定有“位间隔” 的整数倍的关系, 但同一字符内的各位之间的距离均为“位间隔” 的整数倍。 异步通信的特点: 不要求收发双方时钟的严格一致, 实现容易, 设备开销较小, 但每个字符要附加 2~3 位用于起止位, 各帧之间还有间隔, 因此传输效率不高。 1.2.2 同步通信 同步通信时要建立发送方时钟对接收方时钟的直接控制, 使双方达到完全同步。 此时, 传输数据的位之间的距离均为“位间隔” 的整数倍, 同时传送的字符间不留间隙, 即保持位同步关系, 也保持字符同步关系。 发送方对接收方的同步可以通过两种方法实现。 外同步和内同步 1.3 单工、 半双工与全双工通信 1.3 .1单工 单工是指数据传输仅能沿一个方向, 不能实现反向传输。 1.3 .2半单工 半双工是指数据传输可以沿两个方向, 但需要分时进行。 1.3.3全双工通信 全双工是指数据可以同时进行双向传输。 1.4通信速率 衡量通信性能的一个非常重要的参数就是通信速率, 通常以比特率(Bitrate)来表示。 比特率是每秒钟传输二进制代码的位数, 单位是: 位/ 秒(bps) 。 2 STM32F4 的 USART 介绍 串口是一种接口标准, 它规定了接口的电气标准, 没有规定接口插件电缆以及使用的协议。 串口通信(Serial Communication), 是指外设和计算机间, 通过数据信号线、地线等, 按位进行传输数据的一种通信方式, 属于串行通信方式。 2.1接口标准 有 RS-232C、 RS-232、 RS-422A、 RS-485 等。常用的就是 RS-232 和 RS-485。 RS-232C 是 EIA(美国电子工业协会) 1969 年修订 RS-232C 标准。 RS-232C定义了数据终端设备(DTE) 与数据通信设备(DCE) 之间的物理接口标准。 RS-232C 接口规定使用 25 针连接器, 简称 DB25, 连接器的尺寸及每个插针的排列位置都有明确的定义 RS-232C 接口规定使用 25 针连接器, 简称 DB25, 连接器的尺寸及每个插针的排列位置都有明确的定义
在串口通信中通常我们只使用TXD、 RXD、 SGND,其他管脚功能大家看不明白也没关系。
RS-232C 对逻辑电平也做了规定, 如下 在 TXD 和 RXD 数据线上: 1.逻辑 1 为-3~-15V 的电压 2.逻辑 0 为 3~15V 的电压 RS-232C 是用正负电压来表示逻辑状态, 与晶体管-晶体管逻辑集成电路(TTL) 以高低电平表示逻辑状态的规定正好相反。 而我们 STM32 芯片使用的就是 TTL 电平, 所以要实现STM32 与计算机的串口通信, 需要进行 TTL与 RS-232C 电平转换, 通常使用的电平转换芯片是 MAX3232 串口通信中还需要注意的是, 串口数据收发线要交叉连接, 计算机的 TXD要对应单片机的 RXD, 计算机的 RXD 要对应单片机的 TXD, 并且共 GND 2.2通信协议 RS232 的通信协议比较简单, 通常遵循 96-N-8-1 格式 96” 表示的是通信波特率为 9600。 串口通信中通常使用的是异步串口通信, 即没有时钟线, 所以两个设备要通信, 必须要保持一致的波特率, 波特率常用值还有 4800,19200、 15200 “N” 表示的是无校验位 校验方法有奇校验(odd)、 偶校验(even)、 0 校验(space)、 1 校验(mark)以及无校验(noparity) “8” 表示的是数据位数为 8 位 还有5,6,7长度可选 “1” 表示的是 1 位停止位 停止信号可由 0.5、 1、 1.5 或 2 个逻辑 1 的数据位表示, 只要双方约定一致即可。 2.2 USART 简介 USART 即通用同步异步收发器, 它能够灵活地与外部设备进行全双工数据交换, 满足外部设备对工业标准 NRZ 异步串行数据格式的要求。 UART 即通用异步收发器, 它是在 USART 基础上裁剪掉了同步通信功能。它是在 USART 基础上裁剪掉了同步通信功能。
2.3 USART 结构框图
1) 标号 1: 功能引脚 TX: 发送数据输出引脚。 RX: 接收数据输入引脚。 SW_RX: 数据接收引脚, 只用于单线和智能卡模式, 属于内部引脚, 没有具体外部引脚。 nRTS: 请求以发送(Request To Send), n 表示低电平有效。 如果使能 RTS 流控制, 当 USART 接收器准备好接收新数据时就会将 nRTS 变成低电平; 当接收寄存器已满时, nRTS 将被设置为高电平。 该引脚只适用于硬件流控制。 nCTS: 清除以发送(Clear To Send), n 表示低电平有效。 如果使能 CTS 流控制, 发送器在发送下一帧数据之前会检测 nCTS 引脚, 如果为低电平, 表示可以发送数据, 如果为高电平则在发送完当前数据帧之后停止发送。 SCLK: 发送器时钟输出引脚。 2) 标号 2: 数据寄存器 USART 数据寄存器(USART_DR)只有低 9 位有效, 并且第 9 位数据是否有效要取决于 USART 控制寄存器 1(USART_CR1)的 M 位设置, 当 M 位为 0 时表示8 位数据字长, 当 M 位为 1 表示 9 位数据字长, 我们一般使用 8 位数据字长。USART_DR 包含了已发送的数据或者接收到的数据。 USART_DR 实际是包含了两个寄存器, 一个专门用于发送的可写 TDR, 一个专门用于接收的可读 RDR。 当进行发送操作时, 往 USART_DR 写入数据会自动存储在 TDR 内; 当进行读取操作时, 向 USART_DR 读取数据会自动提取 RDR 数据。TDR 和 RDR 都是介于系统总线和移位寄存器之间。 串行通信是一个位一个位传输的, 发送时把 TDR 内容转移到发送移位寄存器, 然后把移位寄存器数据每一位发送出去, 接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到 RDR。 USART 支持 DMA 传输。 3) 标号 3: 控制器 USART 有专门控制发送的发送器、 控制接收的接收器, 还有唤醒单、 中断控制等等。 使用 USART 之前需要向 USART_CR1 寄存器的 UE 位置 1 使能USART。 发送或者接收数据字长可选 8 位或 9 位, 由 USART_CR1 的 M 位控制。 1.发送器 发送器可发送 8 位或 9 位的数据, 具体取决于 M 位的状态。 发送使能位(TE) 置 1 时, 发送移位寄存器中的数据在 TX 引脚输出, 如果是同步通信模式,相应的时钟脉冲在 SCLK 引脚输出 2.接收器 如果将 USART_CR1 寄存器的 RE 位置 1, 使能 USART 接收, 使得接收器在RX 线开始搜索起始位。 在确定到起始位后就根据 RX 线电平状态把数据存放在接收移位寄存器内。 接收完成后就把接收移位寄存器数据移到 RDR 内, 并把USART_SR 寄存器的 RXNE 位置 1, 同时如果 USART_CR2 寄存器的 RXNEIE 置 1的话可以产生中断 3.中断控制
4) 标号 4: 小数波特率生成 波特率的概念在前面介绍比特率的时候已经提过, 常用的串口通信中都把波特率当作比特率。 波特率越大, 传输速度就越快。
3 USART 串口通信配置步骤 USART 相关库函数在 stm32f4xx_usart.c 和 stm32f4xx_usart.h 文件中 1) 使能串口时钟及 GPIO 端口时钟 串口 1 和串口 6 挂接在 APB2 总线上, 串口 2-串口 5 挂接在 APB1 总线上, 根据自己所用串口使能总线时钟和端口时钟。 例如使用 USART1, 其挂接在 APB2 总线上, 并且USART1 对应 STM32F407ZGT6 芯片管脚的 PA9 和 PA10, 因此使能时钟函数如下 2) 设置引脚复用器映射 USART1 是在 PA9 和 PA10 引脚上 3) GPIO 端口模式设置, 设置串口对应的引脚为复用功能 4) 初始化串口参数, 包含波特率、 字长、 奇偶校验等参数 USART_BaudRate: 波特率设置。 USART_WordLength: 数据帧字长。 USART_StopBits: 停止位设置。 USART_Parity: 奇偶校验控制选择。 USART_Mode: USART 模式选择。 USART_HardwareFlowControl: 硬件流控制选择。 5) 使能串口 例如要使能 USART1, 6) 设置串口中断类型并使能 第一个参数用来选择串口, 第二个参数用来选择串口中断类型, 第三个参数用来使能或者失能对应中断。 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断 对应的串口中断类型可在 stm32f4xx_usart.h 中查找到
7) 设置串口中断优先级, 使能串口中断通道 8) 编写串口中断服务函数 USART1 中断函数名USART1_IRQHandler 库函数中用来读取串口中断状态标志位的函数 串口接收函数是: 串口发送函数是: 函数用来读取串口状态标志位 USART_GetITStatus 与 USART_GetFlagStatus 功 能 类 似 , 区 别 就 是SART_GetITStatus 函数会先判断是否使能串口中断, 使能后才读取状态标志,而 USART_GetFlagStatus 函数直接读取状态标志。 4 硬件设计 CH340 芯片把 STM32F4 的串口 1 与 PC 机的USB 口进行连接, 实现串口通信。 ch340的RX接单片机串口TXch340的TX接单片机串口RX 5 软件设计 (1) 初始化 USART1, 并使能串口接收中断等 USART1_Init()函数中, 首先使能 USART1 串口及端口时钟, 将 PA9、 PA10管脚映射到对应的串口功能, 并初始化 GPIO 为复用功能。 其次配置串口结构体USART_InitTypeDef, 使能串口并开启接收中断, 为了防止串口发送状态标志位的影响, 我们清除下串口状态标志位(TC) , 最后配置相应的 NVIC 并使能对应中断通道, 我们将 USART1 的抢占优先级设置为 3, 响应优先级设置为 3。USART1_Init()函数有一个参数 bound, 用来设置 USART1 串口的波特率 (2) 编写 USART1 中断函数 (3) 编写主函数 6 实验现象 D1 指示灯不断闪烁,串口会把接收到的数据发送出去
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/61750.html