第二章:POS机硬件架构概览

做POS机开发这些年,我拆过的机器少说也有几十款了。每次拿到新板子,第一件事就是看它的硬件架构。说白了,搞懂硬件,你写代码才有底气。今天咱们就来聊聊POS机的硬件骨架——主控芯片、外设接口、电源管理这三块。

2.1 主控芯片:POS机的大脑

主控芯片选什么,直接决定了你的开发难度和成本。我个人习惯把主控分成三类:

  • 通用MCU:比如STM32系列,适合功能简单的密码键盘、手持终端
  • 专用SoC:像联发科、展锐的支付芯片,内置安全模块,省事
  • 应用处理器:跑Linux/Android的,比如全志、瑞芯微,适合智能POS

这里有个坑,我刚开始做项目时踩过——千万别只看主频。有一次我选了个200MHz的MCU,觉得够用了,结果跑起加密算法和LCD刷新,CPU占用率直接飙到90%。后来换了带硬件加密引擎的芯片,同样的活儿,占用率降到20%。

核心要点:主控选型要关注三点——处理能力、外设资源、安全特性。别光看主频,要看实际负载。

2.2 外设接口:连接世界的通道

POS机的外设接口,说白了就是跟外部设备打交道的管道。我按使用频率排个序:

2.2.1 串口(UART)

串口是最基础的接口,用来接打印机、密码键盘、扫码枪。你想想看,一个POS机可能同时接3-4个串口设备。

我在项目中遇到过一个问题:两个串口设备同时发数据,结果数据互相干扰。排查了半天,发现是中断优先级没配好。后来我养成了习惯——每个串口独立分配中断优先级,并且用DMA传输

// 串口初始化示例(STM32)
void UART_Init(void)
{
    // 配置波特率115200,8位数据,1位停止位
    USART_InitTypeDef usart;
    usart.USART_BaudRate = 115200;
    usart.USART_WordLength = USART_WordLength_8b;
    usart.USART_StopBits = USART_StopBits_1;
    usart.USART_Parity = USART_Parity_No;
    
    // 使能DMA传输,减少CPU负担
    USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
}

避坑指南:我曾经因为串口波特率不匹配,导致打印机乱码。后来统一规定:所有串口设备波特率固定为115200,除非特殊需求。

2.2.2 I2C接口

I2C主要接一些小器件:触摸屏、传感器、EEPROM。它的好处是只用两根线,省引脚。但坏处是——速度慢,容易受干扰

我记得有一次,触摸屏偶尔失灵,查了三天。最后发现是I2C总线上拉电阻选小了,导致信号边沿太缓。嗯,这里要注意:I2C总线的上拉电阻要根据总线电容和速度来算,不能随便焊个4.7kΩ了事。

总线速度 推荐上拉电阻 总线电容
100kHz(标准模式) 4.7kΩ - 10kΩ < 400pF
400kHz(快速模式) 1.5kΩ - 4.7kΩ < 200pF
1MHz(快速+模式) 1kΩ - 2.2kΩ < 100pF

2.2.3 SPI接口

SPI是速度之王,用来接LCD屏幕、SD卡、加密芯片。它的速度可以跑到几十MHz,但代价是引脚多——至少4根线。

我建议:SPI通信一定要用DMA。为什么?因为SPI是同步通信,CPU如果逐字节发送,会被卡死。用DMA的话,CPU可以干别的事,比如处理按键、更新界面。

// SPI DMA发送示例
void SPI_SendData_DMA(uint8_t *data, uint16_t len)
{
    // 配置DMA通道
    DMA_InitTypeDef dma;
    dma.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
    dma.DMA_MemoryBaseAddr = (uint32_t)data;
    dma.DMA_BufferSize = len;
    dma.DMA_DIR = DMA_DIR_PeripheralDST;
    
    // 启动DMA传输
    DMA_Cmd(DMA1_Channel3, ENABLE);
}

2.3 电源管理:稳定是王道

电源管理这块,很多人不重视。但说实话,POS机死机、重启、数据丢失,80%是电源问题

POS机的电源架构一般是这样:

  • 输入:5V/9V/12V DC,或者锂电池
  • 降压:3.3V给主控、外设,1.8V给DDR内存
  • 升压:有些打印机需要24V
  • 备份:纽扣电池给RTC供电

我踩过最大的坑是——电源纹波导致触摸屏误触。当时机器在店里用得好好的,一到收银高峰期就乱跳。后来用示波器一测,3.3V纹波有200mV。换了颗低ESR的电容,纹波降到30mV,问题解决。

警告:POS机电源设计要遵循三条铁律——1)输入加TVS管防浪涌;2)每颗芯片旁边放去耦电容;3)模拟和数字电源要分开走线。我曾经因为省了一颗电容,导致整批机器返厂。

还有个细节:掉电检测。POS机突然断电时,要保存交易数据。我一般用MCU的掉电中断,检测到电压低于阈值,立即把关键数据写入EEPROM。这个时间窗口通常只有几毫秒,代码要精简到极致。

// 掉电中断处理
void PVD_IRQHandler(void)
{
    if(PWR_GetFlagStatus(PWR_FLAG_PVDO))
    {
        // 保存交易数据到EEPROM
        SaveTransactionData();
        // 关闭所有外设
        DisableAllPeripherals();
    }
}

好了,硬件架构就聊到这儿。下一章咱们深入代码层面,讲讲嵌入式C语言在POS机里的高效编程技巧。记住一句话:懂硬件,才能写出好软件