CPU:运算器、控制器、寄存器
运算器: 信息处理
控制器: 控制各种器件进行工作
寄存器: 信息存储

串口通讯的缺点:
- 不能远距离传输信号(RS232、RS485)
- 通信速度慢(SPI)
- 不能一对多通信(I2C)
RS232通讯距离短,RS485通讯距离长,RS485还有一对多的通讯功能。SPI通讯速度快。
I2C最大的优点:支持多设备互相通讯,支持多组通信
支持多设备通讯
- 画电路板需要注意的事情
时钟是用来同步信号的,发送端在时钟的高电平发送数据,接收端在时钟的高电平接收数据。
芯片是如何输出高低电平的:上面的MOS管导通就输出高电平,下面的MOS管导通就输出低电平。
上拉电阻的取值:上拉电阻太大会造成浪费和烧毁电路,上拉电阻太小无法把总线拉低到低电平的状态,**上拉电阻的取值一般取4.7K欧,**随着总线的增加也会适当降低上拉电阻的取值。
I2C采用的方案是上拉电阻+开漏输出,上拉电阻的取值一般就是几千欧姆,总线设备多且通讯速度高的话,上拉电阻取值就小一些,反之就去大一点。
I2C抗干扰能力弱。
- 写代码需要注意的事情
这三个东西结合起来看会更好
W25Q64学习SPI通讯
W25Q64简介
- W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器,
- 常应用于数据存储、字库存储、固件程序存储等场景
- 存储介质:Nor Flash(闪存)
- 时钟频率:80MHz/160MHz(Dual SPI)/320MHz(Quad SPI)
- 存储容量(24位地址):W25Q40: 4Mbit/512KByte
W25Q80: 8Mbit/1MByte
W25Q16: 16Mbit/2MByte
W25Q32: 32Mbit/4MByte
W25Q64: 64Mbit/8MByte
W25Q128: 128Mbit/16MByte
W25Q256: 256Mbit/32MByte硬件电路:
W25Q64框图
Flash操作注意事项
写入操作时:
- 写入操作前,必须先进行写使能。
- 每个数据位只能由1改写为0,不能由0改为为1
- 写入数据前必须先擦除,擦除后,所以数据位变为1
- 擦除必须按照最小擦除单元进行
- 连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到首页覆盖写入。
- 写入操作结束后,芯片进入忙状态,不响应新的读写操作。
读取操作时候:
- 直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,但不能在忙状态时读取。
SPI外设简介
- STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担
- 可配置8位/16位数据帧、高位先行/低位先行
- 时钟频率:fpcLk/(2,4, 8,16,32, 64,128, 256)
- 支持多主机模型、主或从操作
- 可精简为半双工/单工通信
- 支持DMA
- 兼容I2S协议
- STM32F103C8T6硬件SPI资源:SPI1、SPI2
SPI框图:
SPI 是同步串行、主从、全双工接口。主机给时钟(SCK),一边从 MOSI 送数据给从机,同时从 MISO 收回数据;片选 NSS 决定哪一颗从机工作。
引脚与最外层
SCK:位时钟,来自 Master。
MOSI / MISO:主出从入 / 主入从出。
NSS :片选;低有效。既可硬件管理 (外设自动控制),也可软件拉脚(GPIO 方式)。
图左侧 4 根线和最下方的 NSS,就是 SPI 和外部世界的接口。
数据通路(图核心)
cpp写DR → 发送缓冲区(TX buffer) → 移位寄存器 → MOSI 线 MISO 线 → 移位寄存器 → 接收缓冲区(RX buffer) → 读DR
移位寄存器:跟随 SCK 每个沿移入/移出 1 位。
发送/接收缓冲区:通常是 1×字宽(8/16 bit)的单深度缓冲。
LSBFIRST 控位:决定移位方向(默认 MSB first,置 1 变 LSB first)。
全双工要点 :每"发"一个位的同时也在"收"一个位------所以主机必须写 DR 才会产生时钟,从而才能把对端数据"时出来"。这就是"SPI 接收也需要发送占位"的根本原因。
波特率发生器 & 主控制电路
BR[2:0] 分频 :SCK = PCLK / {2,4,8,...,256}。在 CR1.BR 里。
CPOL/CPHA:时钟空闲极性与采样/改变边沿。
MSTR:主/从选择。
SPE:SPI 使能总开关。
SPI Mode CPOL CPHA 空闲电平 采样沿 0 0 0 低 上升沿采样 1 0 1 低 下降沿采样 2 1 0 高 下降沿采样 3 1 1 高 上升沿采样 控制寄存器 CR1(图右下)
主要字段(常见):
CPOL / CPHA:见上。
MSTR:1=主机。
BR[2:0]:分频选择。
SPE:1=启动 SPI。
LSBFIRST:1=低位先发。默认 0(高位先发)。
SSM/SSI:软件管理 NSS(无外部 NSS 线时常用)。
设 SSM=1 允许软件接管 NSS;
同时把 SSI=1 等效于"片选已有效",否则从模式下会认为未选中。
RXONLY:只接收(半双工接收场景)。
DFF:数据帧 8/16 bit(老款 F1/F3 有这个位)。
BIDIMODE/BIDIOE:单线半双工模式以及方向输出使能。
CRCEN/CRCNext:CRC 计算与发送控制(很少在普通外设上用)。
左边四根线:SCK/MOSI/MISO/NSS。
中央:移位寄存器 上下连着发送/接收缓冲 ,再连地址与数据总线 到 DR。
右侧:CR1/CR2/SR 组合:
CR1:模式、主从、分频、帧长、方向等"性格"。
CR2:中断、DMA、NSS 输出使能等"外联"。
SR:TXE/RXNE/BSY/OVR/MODF/CRCERR 等"状态回报"。
下方:波特率发生器 与主控制电路,由 CR1 配参后驱动整个通道。
右中"小 0/1 开关"图示:可理解为单线方向/数据路径选择(BIDIMODE/BIDIOE)或发送/接收通路的选择与门控。
"先写 DR 才有 SCK;读 DR 清 RXNE;读 DR→读 SR 清 OVR;TXE==1 不代表结束,BSY==0 才是真的结束。"
设备对不上:先看 Mode,再看片选时序。
一主多从:GPIO 当 CS,软 NSS(SSM=1, SSI=1),更灵活。
高速长线:SCK 分频+端接+上拉;必要时降速保稳
SPI基本结构:
主模式全双工连续传输:
非连续传输
软件硬件波形对比
Ctrl+空格是提示
Unix时间戳
- Unix时间戳(UnixTimestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒
- 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量
- 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间
UTC/GMT
- GMT(Greenwich Mean Time)格林尼治标准时间是一种以地球自转为基础的时间计量系统。它将地球自转一周的时间间隔等分为24小时,以此确定计时标准
- UTC(Universal TimeCoordinated)协调世界时是一种以原子钟为基础的时间计量系统。它规定绝133原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间为1秒。当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时,UTC会执行闰秒来保证其计时与地球自转的协调一致
时间戳转换
- C语言的time.h模块提供了时间获取和时间戳转换的相关函数,可以方便地进行秒计数器、日期时间和字符串之间的转换
BKP简介
- BKP(Backup Registers)备份寄存器
- BKP可用于存储用户应用程序数据。当VDD(2.0~3.6V)电源被切断,他们仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位
- TAMPER引脚产生的侵入事件将所有备份寄存器内容清除 RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲
- 存储RTC时钟校准寄存器
- 用户数据存储容量: 20字节(中容量和小容量)/ 84字节(大容量和互联型)
BKP基本结构
RTC简介
- RTC(Real Time Clock)实时时钟
- RTC是一个独立的定时器,可为系统提供时钟和日历的功能
- RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~3.6V)断电后可借助VBAT(1.8~3.6V)供电继续走时
- 32位的可编程计数器,可对应Unix时间戳的秒计数器
- 20位的可编程预分频器,可适配不同频率的输入时钟
- 可选择三种RTC时钟源: HSE时钟除以128(通常为8MHz/128) LSE振荡器时钟(通常为32.768KHz) LSI振荡器时钟(4OKHz)
RTC框图
RTC基本结构
硬件电路
RTC操作注意事项
- 执行以下操作将使能对BKP和RTC的访问: 设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟。 设置PWR_CR的DBP,使能对BKP和RTC的访问。
- 若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1
- 必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器
- 对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器