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函数,中间经历了好几步。我简单梳理一下:
- POR复位:芯片上电,内部复位电路工作,所有寄存器初始化。
- 采样BOOT_CFG:复位释放后,芯片采样BOOT_CFG引脚,确定启动模式。
- 执行Boot ROM:芯片内部的Boot ROM开始执行,根据启动模式加载代码。
- 加载并跳转:Boot ROM把代码从启动设备(比如SD卡、Flash)加载到内部RAM或DDR中,然后跳转到入口地址。
- 执行启动代码:启动代码(通常是汇编写的)初始化堆栈、BSS段、时钟、DDR等。
- 跳转到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配置决定了芯片从哪里开始。这三者配合好了,系统才能稳定可靠地运行。
下一章,咱们聊聊时钟系统。时钟是芯片的“心跳”,没有稳定的时钟,一切都是空谈。到时候见!