STM32学习笔记(5) 串口通讯-接收与发送
一 通信的基本概念
串口并行与串行
数电课讲过,并行速度快但占用的门电路多,耗费空间
串行速度慢但节约空间
数据通信方向
- 全双工:TX,RX同时收发数据
- 半双工:不能同时收发数据,可分时收发数据
- 单工:任何时刻都只能往某一个固定的方向传输数据
数据同步方式
同步
异步
通信速率
比特率:每秒钟传输的二进制位数,单位(bit/s)
波特率:每秒中传输的码元个数
一个码元就是一个脉冲信号,一个脉冲信号有可能携带1bit数据,也有可能携带2bit数据、4bit数据!你发送一个脉冲信号,如果就可以携带4bit数据,肯定发送速率更快啊!
那么怎么实现一个脉冲信号就能携带多个bit数据呢?就需要一定的技术了,比如设置模拟信号中信号的频率、相位、振幅啥的。举个例子:把振幅分成四种,低(00)、中(01)、高(10)、很高(11),这样我发一个脉冲信号,它的振幅是低,那就说明发送的是00(也就是2bit),它的振幅是中(01),发送的就是01(也就是2bit)……也就实现了一个脉冲信号,携带2bit的功能…(举个不恰当的例子让大家理解而已,明白啥意思就行)
再说一次,一个码元就是一个脉冲信号!波特率指的就是1秒能发送多少个码元,也就是1秒能发送多少个脉冲信号!
一个码元能携带1bit数据,那么比特率 = 波特率!
一个码元能携带2bit数据,那么比特率 = 2倍的波特率!
一个码元能携4bit数据,那么比特率 =4倍的波特率
- 一个二进制表示码元
0V——0
3.3V——1
两个二进制表示一个码元
0V——00
3V——01
6V——10
9V——11
通常情况下波特率等于比特率
二 串口通信协议
RS232标准
USB转串口
用于设备和电脑的通讯,电平转化芯片一般是CH340
串口到串口:串口一次只能发1个字节的数据( UART_SendByte())
三 串口数据包的组成
起始位 | 数据位 | 校验位 | 停止位 |
---|---|---|---|
0 | 位0—位7 | 1 |
校验位
奇校验
有效数据和校验位“1”总的个数为奇数
偶校验
偶数
四 串口的功能框图
引脚作用
TX:数据发送
RX:数据接受
SCLK:时钟,仅同步通信使用
nRTS:Request to send.请求发送
nCTS:Clear to send.允许发送
USART:S是同步。USART1~USART3都有SCLK引脚
UART:异步。无SCLK引脚
数据寄存器DR
31——9 bit | 8——0 bit |
---|---|
保留 | DR[8:0] |
- 31-9 bit:保留位,始终为1
- 8-0 bit:数据位,由TDR(发送寄存器),RDR(接收寄存器),包含发送和接受功能
五 程序流程
串口初始化结构体
typedef struct {uint32_t USART_BaudRate; //波特率 BRRuint16_t USART_WordLength; //字长 CR1_Muint16_t USART_StopBits; //停止位 CR2_STOP uint16_t USART_Parity; //校验位 CR1_PCE CR1_PSuint16_t USART_Mode; //模式选择 CR1_TE CR1_REuint16_t USART_HardwareFlowControl; //硬件流选择 CR3_CTSE,CR3_RTSE } USART_InitTypeDef;
USART_WordLength
USART_StopBits
#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)
USART_Parity
#define USART_Parity_No ((uint16_t)0x0000) #define USART_Parity_Even ((uint16_t)0x0400) #define USART_Parity_Odd ((uint16_t)0x0600)
USART_Mode
#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)
硬件流功能:当外设处于准备好的状态时,硬件启动自动控制,而不需要软件再进行干预,在串口中,当串口已经准备好接收新的数据时,硬件流自动把RTS拉低;准备发送数据前,硬件流自动检查CTS是否为低(表示是否可以发送数据)。此功能需要有RTS,CTS两个引脚。
同步时钟结构体
typedef struct
{uint16_t USART_Clock; //同步时钟 CR2_CLKENuint16_t USART_CPOL; //极性 CR2_CPOLuint16_t USART_CPHA; //相性 CR2_CPHAuint16_t USART_LastBit; //最后一个位的时钟脉冲 CR2_LBC
} USART_ClockInitTypeDef;
流程
- 初始化串口需要用到的GPIO
- 初始化串口,USART_InitTypeDef
- 中断配置(接收中断,中断优先级)
- 使能串口
- 编写发送和接收函数
- 编写中断服务函数
- 发送接收函数
/*
* @函数名:UART_SendByte(USART_TypeDef *p_USARTx, uint8_t ch)
* @功能:发送一个字节
* @入口参数:USARTx,ch(想发送的字节)
*/
static void UART_SendByte(USART_TypeDef *p_USARTx, uint8_t ch)
{/*发送一个字节的数据到USART*/USART_SendData(p_USARTx,ch);/*等待发送数据的寄存器为空*/while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);}
/*
* @函数名:UART_SendString(USART_TypeDef *p_USARTx,char *str)
* @功能:发送字符串
* @入口参数:USARTx,str(想发送的字符)
*/
void UART_SendString(USART_TypeDef *p_USARTx,char *str)
{unsigned int k=0;do{UART_SendByte(p_USARTx,*(str+k));k++;} while(*(str+k) != '\0');/*等待发送完成*/while (USART_GetFlagStatus(USART1,USART_FLAG_TC)== RESET){}
}
USART_FLAG_TC 与 USART_FLAG_TXE的区别:
USART_FLAG_TC是干嘛用的呢?
当发送移位寄存器中的1字节数据已经通过TX脚一位一位的移出去后,该标志位就会被置1,从而引发该事件的中断。所以,其实USART_FLAG_TC就是用来标志“发送移位寄存器中的数据有没有全部发送出去”这件事的。
USART_FLAG_TXE是干嘛用的呢?
当发送数据寄存器中的数据已经取完了,该标志位就会被置1,从而引发该事件的中断。所以,其实USART_FLAG_TXE就是用来标志一个事件的,通过它的值可以知道该事件有没有发生(即发送数据寄存器中的数据有没有被取走)。
对于USART_FLAG_TXE来说,只是说明数据寄存器中的数据已经被发送移位寄存器取走了(但发送移位寄存器中可能还没有启动发送过程),通过中断就可以提醒CPU可以往数据寄存器中填充数据了,发送移位寄存器中的数据往外发送的过程其实还是比较耗时的,相对于C语言代码执行时间来说,这个过程的耗时极大,所以每次发送数据寄存器中的数据被发送移位寄存器取走后,都应该产生中断来提醒CPU对该数据寄存器填写数据;
而对于USART_FLAG_TC来说,没必要每次当发送移位寄存器中的数据发送完成后都发生中断,而应该是整个串口数据帧全部发送完毕,包括最后一个字节也发送出去之后才应该开中断,这代表的就是一个数据帧发送完成事件了
六 知识重难点
当数组作函数形参时,由于形参变量和实参变量是由编译系统分配的两个不同单元。在函数调用的时发生的值传送是把实参变量的值赋予给形参变量。在用数组名作函数参数的时候,不是进行值的传送,既不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。那么数据的传输是如何实现的呢?数组名就是数组的首地址。因此在数组名作函数参数时所进行的传送知识地址传送,也就是说把实参数组的首地址赋予给形参数组名。形参数组取得该首地址之后,也就等于有了实在的数组。实际上,形参数组和实参数组为同一数组,共同拥有一段内存空间。
USART1的TX,RX通过CH340连接micro USB,所以你可以用数据线给电脑发送数据
但USART2,USART3需要额外接CH340,才能和电脑通信(PCB设计问题)
相关代码:串口的接受与发送
STM32学习笔记(5) 串口通讯-接收与发送相关推荐
- stm32学习笔记----双串口同时打开时的printf()问题
stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...
- STM32学习笔记-USART串口通信+与野火STM32F407板载ESP8266进行通信
文章目录 STM32USART介绍 STM32USART框图 第一部分 第二部分 第三部分 发送器 时序图 接收器 第四部分 软件部分: STM32通过USART与板载ESP8266通讯实验 板载WI ...
- STM32学习笔记(十) CAN通讯测试(环回模式)
1.CAN通讯的理解 想学习CAN通讯,那么要对通讯协议有一定的认知.通讯协议是指通信双方对数据传送控制的一种约定.约定中包括对数据格式,同步方式,传输速度,传送步骤,检纠错方式以及控制字符定义等问题 ...
- Qt5学习笔记之串口助手二:发送接收实现
这里写目录标题 一级目录 显示接收内容 实现发送功能 一级目录 1.定义一个串口端口的对象并实例化 2.打开按钮自动关联槽函数 #include 显示接收内容 需要手动关联槽函数 查看应该使用的信号 ...
- NXP EMDA学习(2):串口eDMA接收和发送流程详解
在单片机中,最基础的一个驱动就是串口,本文就以NXP中串口eDMA的收发为例,通过分析源代码来理解eDMA的执行过程. 参考代码:Kinetis K64 Sub-Family SDK 2.11中的ua ...
- 《STM32学习笔记》4——核心功能电路与编程(下)
接上文,文中的图片,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.蜂鸣器驱动 1.蜂鸣器介绍 2.蜂鸣器电路 3.蜂鸣器程序 二. MIDI 音乐 ...
- STM32学习笔记(15)——SPI协议
STM32学习笔记(15)--SPI协议 一.SPI协议简介 1. 物理层 2. 协议层 (1) 通讯的开始与停止 (2)时钟极性CPOL.时钟相位CPHA 二.STM32的SPI外设 1. 通讯引脚 ...
- STM32学习笔记(9)——(I2C续)读写EEPROM
STM32学习笔记(9)--(I2C续)读写EEPROM 一.概述 1. 背景介绍 2. EEPROM简介 二.AT24C02--常用的EEPROM 1. 电路原理图 2. 写操作 (1)按字节写操作 ...
- 硬件学习、高速dsp开发板制作、STM32学习笔记
1.硬件工程师成长之路(1)--元件基础_[云轩]的博客-CSDN博客_硬件工程师的成长之路 总目录:https://blog.csdn.net/weixin_44407238/category_10 ...
最新文章
- 立即终止Sleep的线程
- 便捷的flex弹性布局
- WebService和Netty的区别
- junit5 与 surefire 对接使用
- kafka metric java,jmx_exporter+prometheus+grafana实现kafka metric监控
- pythonista脚本合集_GitHub - xchenhao/You-are-Pythonista: 汇聚【Python应用】【Python实训】【Python技术分享】等等...
- Table隔行变色的JavaScript代码
- python如何只保留数字_如何查询刷卡消费有没有积分?只需用4个数字马上能查...
- 小区移动基站能否杀人于无形?
- 《Velocity 模板使用指南》中文版[转]
- python 给文本加下划线_untiy3dUGUI实现text文本下划线
- CSS调试技巧:a.class 与 a .class的区别,千万不能小看空格
- 如何压缩pdf文件的大小?
- 脚手架的安装及配置过程
- java 获取视频时间_java 获取视频时间
- 2. 监督学习之分类
- Kali使用apt-cache search搜索想要的软件包
- 计算机自动计算的条件,电脑表格怎样自动计算
- [4G/5G/6G专题基础-155]: 5G 3GPP高精确室内定位原理、AI方案概述
- 无交互作用的正交设计
热门文章
- python游戏编程培训
- 26岁那年,我创业了
- 国际数字文创产业园区助力成都打造文创名城
- Unexpected error while running MyBatis Generator. Cannot resolve classpath entry: mysql-connector-ja
- 敏捷宣言:四大核心价值观和十二条原则
- 树莓派raspberry Pi 4B安装Ubuntu 20.04 LTS系统后如何连接WiFi
- 电视常用接口(TV,AV,S-Video,YCbCr/PCbCr,VGA,Scart,DVI/HDMI)
- mixwit怀旧磁带音乐盒
- 现货黄金可以在手机操作吗
- 超有趣的Python实战:将图片转成像素风!