1. SCM模块在嵌入式系统中的核心地位与设计哲学如果你在嵌入式领域特别是基于TI OMAP这类复杂应用处理器的项目里摸爬滚打过几年一定会对“系统控制模块”这个词又爱又恨。爱的是它几乎是所有底层硬件初始化和系统调优的必经之路是连接软件灵魂与硬件躯干的神经中枢恨的是它的手册往往浩如烟海寄存器位域定义琐碎稍有不慎就会让系统“趴窝”。今天我就结合自己踩过的坑和填过的坑来深入聊聊TI OMAP SCM模块特别是它的通用寄存器组。这不是一份照本宣科的翻译文档而是一个老司机带你绕过暗礁、直达核心的实战指南。简单来说SCM就是芯片内部的一个“总控制台”。它不直接处理你的业务数据比如编解码视频或者运行应用程序但它决定了处理器核心、内存、各种外设如I2C、SPI、McBSP以何种状态、何种方式协同工作。想象一下你要指挥一个交响乐团SCM就是你面前的那个总控台上面有每个乐器的电源开关、音量旋钮、甚至乐谱翻页器。CONTROL_PADCONF_OFF寄存器就像是给整个舞台芯片I/O设置一个“休眠模式”告诉哪些引脚在深度睡眠时该如何自处而CONTROL_MSUSPENDMUX系列寄存器则像是给每个乐手外设模块分配指挥棒决定他们是听MPU主处理器的指挥还是听DSP协处理器的指挥或者两者都听、都不听。为什么需要这么精细的控制答案是为了极致的能效比和系统可靠性。在移动和物联网设备中电池续航是命门。SCM允许你将不用的模块彻底关电OFF模式将暂时空闲的模块挂起MSuspend动态调整I/O驱动能力以平衡功耗与信号完整性甚至通过硬件防火墙Firewall隔离关键区域防止错误代码或恶意访问捣乱。这些功能最终都体现在那一组组32位的寄存器里。理解并正确配置它们是从“单片机思维”迈向“复杂SoC系统架构思维”的关键一步。2. 核心寄存器功能解析与实战场景映射面对手册里动辄几十页的寄存器列表新手很容易迷失。我的经验是不要逐个比特位去死记硬背而是先按功能模块把它们分类理解每一类寄存器要解决的核心问题。下面我们就以输入资料中的几个关键寄存器为例拆解其设计意图和典型应用场景。2.1 电源与状态管理CONTROL_PADCONF_OFF 与 CONTROL_STATUSCONTROL_PADCONF_OFF这个寄存器是系统进入深度低功耗状态如OFF模式前的“安全员”。它的核心职责是管理引脚配置的保存与恢复机制以及强制进入关断模式。FORCEOFFMODEEN (位0): 这是“强制关机”按钮。写1会立即使芯片进入OFF模式无视其他模块状态。什么情况下会用通常在系统严重错误、需要紧急复位或进入最深省电状态时。但注意这是一个非常规操作正常电源管理流程应通过PRCM电源与时钟管理模块有序进行。STARTSAVE (位1): 这是“保存现场”触发器。在进入OFF模式前芯片需要把当前所有引脚的复用模式、上下拉等配置保存到特定的保持存储器中以便唤醒时能原样恢复。将此位置1会启动这个保存过程保存完成后硬件会自动将其清零。关键点你需要在发起睡眠流程前确保这个保存操作完成通过轮询或中断。一个常见的疏忽是设置完睡眠参数后立刻触发睡眠而保存操作尚未完成导致唤醒后引脚状态错乱。WKUPCTRLCLOCKDIV (位2): 这个位控制唤醒控制模块的时钟分频。它决定了用于监控唤醒事件如按键、RTC闹钟的时钟速度。分频比大时钟慢则功耗更低但响应唤醒事件的延迟会变长。这需要在功耗和唤醒灵敏度之间做权衡。CONTROL_STATUS寄存器则是个“黑匣子”只读记录了芯片上电复位瞬间的一些关键信息。DEVICETYPE (位10:8): 读取芯片类型例如0x3代表GP通用器件。这在你需要编写兼容不同芯片版本的启动代码时非常有用。SYS_BOOT (位5:0): 这6位直接锁存了芯片启动时SYS_BOOT[5:0]这组引脚的电平状态。这是OMAP芯片启动模式的根本依据。Boot ROM会根据这个值决定从哪里启动如XIP NOR Flash, NAND, MMC/SD卡UART等。在调试无法启动的问题时第一件事就是查这个寄存器的值确认硬件上拉/下拉电阻配置是否正确。实操心得在编写低功耗驱动时对于CONTROL_PADCONF_OFF的操作必须放在关闭所有外设时钟、保存完必要上下文之后但在最终触发WFI等待中断指令进入核心睡眠之前。一个可靠的序列是1) 保存应用上下文2) 配置外设进入低功耗状态3) 设置STARTSAVE1并等待完成4) 通过PRCM设置电源域状态5) 执行核心睡眠。2.2 静态设备配置CONTROL_DEVCONF0/1这类寄存器用于配置芯片的一些“静态”或“板级”特性通常在系统初始化阶段设置一次之后不再更改。它们解决了硬件设计灵活性带来的软件适配问题。以CONTROL_DEVCONF0为例McBSP时钟源选择 (MCBSPx_CLKS): McBSP多通道缓冲串行端口是TI芯片上常见的音频接口。它可以选择使用外部专用时钟引脚McBSP_CLKS的时钟或者使用内部PRCM提供的功能时钟。如果你的板子上将McBSP_CLKS引脚连接了一个高精度音频时钟源就需要将此位置1。否则使用内部时钟更简单。McBSP帧同步和接收时钟选择 (MCBSPx_FSR, MCBSPx_CLKR): 对于McBSP2手册注明其FSR和CLKR信号内部与FSX和CLKX引脚复用。这意味着在硬件设计时如果McBSP2需要作为从设备需要外部提供帧同步和位时钟就必须将FSX和CLKX引脚配置为输入并在软件层面通过此寄存器告知模块。DMA请求信号灵敏度 (SENSDMAREQx): 这决定了DMA控制器是检测sys_ndmareq引脚上的电平还是边沿来触发传输。电平触发意味着只要请求线为低DMA就持续传输边沿触发则只在下降沿或上升沿取决于极性启动一次传输。选择依据对于需要持续传输的外设如ADC连续采样常用电平触发对于单次或突发传输如从外设读取一块数据常用边沿触发。CONTROL_DEVCONF1则包含了更多样化的配置I2C内部上拉使能 (I2CxHSMASTER): 当I2C总线上的主设备是OMAP芯片自身时可以启用内部上拉电阻省去外部电阻节省PCB面积和成本。但要注意内部上拉电阻值通常较大如50kΩ在高速模式或总线电容较大时可能无法满足上升时间要求此时仍需使用外部更小阻值的上拉电阻。TV输出旁路 (TVOUTBYPASS): 用于旁路内部视频DAC直接将数字视频信号输出到引脚。这在需要外接更高性能视频编码器的场景中使用。MPU写操作模式 (MPUFORCEWRNP): 强制MPU主处理器的写操作为“非投递”模式。在投递写中处理器发出写命令后无需等待完成即可继续执行提升了性能。但在某些对顺序有严格要求的场景如配置寄存器序列非投递写能确保前一条写操作完全生效后再执行下一条避免竞态条件。2.3 模块挂起控制CONTROL_MSUSPENDMUX 系列这是SCM中非常精妙的一部分用于实现精细化的电源域和时钟门控。MSuspend信号来自MPU或DSP当它们进空闲或睡眠状态时可以发出此信号通知其管辖的外设模块“我要休息了你们也可以歇歇”。CONTROL_MSUSPENDMUX_0到_5这一组寄存器为每个支持此功能的外设如McBSP1-5, I2C1-3, GPTimer1-11, DMA等配置了如何响应MSuspend信号。每个模块通常有3个控制位定义8种响应模式0x0: 无响应。模块完全忽略MPU和DSP的挂起信号始终保持活动。适用于必须持续工作的模块比如看门狗定时器从手册看WD2/WD3的复位值就是0x1即默认只响应MPU的挂起确保系统安全。0x1: 仅响应MPU的挂起信号。0x2: 仅响应DSP的挂起信号。0x3: 响应MPU或DSP任一方的挂起信号逻辑或。只要有一个处理器睡了模块就挂起。0x4: 响应MPU与DSP双方的挂起信号逻辑与。只有两个处理器都睡了模块才挂起。这用于那些需要被两个处理器共享且仅在两者都空闲时才可关闭的模块。0x5-0x7: 保留或无响应。设计考量这给了系统架构师极大的灵活性。例如一个由MPU控制、DSP进行数据处理的音频采集链路。你可以将McBSP负责音频输入配置为只响应MPU挂起0x1因为DSP可能一直在后台处理数据而将负责数据传输的DMA配置为响应“逻辑与”0x4确保只有MPU和DSP都空闲时DMA才停止避免数据丢失。2.4 保护与安全机制CONTROL_PROT_ERR_STATUS 与防火墙在复杂的SoC中内存保护单元和硬件防火墙对于系统稳定性和安全性至关重要。CONTROL_PROT_ERR_STATUS寄存器就是一个集中式的“安全警报中心”。它包含了多个位域每个对应一个硬件防火墙或保护通道的错误状态L4_CORE, L4_PERIPH, L4_EMU: 这些是L4互连总线上不同域核心外设、通用外设、仿真模块的防火墙错误。IVA2, GPMC, SMS, MAD2D: 对应图像、视频、音频加速器静态内存控制器共享内存子系统等的防火墙错误。OCM_RAM, OCM_ROM: 片上存储器的保护错误。SYSDMAACCERROR, DISPDMAACCERROR, CAMERADMAACCERROR: 系统DMA、显示DMA、摄像头DMA的访问权限错误。当发生非法访问例如用户空间的程序试图直接写内核配置寄存器或者一个模块试图访问另一个模块被隔离的内存区域时对应的错误位会被置1。调试技巧在系统发生看似“随机”的崩溃或数据损坏时检查这个寄存器往往能快速定位问题根源——是某个驱动越界访问还是内存映射配置错误。配合CONTROL_PROT_ERR_STATUS_DEBUG寄存器专门记录调试访问的错误可以进一步区分是正常功能访问违规还是调试器访问违规。2.5 可编程I/O驱动强度CONTROL_PROG_IO0/1随着信号速率越来越高I/O接口的驱动能力配置不再是可有可无的选项而是信号完整性设计的关键一环。CONTROL_PROG_IO0和CONTROL_PROG_IO1寄存器允许你动态调整特定I/O引脚的驱动强度和速度。CONTROL_PROG_IO0: 主要控制SDRCSDRAM控制器和GPMC通用内存控制器相关引脚的驱动强度。例如SDRC_LOWDATA和SDRC_HIGHDATA位分别控制SDRAM数据线的低字节和高字节驱动强度。选项通常是“低驱动2-6pF负载”和“高驱动6-12pF负载”。如何选择这取决于你的PCB设计内存芯片距离处理器多远走线有多长负载多少通常在板级验证阶段如果发现内存读写不稳定特别是高频率下可以尝试增强驱动能力。但要注意更强的驱动意味着更大的瞬态电流和更高的功耗可能带来更严重的EMI。CONTROL_PROG_IO1: 控制McBSP2和MCSPI1等串行接口的驱动强度。这里的配置更精细提供了4档选择20Ω/8mA, 25Ω/6mA, 40Ω/4mA, 65Ω/2mA。经验之谈对于高速SPI或McBSP用于音频为了确保信号边沿质量通常需要较强的驱动如20Ω。但对于低速、长线传输如连接到一个较远设备有时反而需要减弱驱动并配合端接电阻来减少反射。2.6 时钟扩频与EMI抑制CONTROL_*_DPLL_SPREADINGCONTROL_DSS_DPLL_SPREADING,CONTROL_CORE_DPLL_SPREADING等寄存器用于控制锁相环的“扩频时钟”功能。这是一个非常实用的EMI电磁干扰抑制技术。其原理是让DPLL的输出时钟频率在一个很小的范围内如±1%周期性波动。这样时钟能量的频谱就从一根单一的尖峰被“展宽”成一个较宽的包络从而降低了特定频率点的峰值辐射强度有助于通过EMC电磁兼容认证。每个寄存器控制一个DPLL域显示子系统、核心、外设、USB主机等包含三个关键参数SPREADING_ENABLE: 总开关。SPREADING_RATE (位1:0): 频率调制速率即“抖动的快慢”范围从62.5KHz到1MHz。速率越高抑制高频EMI效果可能更好但可能对某些时钟敏感的电路如高速ADC引入额外抖动。SPREADING_AMPLITUDE (位3:2): 调制指数K即频率偏移量Δf与调制速率fm的比值。K值越大频率波动范围越大EMI抑制效果越强但同时引入的时钟抖动也越大。应用建议在产品EMI测试阶段如果发现某个频点通常是核心时钟或其谐波超标可以尝试启用对应DPLL的扩频功能。通常从较低的调制速率和幅度开始测试在满足EMI标准的前提下尽量减小对系统时序的影响。特别注意启用扩频可能会影响依赖高精度时钟的外设如USB和某些高速串行接口需要充分测试。3. 寄存器编程模型与底层操作详解理解了寄存器功能后我们来看看如何安全、正确地对它们进行编程。这不仅仅是写几个十六进制数到某个地址那么简单。3.1 寄存器访问基础内存映射与位操作所有SCM寄存器都映射到芯片的物理地址空间。例如CONTROL_PADCONF_OFF的物理地址是0x4800 2270。在Linux内核或裸机程序中我们通常会定义一个指向该地址的 volatile 指针来进行访问。#include stdint.h // 定义SCM模块基址根据芯片手册 #define SCM_CONTROL_BASE 0x48002270UL // 将寄存器定义为指针 #define REG_CONTROL_PADCONF_OFF (*(volatile uint32_t *)(SCM_CONTROL_BASE 0x0000)) void configure_pad_save(void) { uint32_t reg_val; // 1. 读取-修改-写入 是标准操作避免影响其他位 reg_val REG_CONTROL_PADCONF_OFF; // 2. 设置WKUPCTRLCLOCKDIV为分频2位2置1同时确保其他位不变 reg_val | (1 2); // 设置第2位为1 // 3. 启动保存机制位1置1 reg_val | (1 1); // 设置第1位为1 // 4. 写回寄存器 REG_CONTROL_PADCONF_OFF reg_val; // 5. 等待保存完成位1自动清零 while (REG_CONTROL_PADCONF_OFF (1 1)) { // 短暂延时或空循环 } }关键点volatile关键字必须使用。它告诉编译器这个内存位置的内容可能被硬件异步改变禁止编译器对该变量的读写进行优化如缓存到寄存器。位操作清晰性使用(1 bit_position)来构造掩码比直接写六进制数0x4更易读、易维护。读取-修改-写入这是黄金法则。永远不要直接给寄存器赋一个新值除非你完全确定要覆盖所有位。先读取再用清除位、|设置位或组合操作来修改目标位最后写回。3.2 复杂位域配置以MSUSPENDMUX为例配置CONTROL_MSUSPENDMUX_0来控制McBSP1和McBSP2的挂起响应。假设我们希望McBSP1仅响应MPU的挂起信号。McBSP2响应MPU或DSP任一方的挂起信号逻辑或。#define REG_CONTROL_MSUSPENDMUX_0 (*(volatile uint32_t *)(SCM_CONTROL_BASE 0x0020)) void configure_msuspend_mux(void) { uint32_t reg_val; reg_val REG_CONTROL_MSUSPENDMUX_0; // 清除McBSP1和McBSP2对应的位域位20:18和位23:21 reg_val ~((0x7 18) | (0x7 21)); // 0x7是3位全1的掩码 // 设置McBSP1 (位20:18) 为 0x1 (仅MPU) reg_val | (0x1 18); // 设置McBSP2 (位23:21) 为 0x3 (MPU或DSP) reg_val | (0x3 21); REG_CONTROL_MSUSPENDMUX_0 reg_val; }位域操作技巧先清除用 ~(mask)将目标位域清零。mask是连续位域为1其余为0的值。例如对于3位的域mask (0x7 start_bit)。后设置用| (value start_bit)设置新的值。确保value在目标位域的合法范围内此处是0-7。使用宏或内联函数对于频繁使用的位域可以封装成函数提高代码可读性和复用性。3.3 依赖性与配置顺序SCM寄存器的配置并非完全独立有时存在严格的先后顺序或依赖关系。这是最容易出错的地方之一。典型依赖案例PBIAS_LITE 配置CONTROL_PBIAS_LITE寄存器控制MMC/SD卡接口的电源和I/O电压。配置它必须遵循特定顺序否则可能损坏芯片或卡。确认电压先读取PBIASLITESUPPLYHIGHx状态位确认实际供电电压1.8V或3.0V。软件配置根据实际电压设置PBIASLITEVMODEx位告知芯片软件预期的电压水平。检查错误读取PBIASLITEVMODEERRORx确保软件配置与实际硬件电压匹配。如果不匹配说明硬件设计或供电有问题不能进行下一步。速度控制设置PBIASSPEEDCTRLx选择I/O速度26MHz或52MHz。释放断电最后在确认供电稳定后将PBIASLITEPWRDNZx置1使能I/O缓冲器。错误的操作顺序可能导致I/O引脚上的电压冲突产生大电流甚至永久性损坏。3.4 动态配置与运行时考量虽然很多SCM配置在启动时完成但有些需要在运行时动态调整。I/O驱动强度在系统负载变化或温度变化导致信号质量下降时可以动态增强驱动。时钟扩频可以在系统空闲时启用扩频以降低EMI在高性能任务前关闭它以获得最佳时序。模块挂起根据应用场景动态调整CONTROL_MSUSPENDMUX例如在仅DSP工作的场景下让MPU控制的外设进入挂起。动态操作黄金法则确保模块空闲在修改一个模块的配置前确保该模块处于复位或空闲状态没有正在进行的数据传输。时钟门控如果可能先关闭模块的时钟配置完成后再打开。这可以避免配置过程中产生毛刺。上下文保存对于影响系统状态的配置如改变MSuspend响应可能需要先保存相关模块的上下文。4. 调试技巧与常见问题排查实录SCM配置错误引发的现象千奇百怪从外设不工作、系统随机崩溃到功耗异常。下面是我总结的一些排查思路和实战案例。4.1 问题现象与排查路径速查表问题现象可能相关的SCM寄存器排查步骤与要点系统无法从深度睡眠唤醒CONTROL_PADCONF_OFF1. 检查STARTSAVE位是否在睡眠前成功完成自动清零。2. 检查唤醒源对应的引脚在OFF模式下的配置是否合理需参考Pad Configuration寄存器非本文档范围。3. 确认FORCEOFFMODEEN是否被意外置位。McBSP/I2C/SPI等外设无时钟或数据CONTROL_DEVCONF0/11. 检查时钟源选择位如MCBSPx_CLKS是否正确内部时钟还是外部引脚2. 检查引脚复用是否正确需查Pad Configuration寄存器。3. 对于McBSP检查MCBSPx_FSR/CLKR的输入选择是否与硬件连接一致。某个外设在CPU idle时不降功耗CONTROL_MSUSPENDMUX_x1. 确认该外设是否出现在MSUSPENDMUX寄存器列表中。2. 检查其3位配置值是否符合预期例如配置为0x0则永不挂起。3. 确认MPU/DSP是否确实发出了MSuspend信号查PRCM模块状态。系统随机访问错误或数据损坏CONTROL_PROT_ERR_STATUS1. 发生错误后立即读取此寄存器查看哪个防火墙或保护通道报错。2. 结合错误地址通常在其他相关寄存器中和软件访问源定位非法访问的代码。3. 检查内存映射配置和DMA传输描述符是否正确。高速信号质量差过冲、振铃CONTROL_PROG_IO0/11. 用示波器测量信号波形。2. 尝试增加驱动强度减小电阻值观察波形改善情况。3. 注意增强驱动可能增加功耗和EMI需权衡。EMI测试在核心时钟频点超标CONTROL_CORE_DPLL_SPREADING1. 尝试使能扩频SPREADING_ENABLE1。2. 从较低的扩频幅度和速率开始如K4, Rate00。3. 重新测试EMI逐步调整参数直至达标同时测试系统功能是否正常。MMC/SD卡识别失败或读写不稳定CONTROL_PBIAS_LITE1.首要步骤用万用表测量卡槽供电电压MMC1_VDDS。2. 读取PBIASLITESUPPLYHIGH0状态位确认芯片检测到的电压是否与测量一致。3. 检查PBIASLITEVMODEERROR0是否为1错误若为1则说明软件配置的VMODE与实际电压不匹配必须修正软件配置或硬件供电。4. 根据卡的操作电压1.8V或3.0V和频率正确设置PBIASSPEEDCTRL0和PBIASLITEVMODE0。读取芯片ID或版本号错误CONTROL_IDCODE1. 确认访问的地址是否正确0x4830 A204。2. 对比读出的HAWKEYE和VERSION与芯片丝印或预期是否一致用于验证芯片型号和修订版本。4.2 实战踩坑案例McBSP2“无声”故障背景在一个基于OMAP的音频设备上McBSP2接口连接外部音频编解码器。配置完成后McBSP1工作正常但McBSP2完全没有数据输出。排查过程检查时钟和电源正常。检查McBSP2模块自身的配置时钟分频、字长等与McBSP1一致应正常。检查引脚复用配置确认无误。深入查看SCM手册在CONTROL_DEVCONF0中关于McBSP2的备注引起了注意“Note: There are no external pins McBSP2_CLKR and McBSP2_FSR for the module McBSP2. For this module, CLKR input is from the pin McBSP2_CLKX and FSR input is from the pin McBSP2_FSX.”恍然大悟我们的硬件设计上McBSP2是作为主设备提供时钟和帧同步但软件配置却将其设为了从设备期望从外部接收CLKR和FSR。而根据手册McBSP2根本没有独立的CLKR和FSR输入引脚它们内部与CLKX和FSX复用。解决方案将McBSP2的配置改为主模式由它自己产生CLKX和FSX输出。或者如果必须作为从设备则需要将外部提供的时钟和帧同步信号连接到CLKX和FSX引脚并在软件中正确配置CONTROL_DEVCONF0寄存器告知模块这一情况。教训对于多实例外设如多个McBSP、I2C不能想当然认为它们引脚和功能完全一样。必须仔细阅读每个实例在SCM中的特殊备注和配置位。4.3 调试工具与方法内存查看器在调试器如JTAG/ETB中直接查看SCM寄存器区域的内存内容是最直接的方法。可以对比实际值与预期值。内核调日志在Linux等操作系统中通常会有SCM驱动或PinCtrl驱动。通过dmesg查看相关日志有时能发现配置冲突或错误。示波器/逻辑分析仪对于I/O配置、时钟相关问题仪器测量必不可少。例如检查引脚是否有输出、电平和时序是否正确。编写测试代码在复杂驱动中可以编写一小段裸机代码单独测试某个SCM配置功能隔离其他驱动的影响。5. 高级主题安全启动、动态电源管理与系统初始化流程5.1 安全启动与密钥哈希CONTROL_RPUB_KEY_H_0到_4这些只读寄存器存储了根公钥的哈希值。这是TI OMAP安全启动流程的一部分。在安全启动模式下Boot ROM会使用这些哈希值来验证后续加载的软件镜像如X-Loader、U-Boot的数字签名。如果签名验证失败芯片将拒绝启动防止运行未经授权的代码。对于大多数应用开发者这些寄存器是只读的参考信息用于确认芯片的安全配置状态。真正的密钥烧写和哈希值计算是在芯片生产或安全配置阶段完成的。5.2 动态电源管理框架与防火墙CONTROL_DPF_*系列寄存器如CONTROL_DPF_OCM_RAM_FW_*是动态电源管理框架的一部分。它们定义了当系统进入某种低功耗状态时哪些主机如MPU、DSP、DMA可以访问哪些内存区域如OCM RAM、GPMC、IVA2。这实现了更细粒度的电源域和时钟域控制。例如当MPU进入休眠时可以配置防火墙禁止MPU访问OCM RAM从而允许该内存区域被断电以节省功耗。配置这些寄存器需要深入理解系统的电源状态机和各主机的访问权限图通常由芯片原厂或资深的系统架构师完成。5.3 系统初始化中的SCM配置顺序一个稳健的系统初始化流程中SCM配置通常紧随最基础的时钟和内存控制器初始化之后。一个大致的顺序是基本时钟与PLL配置系统主PLL为SCM模块自身提供工作时钟。SCM基础配置读取CONTROL_STATUS确认设备类型和启动模式。根据板级设计配置CONTROL_DEVCONF0/1如I2C上拉、McBSP时钟源。配置CONTROL_PROG_IO0/1设置关键接口的初始驱动强度。配置CONTROL_MSUSPENDMUX建立初步的电源管理策略。引脚复用配置这是重头戏通过Pad Configuration寄存器属于SCM但未在本文档详述将芯片的数百个引脚配置为所需功能GPIO、UART、MMC等。必须在使能外设时钟之前完成。外设时钟使能通过PRCM模块给需要工作的外设提供时钟。外设模块初始化初始化UART、I2C、MMC等外设驱动。低功耗与安全配置可选在系统进入稳定运行后根据需要配置CONTROL_PADCONF_OFF的保存机制、DPLL扩频以及动态电源管理防火墙。最后我想强调的是SCM手册是宝典但切忌孤立地看。必须将SCM的配置与PRCM电源与时钟管理、Pad Mux引脚复用以及各个外设模块自身的寄存器结合起来理解。它们共同构成了芯片底层的“生态系统”。每一次对SCM寄存器的写入都像是在这个生态系统中调整一个参数可能会产生连锁反应。因此修改前多思考修改后充分测试尤其是在功耗和稳定性方面。