第2章:点钞机硬件平台介绍
好,咱们直接进入正题。上一章聊了Bootloader的整体概念,这一章得把硬件平台讲透。毕竟做嵌入式开发,说白了就是跟硬件打交道。你代码写得再漂亮,硬件资源规划不好,照样跑不起来。
我个人习惯,做任何项目之前,先把芯片选型和资源分区定死。这就像盖房子,地基没打好,后面全是坑。我在点钞机项目里就吃过这个亏,后面会细说。
2.1 主控芯片选型:为什么是STM32F4系列?
点钞机这玩意儿,对主控的要求其实挺刁钻的。你想想看,它要同时处理电机控制、传感器数据采集、图像识别、UI显示,还得保证实时性。一般的Cortex-M3可能就吃力了。
我选STM32F4系列,主要看中三点:
- 性能够用:Cortex-M4内核带FPU,主频能到168MHz甚至180MHz。点钞时的图像处理算法,浮点运算少不了。没有硬件FPU,纯软件模拟,那延迟你受不了。
- 外设丰富:定时器、ADC、DMA、FSMC(用于驱动LCD),基本把点钞机需要的接口全包了。不用额外挂太多芯片,成本也压得住。
- 生态成熟:HAL库、LL库、各种中间件,网上资料一抓一大把。真遇到问题,不至于抓瞎。
具体型号我常用STM32F407VGT6。为什么是它?1024KB Flash + 192KB RAM,对于点钞机的Bootloader加应用程序来说,空间刚刚好。我曾经试过用F405,Flash小了256KB,结果固件塞不下,最后还得换芯片,折腾死。
核心选型要点:
- Flash至少1MB(Bootloader + App + 备份区)
- RAM至少128KB(图像缓存 + 堆栈)
- 定时器数量≥8个(电机、传感器、PWM各司其职)
- ADC通道≥4个(磁头、红外、紫外传感器)
2.2 Flash与RAM分区规划
嗯,这里要注意。分区规划是Bootloader设计的重中之重。规划不好,后面升级固件时,你连哭的地方都没有。
我一般把STM32F4的1MB Flash分成这么几块:
| 分区名称 | 起始地址 | 大小 | 用途 |
|---|---|---|---|
| Bootloader区 | 0x08000000 | 64KB | 存放Bootloader固件,负责启动和升级 |
| App区(主程序) | 0x08010000 | 512KB | 点钞机核心业务逻辑 |
| App备份区 | 0x08090000 | 512KB | OTA升级时的备份,防止升级失败变砖 |
| 参数存储区 | 0x08110000 | 64KB | 校准参数、用户设置、序列号等 |
| 日志区 | 0x08120000 | 剩余空间 | 运行日志,方便调试和故障排查 |
为什么Bootloader只给64KB?因为Bootloader的功能其实很单纯:初始化硬件、检查升级标志、跳转到App。代码量不会太大。给多了浪费,给少了不够用。64KB是我反复试出来的黄金分割点。
RAM分区呢?192KB的RAM,我这样分:
- 堆栈区:32KB。Bootloader和App共用,但启动时重新初始化。
- 图像缓存区:64KB。点钞机要处理纸币图像,这个不能省。
- 传感器数据区:32KB。磁头、红外、紫外传感器的原始数据。
- 动态内存区:64KB。给各种中间件和临时变量用。
避坑指南:我曾经把App备份区放在Bootloader区后面紧挨着,结果有一次升级时写错了地址,直接把Bootloader覆盖了。机器彻底变砖,只能拆机用J-Link重新烧。从那以后,我强制要求Bootloader区必须写保护,App区和备份区之间留出足够的安全间隙。
2.3 外设接口详解
点钞机的外设,说白了就三大块:电机驱动、传感器、显示屏。每一块都有讲究。
2.3.1 电机驱动接口
点钞机里一般有两个电机:一个走钞电机,一个分钞电机。走钞电机负责把纸币一张张送进去,分钞电机负责把重叠的纸币分开。
我用的驱动方案是:
- 电机类型:直流有刷电机,便宜且控制简单。
- 驱动芯片:L298N或DRV8833。STM32的定时器输出PWM,通过驱动芯片控制电机转速。
- 接口分配:TIM1_CH1和TIM1_CH2分别控制两个电机,频率20kHz,避免人耳听到噪音。
- 编码器反馈:每个电机配一个霍尔编码器,接STM32的定时器编码器模式,实时读取转速。
这里有个小技巧:电机启动时,PWM占空比要慢慢增加,不能一步到位。否则电流冲击太大,容易把电源拉垮。我在项目中遇到过,开机瞬间电机猛转,结果显示屏直接黑屏重启。后来加了软启动,问题解决。
2.3.2 传感器接口
点钞机的传感器种类多,但接口方式就那么几种:
| 传感器类型 | 接口方式 | STM32外设 | 说明 |
|---|---|---|---|
| 红外对管 | GPIO输入 | PA0-PA7 | 检测纸币有无、位置 |
| 磁头传感器 | 模拟量输入 | ADC1_IN0-IN3 | 检测纸币磁性特征 |
| 紫外传感器 | 模拟量输入 | ADC1_IN4-IN7 | 检测纸币荧光反应 |
| 厚度传感器 | 模拟量输入 | ADC2_IN0 | 检测纸币重叠 |
| 图像传感器(CIS) | FSMC + DMA | FSMC_NE1 + DMA2 | 扫描纸币图像,用于冠字号识别 |
你想想看,点钞机每秒要处理10-15张纸币。每张纸币经过时,所有传感器都要采集数据。这个速度,用CPU轮询肯定不行。我全部用DMA + 定时器触发,数据自动搬运到RAM里,CPU只管处理。
个人经验:磁头传感器的信号很微弱,只有几毫伏。ADC采样时,我习惯用DMA的循环模式,连续采样16次然后取平均值。这样能滤掉大部分噪声。别问我怎么知道的,早期版本因为噪声问题,误报率高达30%,被客户骂惨了。
2.3.3 显示屏接口
点钞机的显示屏,常见的有两种:段码LCD和TFT彩屏。段码LCD便宜,但显示内容有限。TFT彩屏贵,但能显示冠字号图像和状态信息。
我一般用3.5寸TFT彩屏,分辨率320x480。接口方式:
- 驱动芯片:ILI9488或ST7789。
- 通信接口:FSMC(Flexible Static Memory Controller)。STM32F4的FSMC可以模拟8080时序,直接驱动TFT屏,速度比SPI快一个数量级。
- 引脚分配:FSMC_D0-D15接数据线,FSMC_NE1接片选,FSMC_NWE接写使能,FSMC_NOE接读使能。
- 背光控制:用定时器PWM控制背光亮度,省电且可调。
这里有个坑:FSMC的时序参数需要根据TFT屏的数据手册仔细配置。太快了屏幕花屏,太慢了刷新率上不去。我刚开始做的时候,直接用HAL库的默认参数,结果屏幕显示全是乱的。后来拿着示波器一点一点调,才搞定。
2.4 硬件平台总结
好了,这一章的内容差不多就这些。总结一下核心要点:
- STM32F4系列是点钞机主控的性价比之选,性能、外设、生态都到位。
- Flash分区要预留Bootloader、App、备份区、参数区,缺一不可。
- 电机驱动用PWM+编码器闭环控制,传感器用DMA批量采集,显示屏用FSMC高速驱动。
- 每个接口都要考虑抗干扰和可靠性,毕竟点钞机是金融设备,稳定压倒一切。
下一章,咱们开始动手写Bootloader的启动代码。我会从复位向量表讲起,一步步带你实现从Flash加载App的全过程。到时候,你会看到这些硬件规划到底是怎么落地的。
嗯,今天就到这儿。有问题随时交流。