第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分区方案

我推荐的分区方式是这样的:

分区起始地址大小内容
Bootloader0x0800000064KBBootloader固件
参数区0x0801000016KB配置参数、校准数据
App Slot 10x08014000448KB主应用程序
App Slot 20x08084000448KB备份/升级用
标志区0x080FC00016KB升级标志、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代码。到时候你会看到,硬件架构的知识全都会用上。

嗯,先到这。有问题随时问。