第2章:自动售货机硬件架构
好,咱们直接切入正题。上一章聊了Bootloader是干啥的,这一章得把「战场」搞清楚——自动售货机到底长什么样?芯片选谁?外设怎么接?存储怎么分?
我个人的习惯是,做任何嵌入式项目,先画硬件框图。别急着写代码,先把芯片、外设、存储这三块理清楚。否则后面调试起来,你会发现自己像个无头苍蝇。
2.1 主控芯片选型:为什么是STM32F4?
自动售货机不是玩具,它要7x24小时运行。温度、湿度、震动,甚至有人踹它一脚。所以芯片得皮实。
我选STM32F4系列,说白了就三个理由:
- 性能够用:Cortex-M4内核,带FPU。做Bootloader时,浮点运算不是必须的,但万一你要做OTA校验(比如SHA256),M4的运算速度比M0快一个量级。
- 外设丰富:UART、I2C、SPI、CAN、USB OTG,全都有。自动售货机要接的东西杂,屏幕、钱币器、电机、传感器,一个芯片搞定。
- 生态成熟:HAL库、LL库、CubeMX,资料多。你遇到坑,大概率有人踩过。
具体型号建议:STM32F407VET6 或 STM32F429IGT6。前者性价比高,后者带LCD控制器(如果你要用彩屏)。
我记得有一次项目,客户非要省成本用F1系列。结果Bootloader跑OTA时,Flash擦写速度跟不上,升级一次要5分钟。后来换F4,30秒搞定。嗯,有些钱不能省。
2.2 外设接口:UART、I2C、SPI、GPIO
自动售货机的外设,说白了就是「输入」和「输出」。输入:按键、投币器、传感器。输出:电机、屏幕、灯带。
咱们一个一个看:
2.2.1 UART(串口)
这是Bootloader的生命线。为什么?因为升级固件最常用的方式就是串口。
- 用途:与PC通信、与蓝牙/WiFi模块通信、调试日志输出。
- 我建议:至少留两个UART。一个给Bootloader专用(比如USART1),一个给应用程序用(比如USART3)。别混用,否则调试时你会疯。
- 避坑:波特率别用太高的,115200足够。我曾经遇到过用921600波特率,结果线长一点就丢包。自动售货机内部线缆可能走1米以上,稳一点好。
2.2.2 I2C
I2C适合短距离、低速设备。自动售货机里哪些用I2C?
- EEPROM:存配置参数、校准数据。
- 传感器:温度、湿度、门磁(有些I2C接口的)。
- 屏幕:小尺寸OLED或LCD,很多用I2C控制。
我个人习惯,I2C总线上挂的设备不超过4个。挂多了,总线电容大,信号容易畸变。你想想看,自动售货机里线缆本来就乱,再加长I2C线,那波形简直没法看。
2.2.3 SPI
SPI是速度担当。Bootloader里SPI主要干两件事:
- 外部Flash:存固件备份或大容量数据。
- SD卡:有些售货机用SD卡升级固件,SPI模式读写。
我建议SPI时钟不要超过20MHz。虽然F4能跑到42MHz,但你要考虑PCB走线。自动售货机的PCB通常不是高速板,20MHz已经够用,而且稳定。
2.2.4 GPIO
GPIO看似简单,但坑最多。
- 按键:用外部中断+去抖。别用轮询,浪费CPU。
- 电机控制:用GPIO控制继电器或MOS管。注意加光耦隔离,否则电机启停的尖峰脉冲能把芯片打死。
- LED指示灯:Bootloader运行状态指示。我习惯用两个LED:一个电源指示,一个Bootloader活动指示。
注意:所有GPIO输入,务必加上拉或下拉电阻。我曾经遇到一个项目,按键没加上拉,结果引脚悬空,Bootloader一上电就误触发进入升级模式。查了两天才发现。
2.3 存储布局:Flash与RAM
这是Bootloader的核心。存储怎么分,直接决定了你能不能安全升级。
STM32F4的Flash通常是1MB(比如F407VG),RAM是192KB+64KB(CCM)。咱们得精打细算。
2.3.1 Flash分区方案
我推荐的分区方式是这样的:
| 分区 | 起始地址 | 大小 | 内容 |
|---|---|---|---|
| Bootloader | 0x08000000 | 64KB | Bootloader固件 |
| 参数区 | 0x08010000 | 16KB | 配置参数、校准数据 |
| App Slot 1 | 0x08014000 | 448KB | 主应用程序 |
| App Slot 2 | 0x08084000 | 448KB | 备份/升级用 |
| 标志区 | 0x080FC000 | 16KB | 升级标志、CRC校验值 |
为什么留两个App Slot?说白了就是「双备份」。升级时,先擦写Slot 2,校验通过后再切换启动地址。万一升级断电,下次还能从Slot 1启动。这个方案我用了很多年,没出过问题。
小技巧:标志区放在最后16KB。因为Flash擦除是按扇区来的,F4的扇区大小不统一(前几个是16KB,后面是128KB)。把标志区放在128KB扇区里,擦写次数少,寿命长。
2.3.2 RAM分配
Bootloader运行时,RAM分配要抠门一点:
- 栈:4KB。Bootloader不跑复杂逻辑,4KB足够。
- 堆:2KB。如果你用malloc,建议别用。Bootloader里静态分配最安全。
- 缓冲区:8KB。用于接收固件数据包(比如Ymodem协议)。
- 全局变量:剩下的大约180KB留给应用程序。Bootloader自己只用不到20KB。
我遇到过有人把缓冲区设成64KB,结果RAM不够,程序跑飞。你想想看,Bootloader总共才192KB RAM,你一个缓冲区占三分之一,其他东西往哪放?
2.4 硬件架构总结
好了,咱们捋一下:
- 主控:STM32F4,带FPU,外设全。
- 外设:UART(调试+升级)、I2C(EEPROM+传感器)、SPI(外部Flash)、GPIO(按键+电机+LED)。
- 存储:Flash分5区,双App Slot保平安。RAM精打细算,缓冲区8KB够用。
下一章,咱们开始搭建开发环境,写第一行Bootloader代码。到时候你会看到,硬件架构的知识全都会用上。
嗯,先到这。有问题随时问。