嵌入式学习日记

CPU:运算器、控制器、寄存器

运算器: 信息处理

控制器: 控制各种器件进行工作

寄存器: 信息存储

串口通讯的缺点:

  1. 不能远距离传输信号(RS232、RS485)
  2. 通信速度慢(SPI)
  3. 不能一对多通信(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寄存器
相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms6 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下6 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。6 天前
2026.2.25监控学习
学习
im_AMBER6 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J6 天前
从“Hello World“ 开始 C++
c语言·c++·学习