--单片机概述+STM32开发环境搭建+创建工程
--STM32-GPIO(重点)编程
--STM32-USART串口应用
--STM32-SPI(液晶屏)+中断系统
--STM32-时钟系统(重点中的重点)
--STM32-PWM+ADC
--STM32-DMA + DHT11
1. 计算机组成原理
1.1 计算 机 的组成
- CPU
控制器:整个计算机的控制中心
运算器:处理计算和数据
- 存储器
ROM(Read Only Memery):
程序存储器,只读存储器,掉电不丢失数据,存储介质flash闪存
RAM(RAndom Memery):
内存、掉电丢失数据,存储介质SRAM
-
输入:将其他信号转换为电信号。
-
输出:将电信号(0、1)转为人或其他设备能理解的信号。
1.2 IO 逻辑
数据在计算机系统中的存储,传输,运算都是以二进制的形式进行的。
数据的传输其实通过数据总线真正传递的是电信号,也就是高低电平。
计算机系统中的高低电平逻辑1和0。
电压:电压差 电势差
1 . 3 存储器
Cache(高速缓冲存储器)的作用
- 提高访问速度:缓存是一种小而高速的存储器,用于存储最近或频繁使用的数据。由于缓存的访问速度比主存(如RAM)快很多,它能显著减少CPU等待数据的时间,从而提高系统性能。
- 减少内存延迟:当处理器需要访问数据时,如果数据在缓存中,可以快速获取,而不需要花费较长时间去访问主存。这大大减少了内存延迟。
- 提高吞吐量:通过减少内存访问延迟和提高访问速度,缓存能够提高整体系统的吞吐量,使CPU能够更高效地执行更多指令。
1 . 4 总线 ( 重点理解)
总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类
计算机的总线可以划分为数据总线、地址总线和控制总线
分别用来传输数据、数据地址和控制信号
- 地址总线
(1)CPU是通过地址总线来指定存储单元的
(2)地址总线决定了cpu所能访问的最大内存空间的大小
如: 10根地址线能访问的最大的内存为1024位二进制数据(1024个内存单元)
(3)地址总线是地址线数量之和
- 数据总线
(1)是CPU与内存或其他器件之间的数据传送的通道。
(2)数据总线的宽度决定了CPU和外界的数据传送速度。
(3)每条传输线一次只能传输1位二进制数据。
如: 8根数据线一次可传送一个8位二进制数据(即一个字节)。
(4)数据总线是数据线数量之和。
- 控制总线
(1)CPU通过控制总线对外部器件进行控制。
(2)控制总线的宽度决定了CPU对外部器件的控制能力。
(3)控制总线是控制线数量之和。
总结:
数据总线:宽度决定CPU一次传输数据的数据量
地址总线:决定了CPU的寻址能力
控制总线:CPU对外部器件的控制能力。
2. 单片机基础 ( 掌握)
2 . 1 什么 是 单片机
单片机是单片微型计算机的简称,MCU是Microcontroller的简称,也就是嵌入式微控制器。采用集成电路技术将具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、定时器/计时器、多种I/O口和中断系统等功能集成到一块硅片上。
可以说单片机就是一个小而完善的微型计算机系统。
SOC(SYStem on Chip):定制版的单片机
2.2 单片机 的型号
51单片机(8位)
AT89C51 ATMEL STC89C51 宏晶科技STC
TI公司
MSP430(16位)
32单片机(32位)
STM32 ST意法半导体 GD32 兆易创新GD
2.3 8位和32位的区别?
2.4 开发板/最小系统板
开发板通常是学习用途,功能比较全,接口丰富,是用于研发、研究、学习的一块板子。
在后面学习底层的时候会用到,这里不过多介绍了,咱们主要看下咱们32要用到的板子
最小系统板是个核心板,集成了核心的通用功能,可以根据需求定制各种不同的底板,通用性较好。再者核心板作为一块独立的模块被分离出来,也降低了开发的难度,增加了系统的稳定性和可维护性通常用于做项目,也可以作为模块在产品里在直接用。
3. STM32
3 . 1 简介
STM32是意法半导体公司生成的一款32位的微控制器。
ST公司用ARM设计的内核,完善周围电路、增加外设,再进行封装成STM32。
STM32的功能强大,性能优异,片上资源丰富,低功耗,是一款经典的微型控制器。
3 . 2 命名 规范
STM32G030C8T6 基于ARM的Cortex M0+内核。
|------|-----------------------------------------------------------------------------------------------------|
| ST | 意法半导体 |
| M | 微控制器(microcotroller) |
| 32 | 32位处理器 |
| 类型 | F 通用/基础型 foundation G 多用途型 general-purpose L 低功耗 low power H 高性能 High performance S 简单/标准型 Standard |
| 系列 | 0 精简系列 1/2/3 增强系列 4/7 高性能系列 |
| 子型号 | 00/01/02/03/05/0 |
| 引脚数量 | K/6-32脚 C/8-48脚 R-64脚 V-100脚 Z-144脚 A-168脚 I-176脚 B-208脚 N-216脚 |
| 存储量 | 6 : 32KB 8 : 64KB B :128KB C :256KB D : 384KB E : 512KB G : 1MB I : 2MB |
| 封装 | U - UQFN封装 T - TQFP封装(这个从单片机上是可以看出来的,从中间过是U型,从低下过是T型) |
| 工作温度 | 6 - -40 ~ 85度 |
3 . 3 STM 3 2 的优势
STM32 | 产品 | STM32 | MCU单片机 | 意法半导体STM | STMCU中文官网
- 产品型号丰富,可选择强
- 运算速度快,功耗低
- 处理器接口丰富
- 库函数开发体系完整
- 应用广泛
4. STM32G030系统架构 ( 掌握)
4.1 架构理解与对比
STM32G0
STM32F0
系统主要由以下几个模块组成 :
● 二个主模块 :
-- Cortex-M0+ 内核及先进高性能总线 (AHB bus)
-- 通用 DMA (通用的直接存储器存取)
● 三个从模块 :
-- 内部 FLASH
-- 内部SRAM
-- AHB和AHB到APB的连接桥,挂在APB总线上和AHB的外设
5. ARM 体系架构
面试题
从"英国苹果"到RISC芯片王者------ARM的前世今生之完整追溯 (baidu.com)
什么是ARM ?
ARM是一家公司,只做技术服务(知识产权),设计ARM架构,不产芯片也不出售芯片。
ARM处理器内核,ARM处理器是英国Acorn有限公司设计的低功耗低成本的第一款RISC的微处理器,经典处理器 ARM7\ARM9\ARM11,后续处理器(16年)开始以cortex命名。
COTEX------A: 高性能的内核(平板,手机,电脑)
Cortex-A5:低功耗,适合入门级应用。
Cortex-A7:高能效,广泛应用于智能手机。
Cortex-A9:高性能,应用广泛。
Cortex-A15:高性能,用于更高端的设备。
Cortex-A53:64位处理器,注重功耗与性能平衡。
Cortex-A57:高性能64位处理器。
Cortex-A72:用于旗舰级设备。
Cortex-A75、Cortex-A76、Cortex-A77、Cortex-A78:不断提升的性能和能
Cortex------R:实时性要求较高的场景(航天,汽车,导弹,坦克)
Cortex-R4:适用于高性能实时应用。
Cortex-R5:增强的实时性能。
Cortex-R7:更高的性能和确定性。
Cortex-R8:最新的实时处理器,提供更高的性能和安全性。
Cortex------M:低成本低功耗的解决方案(嵌入式系统当中)
Cortex-M0:超低功耗,适合简单应用。
Cortex-M0+:进一步降低功耗并提高性能。
Cortex-M3:平衡性能和能效,用于多种嵌入式应用。
Cortex-M4:增加DSP功能,适用于信号处理应用。
Cortex-M7:最高性能的Cortex-M处理器,适用于复杂的嵌入式系统。
Cortex-M23:基于ARMv8-M架构,支持TrustZone安全特性。
Cortex-M33:更高的性能和安全性,适用于高级嵌入式应用。
Cortex------X:超高性能
主要针对高端智能手机、平板电脑、笔记本电脑和其他需要高计算能力和能效的设备。
这些芯片的设计目标是提供领先的单线程性能和整体系统性能。
Cortex-X1:
首款Cortex-X系列产品,于2020年发布。
相较于Cortex-A77,性能提升了约30%。
Cortex-X2:
2021年发布,基于ARMv9架构。
提供进一步的性能提升,并改进了机器学习和安全功能
- ARM是一款指令集
能够指挥处理器完成相应功能的命令的集合
5.1 什么 是指令集 呢 ?
指令:能够指挥处理器完成相应功能的命令(+,-)
指令集:指令的集合
指令在程序中的作用
在程序中,指令的组合形成了一系列步骤,每个步骤执行特定的操作,从而完成整个程序的功能。通过有序地执行这些指令,处理器可以实现从简单的数学运算到复杂的逻辑控制、数据处理、设备管理等各种任务。
5.2 指令的分类 ( 掌握)
RISC(Reduce)精简指令集
精简指令集(RISC)-->微处理器
只保留常用的的简单指令,硬件结构简单,复杂操作一般通过简单指令的组合实现,一般指令长度固定,且多为单周期指令。
RISC处理器在功耗、体积、价格等方面有很大优势,所以在嵌入式移动终端领域应用极为广泛
优点:便宜,体积小,功耗低,指令简短,对散热的要求不高
缺点:没办法处理复杂的指令,性能差
CISC(Complex)复杂指令集
复杂指令集(CISC)-->电脑CPU
不仅包含了常用指令,还包含了很多不常用的特殊指令,硬件结构复杂,指令条数较多,一般指令长度和周期都不固定
CISC处理器在性能上有很大优势,多用于PC及服务器等领域
优点:性能好,运算速度快
缺点:CPU设计复杂,体积大,功耗高,成本高,散热要求高。
5.3 ARM 是 一款 精简指令 集
ARM指令集:所有指令(机器码),都专用32bit存储空间,代码灵活,指令简洁,执行ARM指令PC每次自加4
Thumb指令集:所有指令(机器码),都专用16bit存储空间,代码灵活,指令简洁,执行ARM指令PC每次自加2
6. Cortex-M0+内核架构
Cortex-M0+ 微处理器主要包括处理器内核、嵌套向量中断控制器(NVIC)、调试子系统、内部总线系统构成。Cortex-M0+ 微处理器通过精简的高性能总线(AHB-LITE)与外部进行通信。
6.1 Cortex-M0+ 特性
- 采用Thumb指令集 (ARM指令是32位的,而Thumb指令时16位的,如果存储空间中可以放32条ARM指令,就可以放64条Thumb指令,因此在存放Thunb指令时,代码密度高)
- 高性能,使用ARMv6-M的体系架构;
- 中断数量可配置1-32个,4级中断优先级
- 门电路少,低功耗 中断唤醒控制器(WIC),支持极低功耗休眠模式(直接掉电休眠)
- 兼容性好 与Cortex-M1 处理器兼容,向上兼容 Cortex-M3 和 Cortex-M4 处理器 ,(可兼容对于程序员非常友好,所以这一点也是很好用的)可以很容易地升级、移植。
- 支持多种嵌入式操作系统(),很简单的操作一同(RTOS),也被多种开发组件支持(包括 MDK(ARM Keil 微控制器开发套件)、RVDS(ARM RealView 开发组件)、IAR C 编译器等。)
6.2 Cortex-M0+工作模式
线程模式:芯片复位之后,执行普通代码,用户程序。
6 .3 Cortex-M0+工作 状态
Thumb状态:程序正常运行的状态
调试状态:调试程序的时候你处理器的状态。
6 .4 Cortex-M0+ 指令集
ARM处理器支持两种指令集:ARM 和 Thumb。
EPSR寄存器的T标志位负责指令集的切换,Cortex-M0只支持Thumb指令。
ARM指令集 32位精简指令集; 指令长度固定;
降低编码数量产生的耗费,减轻解码和流水线的负担;
Thumb指令集指令宽度16位,是ARM指令集的一个子集;
与32位指令集相比,大大节省了系统的存储空间;(密度高)
Thumb指令集不完整,所以必须配合ARM指令集一同使用
6 .5 Cortex-M0的寄存器 ( 了解)
R0-R12 :13个通用寄存器。其中 R0-R7为低端寄存器,可作为16位或32 位指令操作数,R8-R12为高端寄存器,只能用作32位操作数
R13 :栈指针寄存器 SP(the stark pointer),Cortex-M0+ 在不同物理位置上存在两个栈指针,主栈指针 MSP,进程栈指针 PSP。
在处理模式(异常、中断)下,只能使用主堆栈,在线程模式下,可以使用主堆栈也可以使用进程堆栈指针。 系统上电的默认栈指针是MSP。这样设计的目的是为了在进行模式转换的时候,减少堆栈的保存工作。同时也可以为不同权限的工作模式设置不同的堆栈。
R14 :链接寄存器LR(the link register),用于存储子程序或者函数调用的返回地址。
R15 :程序计数器PC(the program counter register)存储下一条将要执行的指令的地址。
特殊寄存器
xPSR :组合程序状态寄存器,由三个程序状态寄存器组成
应用PSR(APSR) :保存程序计算结果的状态标志
N负数标志 Z零标志 C进位借位标志 V溢出标志
中断PSR(IPSR) :包含当前ISR(中断状态寄存器)(中断服务程序)的异常编号
执行PSR(EPSR) :包含Thumb状态位(T位的标志可以采用哪种指令,MO+支持两种指令集的切换。
7. GPIO
1. 基本概念
G030GPIO所在的位置
GPIO的全称是General purpose input output:通用的输入输出接口
GPIO是嵌入式系统、单片机开发中最常用的接口,用户可以通过编程灵活的对接口进行控制,实现对电路板上LED、数码管、按键等常用设备控制驱动,也可以作为串口的数据收发管脚,或AD的接口等复用功能使用,其作用和功能是非常重要的。
2. 实际应用
input------输入------数据采集,各种传感器,按键
output------输出------输出控制 LED灯,数码管,LCD
3. 功能描述
4.功能框图
VDD:元器件内部的电压(3.3v)
VSS:公共地线
VCC:接入电路的电压
施密特触发器
- 去除噪声
由于外部输入的电信号,可能会出现脉冲等噪声的影响,为了让信号更加清晰,所以就设置了TTL施密特触发器来进行整形。
- 波形整形
会自动化过滤掉不稳定的波形
- 提高抗干扰能力
由于施密特触发器具有滞回效应,它能够提高电路的抗干扰能力。即便输入信号存在一定程度的抖动或者噪声,施密特触发器仍能保持稳定的输出状态。
5. GPIO 基本功能
5 . 1 输入功能
浮空输入
IO------施密特触发器------输入数据寄存器------CPU读取数据
让上下拉电阻都不接入电路 通俗讲就是让管脚什么都不接,悬空着。
此时VDD和VSS所在路径的两个开关同时断开。因为没有上拉和下拉,所以当IO口没有接输入的时候,此时的电平状态会是一个不确定的值,完全由外部输入决定。
由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的,易受干扰。
优点:输入的电平完全由外界决定,与内部电路无关
缺点:没有外接电路介入的时候,IO引脚浮空,电平不稳定
上拉 输入
相比于浮空输入接入上拉电阻,在没有信号的时候,IO口识别的都是高电平。
IO------上拉电阻------施密特触发器------输入数据寄存器------CPU读取
当没有信号输入时,IO口识别的都是高电平,当外部电路输入的信号不稳定时,上拉电阻就会将输入的信号拉高,此时引脚始终读到高电平信号。(首先以外部为主)
优点:外界无输入时,电平被稳定在高电平
应用:在电平信号不稳定时
下拉输入
下拉电阻接入电路,在没有信号的时候,IO口识别的都是低电平。
IO------下拉电阻------施密特触发器------输入数据寄存器------CPU读取。
输入的电平不会因上下浮动而导致输入信号不稳定,当外部没有信号输入时,下拉电阻会将输入信号钳在低电平,此时引脚始终读到低电平信号。
模拟输入
IO------片上外设
信号进入后不经过上拉电阻或者下拉电阻,关闭施密特触发器,经由另一线路把电压信号传送到片上外设模块,所以可以理解为模拟输入的信号是未经处理的信号,是原汁原味的信号。
应用: ADC
模拟信号和数字信号有什么区别呢
- 时间连续性
模拟信号是连续的
数字信号是离散的
- 传输方式上
模拟信号使用模拟量来表示电压信号
数字信号通过0/1构成的数据流来表示的
- 保密性
数字信号的保密性更强
模拟信号保密性更差
5 . 2 输出功能
推挽输出
推挽:描述电流的动作
推: N_MOS关闭,P_MOS打开,电流从内部的VDD给外部供电,电流从内部流向外部。
推出去。
挽: N_MOS打开,P_MOS关闭,电流从外部流进来,挽回来·。
输出数据寄存器'1'------>输出控制'0'------>PMOS激活
输出数据寄存器'0'------>输出控制'1'------>NMOS激活
输出寄存器上的'0'激活N-MOS,而输出寄存器上的'1'将激活P-MOS。
具备输出高低电平的能力。
推挽输出就是可以需要利用两个不同的MOS管来实现输出。
推挽输出模式下(P-MOS管+N-MOS管),通过设置位设置/清除寄存器或者输出数据寄存器的值,途经P-MOS管和N-MOS管,最终输出到I/O端口。
一般最常用的输出方式,既能输出高电平也能输出低电平。
开漏输出
在开漏模式下,只能输出低电平。输出引脚可以有两种状态:
- 低电平状态(逻辑0):当内部晶体管导通时(开关闭合),引脚被拉到地电位,输出为低电平(0V或接近0V)。
- 高阻态(逻辑1):当内部晶体管不导通时(开关断开),引脚处于高阻态。外部上拉电阻将引脚电压拉高到Vcc(电源电压),输出为高电平。
特点:
虽然我们可以看到开漏输出是没有办法在内部输出一个高电平,但是这一个看似是缺点。其实实际上是一种优点。当给一个低电平的时候,MOS管没有导通,此时电压不确定导致无法输出高电平,但是一旦我们在外部增加一个上拉,那么这一个缺点就会被有效避免。并且,因为是我们自己设计一个上拉,这个上拉的电压是由我们自己确定,这样我们就可以根据外部电路需要多少V的高电平来给这一个上拉的电压,可以更好的适应更多情况。如下图,我们可以给定任意的VDD电压,来适应我们实际所需要的情况。
5 . 3 推挽输出 与开漏输出 区别
6 . GPIO 的寄存器
寄存器 地址
使能时钟的地址
7. 实验一
7.1 实验要求
点亮LED灯
7.2 实验分析
- 查看实物------》找到丝印
- 查看原理图,找到连接的引脚
- 点亮灯
7.3 实验过程
- 找丝印
- 查看原理图
- 寄存器配置
7.4 代码实现
纯 C语言
如果启动文件有问题,新建文件夹
int` `main(void)`
`{`
`//配置时钟使能`
`*(unsigned` `int` `*)0x40021034` `|=` `1<<1;`
`//端口模式`
`*(unsigned` `int` `*)0x50000400` `&=~(1<<1);`
`*(unsigned` `int` `*)0x50000400` `|=` `1<<0;`
`//输出类型`
`*(unsigned` `int` `*)0x50000404` `&=~(1<<0);`
`//输出数据`
`*(unsigned` `int` `*)0x50000414` `&=~(1<<0);`
`while(1)`
`{`
`}`
`}
c程序优化
typedef struct{`
` unsigned int MODER;`
` unsigned int OTYPER;`
` unsigned int XXXX;`
` unsigned int PUPDR;`
` unsigned int YYYY;`
` unsigned int ODR;`
`}GPIO;`
`#define GPIOB (*(GPIO *)0X50000400)`
`#define RCC_GPIOB *(unsigned int *)0x40021034`
`int main(void)`
`{`
` RCC_GPIOB |= 1<<1;`
` GPIOB.MODER &= ~(1<<1);`
` GPIOB.MODER |= 1<<0;`
` GPIOB.OTYPER &= ~(1<<0);`
` GPIOB.ODR &= ~(1<<0);`
` while(1)`
` {`
` }`
`}`
`
CUBE MX 实现 ( 简单)
代码实现
RCC->IOPENR |=` `1<<1;`
` GPIOB->MODER &=~(0x3<<4);` `//清零`
` GPIOB->MODER |=` `1<<4;`
` GPIOB->OTYPER &=` `~(1<<2);`
` GPIOB->ODR &=` `~(1<<2);`
`
方法二 ( 更简单)
HAL库函数实现
功能:设置或清除选定的端口位
参数:1.端口号
2.引脚号
- 3.电平状态
返回值:无
功能:电平状态切换
参数:端口号 引脚号
返回值:无。
延时函数
HAL_Delay(500);
毫秒级延时
8. 实验 二
实验要求
按键控制灯的量灭
实验分析
- 找按键和灯的丝印
- 五向按键--S1
- LED-》D7,D9,D10
- 原理图
实验过程
原理图分析
CUBMX配置
HAL库函数分析
功能:读取指定的引脚
参数 :端口号 引脚
返回值:引脚的值
代码实现
9. 抖动问题
机械按键通常由两个金属触点组成,当按键按下或释放时,这两个触点会迅速接触或分离。但由于机械结构的弹性,这个过程并不是瞬间完成的,而是会产生短暂的抖动,导致在几毫秒内有多次接触和断开的现象。
消除抖动
方法一:延时消抖
8. 串口通信
- 两个端,一个发送端,一个接收端
- 数据的传递
- 信息的交互
摩斯密码(兴趣拓展)
是由点(.)和划(-)组成的,但它并不是严格意义上的二进制码。二进制码严格来说是由0和1两种状态构成的编码系统,而摩斯密码更像是一种时长编码系统。
- 使用短信号(点,.)、长信号(划,-)以及不同的间隔时间。
- 变长度编码,不同字符用不同长度的点和划组合表示。
摩斯密码的结构
摩斯密码的每个字符由点(.)和划(-)组成,通过不同的组合来表示不同的字母和数字。不同字符之间有不同的间隔时间来区分。
- 点(.) :短信号
- 划(-) :长信号
- 字符间隔 :字符内部点和划之间的间隔较短
- 字符间隔 :字符之间的间隔较长
- 单词间隔 :单词之间的间隔更长
例如:
- 字母A的摩斯密码是. -
- 字母B的摩斯密码是- . . .
1. 通信基础
通信的划分
根据通信方向划分
单工 : 一根信号线单向发送或者接收
要么收,要么发,只能作为接受或者发送设备。 比如:收音机
半双工 :一根信号线,可以双向进行,但是不能同时
可以收,可以发,但是不能同时进行。 比如:对讲机
全双工 : 两根信号线,可以在同一时刻收发信息。比如: 手机,电脑
根据通信方式划分
串行通信:指的是同一时刻只能收或发一个bit位信息,因此只用1根信号线即可
串行传输:数据一位一位串起来,逐个传输,数据按位顺序传输
优点:占用的引脚资源少
缺点:传输速度慢
并行通信:指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行
并行传输:使用多根线同时传输一个字的多个位,如 8 根线一次传输 8 个位。
优点:传输速度快
缺点:占用引脚多
根据时钟信号划分
同步通信 :通信双方根据同步信号通信,比如双方有一个共同的时钟信号(SPI全双工 I2C半双工)
异步通信 :通信双方有自己独立的系统时钟,大家约定好通信的速度。
异步通信不需要同步信号,但是并不是说通信的过程不同步(UART)
通信速度 : 单位时间 内 发送 或者 接收 的数据位数
波特率:一秒发送多少bit位
单位:bit/s bps
常用的波特率:9600bps 115200bps
电器协议补充
TTL、RS232、RS485的区别和简介_rs232和ttl-CSDN博客
TTL电平
特点:
电平范围:典型的TTL电平为0V和+5V,有时也使用3.3V。逻辑低(0):0V(通常0V - 0.8V),逻辑高(1):+5V(通常2V - 5V)
通信方式:单端信号,通常用于短距离、低速率的数字电路和芯片之间的通信。
优点:简单、成本低。
缺点:抗干扰能力差,传输距离短(通常在几十厘米以内)。
应用:常用于微控制器和其他数字电路之间的信号传输。
RS232
电平范围: 逻辑低(0):+3V至+15V
逻辑高(1):-3V至-15V
通信方式:单端信号,全双工或半双工。
传输距离:通常在15米以内,理论上可达30米(在低速率下)。
波特率:最高可达115200 bps,常见的波特率有9600 bps、19200 bps等。
优点:
抗干扰能力较强,适用于较长距离的通信。
适合点对点通信。
缺点:
信号电平相对较高,可能需要专门的电平转换芯片(如MAX232)。
不适合多点通信。
应用:早期的计算机串口通信、调制解调器、工业设备、串口打印机等。
RS485
电平范围:
通信方式:差分信号,全双工或半双工。
传输距离:理论上可达1200米(在低速率下),常见实际应用在几百米以内。
波特率:最高可达10 Mbps,但传输距离越长,波特率通常越低。
优点:
非常强的抗干扰能力,适用于长距离和工业环境。
支持多点通信(多达32个节点,可以扩展到128个甚至更多)。
缺点:
需要差分驱动和接收器电路。
通信协议相对复杂,需要适当的协议来管理总线冲突和通信。
应用:工业自动化、楼宇控制、远程数据采集、串行联网设备等。
2. 串口通信协议
空闲状态:始终保持在高电平,为了提高抗干扰能力。
起始位:1位 低电平表示数据开始传输,数据的起始
数据位:9位/8位/7位可配置
检验位(可选):起偶校验
奇校验:数据位上1的个数+校验位上1的个数=奇数
偶校验:数据位上1的个数+校验位上1的个数=偶数
注意:校验位用来校验数据传输过程中的错误,可以是奇偶校验,也可以不校验。
检验位的设置根据通信协议和数据传输的可靠性需求而定。
停止位:1位 将电平信号拉高,回到空闲状态,表示传输的结束。
总结:开始通信时我们要有一个起始位和结束位,高信号表示通信停止,当信号接收器检测到电平由高变低时,表示开始通信,准备开始读数据,从前面开始读到停止位。
3. USART
3.1 简单介绍
USART:支持同步/异步通信,全双工,串行
UART:只支持支持异步通信(没有时钟线),全双工,串行
是一种常见的外设,用于串行通信。它通常嵌入在微控制器或微处理器中,用于与外部设备进行数据交换。
USART具有以下功能和特点:
- 通用性 :支持同步和异步通信模式,因此可以与多种外部设备进行通信。
- 收发数据 :可以发送和接收数据,支持全双工通信。
- 波特率控制 :支持灵活的波特率配置,适应不同的通信速率要求。
- 错误检测和处理 :具有错误检测和处理功能,如奇偶校验、帧错误检测等,确保通信的可靠性。
- 流控制 :支持硬件流控制(如RTS/CTS)和软件流控制(如XON/XOFF),用于控制数据流。
USART通常用于串行通信接口,如RS-232、RS-485、SPI(串行外围接口)、I2C(Inter-Integrated Circuit)等。
3 . 2 框图分析
发送数据寄存器 :发送数据寄存器用于存储即将发送的数据字节。当需要发送数据时,CPU将待发送的数据加载到发送数据寄存器中。
发送移位寄存器:用于数据的传输,按照串行通信协议逐位移位发送,一旦所有数据位都被发送完毕,发送移位寄存器将发送停止位。
3.3 数据接收 和 发送的过程
数据接收过程:由Rx端口接收到数据,接收移位寄存器逐位放入,到接收数据寄存器,由CPU或者DMA调用
数据发送过程:由数据总线写入发送数据寄存器,发送移位寄存器逐位发送到TX数据发送端。
4. 串口 相关寄存器
串口控制寄存器
USART_CR
USART_CR1
USART_CR2
USART_CR3
决定数据帧的格式:(设备功能初始化、通信帧格式配置)
波特率寄存器
USART_BRR 决定通信速度: bps bit/s
数据发送寄存器
USART_TDR 决定发送的数据:将要发送的数据写入
数据接收寄存器
USART_RDR 决定接收的数据:将要接收数据的读取
中断和状态寄存器
USART_ISR
5. 实验 一 ( 串口发送实验)
实验要求
单片机通过串口给你的电脑每隔1s发送一个hello world
实验 过程
- 观察实物
丝印"p4"
- 原理图分析
工程 配置
代码实现
发送字符串的函数
实验二(串口收发实验)
实验要求
通过串口助手向单片机发送数据,单片机接收到数据后原样返回。
代码实现
- 实现字符接收函数 Uart_getchar();
- 实现字符串接收函数 Uart_Gets();
9. 输入输出重定向
printf重定向
int printf(const char * format,...)
printf函数底层调用的是fputc函数,fputs是将要发送的数据写入到标准输出流stdout
int fputc(int /*c*/, FILE * /*stream*/)
因此如果想让printf将数据输出到串口,需要重写fputc
代码实现
主函数调用
重写FPUTC
scanf重定向
10. 库函数实现
功能:发送一个数据
参数:句柄(标志位) 要输出的缓存区的首地址 发送的数据量(大小) 超时时间
返回值:发送状态
功能:接受一个数据
参数:句柄 缓存区首地址(数组首地址) 接受的数据量 超时时间
参数:接收状态