第一部分SPI通信协议SPISerial Peripheral Interface是一种由Motorola公司开发的通用数据总线协议用于高速同步串行通信。它基于四根通信线SCKSerial Clock时钟线、MOSIMaster Output Slave Input主机输出从机输入、MISOMaster Input Slave Output主机输入从机输出和SSSlave Select从机选择。SPI采用同步全双工机制支持总线挂载多设备一主多从实现高效数据交换。1. 硬件电路连接所有SPI设备的SCK、MOSI和MISO线分别互联主机通过多条SS控制线连接到各从机的SS引脚。输出引脚如MOSI配置为推挽输出模式输入引脚如MISO配置为浮空或上拉输入模式确保信号稳定传输。2. 通信原理与核心结构SPI通信的核心是移位交换过程。主机内置波特率发生器产生SCK时钟和移位寄存器初始数据如10101010从机也有移位寄存器初始数据如01010101。关键信号线包括MOSI主机发送数据到从机。MISO从机发送数据到主机。SCK主机输出的同步时钟控制移位节奏。通信过程如下同步时钟驱动主机的波特率发生器输出SCK脉冲作为移位节拍器。双向移位交换每个SCK脉冲触发主机和从机的移位寄存器同时向左或向右移位。主机移位寄存器的最高位通过MOSI发送给从机同时从机移位寄存器的对应位通过MISO发送给主机。数据交换结果经过8个时钟脉冲后主机和从机的数据完全互换。例如主机初始10101010变为接收01010101从机初始01010101变为接收10101010实现全双工同步通信。关键特点全双工通信数据收发同时完成无需额外地址或应答信号。主机控制时钟由主机生成从机被动同步协议简单高效。3. SPI时序基本单元时序模式由CPOL时钟极性和CPHA时钟相位定义起始条件SS从高电平切换到低电平。终止条件SS从低电平切换到高电平。四种模式模式0CPOL0空闲时SCK低电平CPHA0第一个边沿移入数据第二个边沿移出数据。模式1CPOL0空闲时SCK低电平CPHA1第一个边沿移出数据第二个边沿移入数据。模式2CPOL1空闲时SCK高电平CPHA0第一个边沿移入数据第二个边沿移出数据。模式3CPOL1空闲时SCK高电平CPHA1第一个边沿移出数据第二个边沿移入数据。4. W25Q64存储器简介W25Qxx系列是低成本、小型化的非易失性存储器常用于数据存储、字库或固件程序存储。存储介质为Nor Flash时钟频率支持80MHz标准、160MHz双SPI和320MHz四SPI。存储容量基于24位地址W25Q404Mbit / 512KByteW25Q808Mbit / 1MByteW25Q1616Mbit / 2MByteW25Q3232Mbit / 4MByteW25Q6464Mbit / 8MByteW25Q128128Mbit / 16MByteW25Q256256Mbit / 32MByteFlash操作注意事项写入操作必须先执行写使能每个位只能从1改写为0不能反向写入前必须擦除擦除后所有位变为1擦除按最小单元进行连续写入时最多写入一页数据超过页尾会覆盖页首写入结束后芯片进入忙状态不响应新操作。读取操作直接调用读取时序无需使能或额外操作无页限制读取结束后不进入忙状态但忙状态时不可读取。5. STM32 SPI外设与结构STM32集成了硬件SPI收发电路由硬件自动执行时钟生成和数据收发减轻CPU负担。特性包括可配置8位/16位数据帧、高位先行或低位先行。时钟频率f_{PCLK} / (2, 4, 8, 16, 32, 64, 128, 256)。支持多主机模型、主或从操作、半双工/单工精简模式、DMA兼容和I2S协议。SPI基本结构核心模块波特率发生器生成SCK时钟信号决定通信速率。数据控制器协调数据发送与接收流程。数据收发核心包括发送数据寄存器TDR存放待发送数据、接收数据寄存器RDR存放接收数据和移位寄存器核心数据通路实现串并转换和全双工通信。GPIO接口输出/输入SCK、MOSI、MISO信号。开关控制对应片选SS信号用于选择目标从设备。工作流程主设备通过开关控制选中从设备。波特率发生器输出SCK时钟。数据控制器写入TDR数据数据进入移位寄存器在SCK驱动下通过MOSI串行发送。同时从设备数据通过MISO进入移位寄存器接收数据存入RDR。发送与接收同步完成实现高效数据交换。SPI控制器的核心是“时钟控制 移位收发”通过四条线实现高速同步通信。第二部分Unix时间戳、BKP与RTCUnix时间戳、BKP备份寄存器和RTC实时时钟是STM32中用于时间管理和数据持久化的关键模块适用于实时系统和低功耗场景。1. Unix时间戳Unix时间戳定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数不考虑闰秒。时间戳存储在一个秒计数器中该计数器为32位或64位整型变量。世界上所有时区的秒计数器相同不同时区通过添加偏移量得到当地时间例如当地时间$t_{\text{local}} t_{\text{timestamp}} \text{offset}$。UTC/GMT基础GMT格林尼治标准时间基于地球自转将地球自转一周等分为24小时。UTC协调世界时基于原子钟铯133原子跃迁辐射9,192,631,770周为1秒当与地球自转偏差超过0.9秒时通过闰秒协调。时间戳转换函数C语言time.h模块time_t time(time_t*)获取系统时钟的秒计数器。struct tm* gmtime(const time_t*)秒计数器转换为格林尼治时间日期。struct tm* localtime(const time_t*)秒计数器转换为当地时间日期。time_t mktime(struct tm*)当地时间日期转换为秒计数器。char* ctime(const time_t*)秒计数器转换为默认格式字符串。char* asctime(const struct tm*)日期时间转换为默认格式字符串。size_t strftime(char*, size_t, const char*, const struct tm*)日期时间转换为自定义格式字符串。2. BKP备份寄存器BKPBackup Registers用于存储用户应用程序数据当主电源VDD2.0~3.6V切断时由VBAT1.8~3.6V维持供电。系统在待机模式唤醒、复位或电源复位时数据不丢失。但TAMPER引脚侵入事件会清除所有备份寄存器内容。BKP还支持RTC引脚输出校准时钟、闹钟脉冲或秒脉冲。存储容量20字节中/小容量设备或84字节大容量/互联型设备。BKP基本结构核心供电与输入输出VBAT备用电源输入如纽扣电池保证主电源掉电时数据保存。TAMPER侵入检测输入电平异常时触发事件清除数据用于安全防护。RTC输出为实时时钟提供校准或时钟信号。核心寄存器组数据寄存器DR1~DR42共42个16位寄存器保存用户自定义数据图中标注大容量和互联型。控制寄存器配置工作模式如侵入检测触发方式。状态寄存器记录模块状态如侵入事件触发。RTC时钟校准寄存器微调RTC时钟频率补偿晶振误差。核心功能数据备份VBAT供电确保数据非易失。安全防护TAMPER实现防篡改检测。RTC辅助提供时钟校准支持。3. RTC实时时钟RTCReal Time Clock是一个独立定时器提供系统时钟和日历功能。它处于后备区域系统复位时数据不清零VDD断电后由VBAT供电继续运行。核心包括32位可编程计数器对应Unix时间戳秒计数器和20位可编程预分频器适配不同输入时钟。支持三种时钟源HSE时钟除以128通常8MHz/128。LSE振荡器时钟通常32.768kHz。LSI振荡器时钟通常40kHz。RTC基本结构时钟源选择通过多路选择器输出RTCCLK支持HSE/128适合主电源工作时使用。LSE高精度首选外部低速晶振。LSI低成本方案内部RC振荡器。预分频器由PRL重装寄存器配置分频系数决定最终计数器频率和计时精度。RTC模块通过预分频器将输入时钟分频驱动32位计数器实现精准时间跟踪。