3、硬件上电时序:PMIC上电时序、DDR初始化、时钟与复位信号

各位同学,咱们今天聊点硬核的——硬件上电时序。

说实话,很多做软件的朋友觉得这是硬件工程师的活,跟自己没关系。但我告诉你,如果你不懂上电时序,你写的驱动可能永远跑不起来。我在项目中遇到过太多次了,软件调了半天,最后发现是电源没给对。

3.1 PMIC上电时序——芯片的"起床流程"

PMIC,全称Power Management IC,就是电源管理芯片。它负责给座舱系统里的各个模块供电。但供电不是一窝蜂全给,得有个先后顺序。

为什么要有顺序?因为不同的芯片模块对电源有依赖关系。比如,I/O口的电源必须先于核心逻辑供电,否则可能出现闩锁效应。说白了,就是芯片会"卡住",再也起不来。

我习惯把PMIC上电时序分成三个阶段:

  1. 预上电阶段:先给RTC(实时时钟)和备份域供电。这部分电流很小,但必须最早到位。
  2. 核心上电阶段:依次给CPU核心、GPU、NPU供电。注意,这里通常要求间隔5-10ms。
  3. 外围上电阶段:最后给DDR、eMMC、显示接口等外设供电。

典型PMIC上电时序示例(以高通SA8155为例):

VDD_RTC → 0ms
VDD_CORE → 5ms(核心电压0.8V)
VDD_GPU → 8ms(GPU电压0.9V)
VDD_DDR → 12ms(DDR电压1.1V)
VDD_IO → 15ms(IO电压1.8V)
VDD_PLL → 18ms(PLL电压1.2V)

嗯,这里要注意:不同厂家的PMIC,上电顺序可能完全相反。我见过一个项目,换了PMIC型号后,整机死活起不来,最后发现是上电顺序反了。所以,一定要看数据手册,别想当然。

3.2 DDR初始化——内存的"自检"过程

DDR初始化,说白了就是让内存知道自己该干什么。这个过程很关键,因为系统启动后的所有代码都在DDR里跑。

DDR初始化的步骤大致如下:

  1. 复位DDR控制器:先让DDR控制器进入已知状态。
  2. 配置时序参数:告诉DDR芯片,你的CL(CAS延迟)、tRCD、tRP等参数是多少。
  3. 校准ZQ:阻抗校准,确保信号质量。
  4. 执行DDR训练:这是最耗时的一步,DDR控制器会发送测试数据,调整读写时序。
  5. 进入正常模式:训练完成后,DDR就可以正常读写了。

个人经验:我曾经在一个项目里,DDR训练总是失败。查了三天,最后发现是PCB走线等长没做好。DDR信号线长度差超过50mil,就会导致时序问题。所以,硬件设计阶段就要把DDR走线当回事。

DDR初始化的代码,通常由BootROM或SPL(Secondary Program Loader)完成。以U-Boot为例,它的DDR初始化流程是这样的:

// DDR初始化伪代码
void ddr_init(void) {
    // 1. 复位DDR控制器
    ddr_ctrl_reset();
    
    // 2. 配置DDR时序
    ddr_set_timing(CL=11, tRCD=11, tRP=11);
    
    // 3. ZQ校准
    ddr_zq_calibration();
    
    // 4. DDR训练
    ddr_training();
    
    // 5. 进入正常模式
    ddr_set_normal_mode();
}

你想想看,如果DDR初始化失败,系统连内存都用不了,后面的启动就无从谈起。所以,这一步是硬性要求,必须通过。

3.3 时钟与复位信号——系统的"心跳"与"重启键"

时钟信号,就是系统的心跳。没有时钟,芯片里的逻辑电路就不会动。复位信号,就是系统的重启键,让所有模块回到初始状态。

时钟信号的来源通常有三种:

  • 晶振:最常用的时钟源,精度高,但频率固定。
  • PLL:锁相环,可以把低频时钟倍频到高频。比如,25MHz晶振通过PLL可以生成2GHz的CPU时钟。
  • 外部时钟输入:由其他芯片提供时钟,比如以太网PHY芯片。

复位信号呢,也有讲究。我习惯把复位分成三级:

复位级别 影响范围 典型场景
POR(上电复位) 整个芯片 系统上电时
系统复位 CPU核心+外设 看门狗超时
软复位 仅CPU核心 软件异常处理

警告:复位信号的时序要求非常严格。比如,复位信号必须保持低电平至少10ms,否则芯片可能无法正确复位。我曾经见过一个案例,复位信号只拉了5ms,结果芯片每次上电都随机死机。查了两个月,最后发现是复位时间不够。

时钟和复位信号的配合也很重要。一般来说,复位信号释放后,时钟必须已经稳定。否则,芯片在时钟不稳定时就开始工作,会出现各种奇怪的问题。

我个人习惯的做法是:先让晶振起振,等它稳定后(通常需要几毫秒),再释放复位信号。这样能确保芯片在干净的时钟环境下启动。

3.4 实战中的避坑指南

讲了这么多理论,咱们来点实际的。我在项目中踩过的坑,分享给大家:

  • PMIC上电顺序搞反:有一次,我把VDD_CORE和VDD_IO的顺序搞反了,结果芯片上电后电流异常大,差点烧了。后来查手册才发现,IO电源必须先于核心电源。
  • DDR训练失败:前面说了,PCB走线等长很重要。另外,DDR的供电纹波也不能太大,否则训练会失败。建议DDR供电纹波控制在50mV以内。
  • 时钟抖动过大:晶振的负载电容没选对,导致时钟抖动超标。系统偶尔会死机,但很难复现。后来用示波器一看,时钟波形都变形了。
  • 复位信号毛刺:复位信号线上有毛刺,导致芯片频繁复位。加一个RC滤波电路就解决了。

总结一下:硬件上电时序,看似简单,实则暗藏玄机。PMIC上电顺序、DDR初始化、时钟与复位信号,这三者环环相扣,任何一个环节出问题,系统都起不来。做座舱系统,一定要把这块吃透。

好了,这一章就讲到这里。下一章咱们聊聊BootROM的加载流程,看看芯片上电后第一条指令是怎么执行的。