4. 复位与启动:POR复位、看门狗复位、启动模式配置(BOOT_CFG)

好,咱们今天聊点硬核的——复位与启动。说实话,很多工程师觉得复位不就是按个键、拉低引脚吗?其实没那么简单。我在项目中遇到过好几次,板子莫名其妙起不来,最后发现是复位时序没处理好。你想想看,芯片上电那一刻,所有寄存器都是随机值,如果没有一套严谨的复位机制,系统根本没法正常工作。

4.1 POR复位:芯片的“第一口奶”

POR,全称Power-On Reset,也就是上电复位。说白了,就是芯片刚通电时,内部电路自动产生一个复位信号,把所有的寄存器、状态机都初始化到已知状态。

NXP的i.MX系列芯片,POR复位有几个关键点:

  • 复位阈值电压:一般芯片内部有个电压检测电路,当VDD_CORE低于某个阈值(比如0.9V)时,芯片保持复位状态。电压稳定后,再释放复位。
  • 复位持续时间:芯片手册通常会要求POR低电平至少保持几个毫秒。我习惯留点余量,一般设到10ms以上。
  • 外部复位电路:很多开发板会加一个复位芯片(比如MAX809),专门监控电源电压。一旦电压跌落,立刻拉低复位引脚。

重要提醒:POR复位和手动复位(RESET引脚)是有区别的。POR复位会初始化所有内部逻辑,包括PLL、DDR控制器等。而手动复位可能只复位CPU核,外设状态不一定清零。

我曾经在一个项目里,为了省成本,没加外部复位芯片,直接用RC电路。结果低温环境下,电容充电变慢,复位时间不够,芯片偶尔启动失败。后来老老实实加了复位监控芯片,问题就解决了。

4.2 看门狗复位:系统的“最后一道防线”

看门狗,英文叫Watchdog Timer(WDT)。它的作用很简单:如果程序跑飞了或者卡死了,看门狗超时后自动复位系统。

NXP芯片内部通常有多个看门狗:

看门狗类型 用途 超时时间
WDOG1 系统主看门狗,用于监控主程序 可配置,典型值1-10秒
WDOG2 用于安全关键应用,独立时钟源 可配置,典型值100ms-1秒
WDOG3 低功耗看门狗,休眠模式下可用 可配置,最长可达几分钟

看门狗的使用,我建议遵循几个原则:

  • 喂狗位置要合理:别在主循环开头喂狗,万一主循环卡在中间,看门狗就失效了。我习惯在主循环末尾喂狗,确保整个循环都跑通了。
  • 超时时间要留余量:比如你的主循环最长执行时间是500ms,那看门狗超时设1秒就差不多了。别设太短,否则正常运行时也会误复位。
  • 调试阶段可以关闭:嗯,这里要注意,调试时看门狗会频繁复位,影响调试效率。我一般会在调试版本里把看门狗关掉,发布版本再打开。

避坑指南:我曾经在一个产品里,看门狗超时时间设得太短,结果系统在启动过程中频繁复位,根本进不了主循环。后来在启动代码里先关闭看门狗,等系统初始化完成后再开启,问题就解决了。

4.3 启动模式配置(BOOT_CFG):芯片的“人生选择”

芯片上电后,第一件事就是决定从哪里启动。NXP芯片通过BOOT_CFG引脚来配置启动模式。这些引脚在芯片复位时被采样,然后锁存到内部寄存器里。

常见的启动模式有:

  • 串行下载模式:通过UART或USB下载程序,适合量产烧录。
  • 内部Flash启动:直接从芯片内部的Flash执行代码,速度最快。
  • 外部NAND/NOR Flash启动:从外部存储器启动,适合大容量应用。
  • SD卡/eMMC启动:从SD卡或eMMC启动,方便调试和升级。

BOOT_CFG引脚通常有多个,比如BOOT_MODE0、BOOT_MODE1,再加上一些GPIO复用引脚。具体配置要看芯片手册的“System Boot”章节。

关键点:BOOT_CFG引脚在复位完成后,可以复用为普通GPIO。所以设计电路时,要注意这些引脚的上拉/下拉电阻,既要保证复位时的电平正确,又不能影响后续的GPIO功能。

我个人的习惯是,在原理图设计阶段,就把BOOT_CFG引脚的上拉/下拉电阻画清楚,并且标注好复位时的电平要求。这样后续调试时,一眼就能看出问题。

4.4 启动流程:从复位到main函数

芯片从复位到执行main函数,中间经历了好几步。我简单梳理一下:

  1. POR复位:芯片上电,内部复位电路工作,所有寄存器初始化。
  2. 采样BOOT_CFG:复位释放后,芯片采样BOOT_CFG引脚,确定启动模式。
  3. 执行Boot ROM:芯片内部的Boot ROM开始执行,根据启动模式加载代码。
  4. 加载并跳转:Boot ROM把代码从启动设备(比如SD卡、Flash)加载到内部RAM或DDR中,然后跳转到入口地址。
  5. 执行启动代码:启动代码(通常是汇编写的)初始化堆栈、BSS段、时钟、DDR等。
  6. 跳转到main函数:一切准备就绪,调用main函数,进入C语言世界。

嗯,这里要注意,Boot ROM的执行时间很短,一般只有几十毫秒。如果启动设备有问题(比如SD卡没插好),芯片会尝试下一个启动设备,直到所有设备都失败,最后进入串行下载模式。

调试技巧:如果板子启动不了,可以先检查BOOT_CFG引脚的电平。用万用表量一下复位瞬间的电平,看看是不是和预期一致。我曾经遇到过,因为焊接问题,一个BOOT_CFG引脚虚焊了,导致芯片一直进入下载模式,折腾了半天才找到原因。

4.5 实战:配置启动模式

咱们以i.MX6ULL为例,看看怎么配置启动模式。芯片有BOOT_MODE0和BOOT_MODE1两个引脚,组合起来有四种模式:

BOOT_MODE1 BOOT_MODE0 启动模式
0 0 串行下载(USB/UART)
0 1 内部Boot模式(从eFuse或GPIO配置)
1 0 保留
1 1 测试模式(一般不用)

如果选择内部Boot模式,芯片会进一步读取eFuse或者GPIO引脚,来确定具体的启动设备。比如:

  • GPIO_0~GPIO_4:选择启动设备类型(NAND、SD卡、SPI Flash等)
  • GPIO_5~GPIO_9:选择启动设备的参数(比如SD卡的电压、NAND的页大小等)

在实际项目中,我建议把BOOT_MODE引脚通过跳线帽引出,这样调试时可以方便地切换启动模式。量产时,再通过eFuse固化启动配置。

避坑指南:我曾经在一个项目里,为了省两个跳线帽,直接把BOOT_MODE引脚焊死在了内部Boot模式。结果后来需要升级Bootloader,只能拆芯片重新烧写eFuse,非常麻烦。从那以后,我设计开发板时,一定会把BOOT_MODE引脚做成可配置的。

好了,关于复位与启动,咱们就聊这么多。总结一下:POR复位是系统的起点,看门狗复位是系统的保障,BOOT_CFG配置决定了芯片从哪里开始。这三者配合好了,系统才能稳定可靠地运行。

下一章,咱们聊聊时钟系统。时钟是芯片的“心跳”,没有稳定的时钟,一切都是空谈。到时候见!