news 2026/7/26 12:47:43

嵌入式开发基石:DM355引脚复用、复位与启动模式配置详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式开发基石:DM355引脚复用、复位与启动模式配置详解

1. 项目概述与核心价值

在嵌入式系统,尤其是像TI DM355这类高度集成的数字媒体SoC(片上系统)开发中,硬件工程师和底层驱动开发者绕不开三个紧密耦合的核心议题:引脚复用、复位机制与启动模式配置。这听起来像是枯燥的芯片手册章节,但恰恰是决定你的板子能否“亮起来”、系统能否稳定运行的基石。很多项目在调试阶段卡住,问题往往不是出在复杂的应用算法上,而是源于对这些底层硬件机制的理解偏差或配置疏忽。

引脚复用(Pin Muxing)绝非简单的“一根线多用”。在DM355上,它是一项由系统控制模块精密管理的资源仲裁策略。芯片有限的物理引脚需要承载视频编解码、外部存储器访问、多种串行通信、通用IO等数十种功能,如何让它们和平共处、按需切换,就是引脚复用寄存器要解决的问题。理解其映射表,是进行PCB布线和驱动开发的前提。

复位(Reset)则像是系统的“重启按钮”,但DM355给了你好几种按法:有的能彻底清空一切(冷启动),有的则像应用崩溃后的“热重启”,保留部分状态。不同的复位源(如上电、看门狗、软件触发)和复位类型,对芯片内部各模块的影响范围截然不同。混淆它们,可能会导致外设状态异常、DDR数据丢失等难以排查的软硬件交互问题。

而启动模式(Boot Mode)配置,则是系统上电后执行的第一段“引导程序”。DM355通过几根硬件配置引脚(BTSEL[1:0], AECFG[3:0])的状态,在复位瞬间被锁存,从而决定CPU是从内部的ROM引导,还是直接从外部的AEMIF存储器启动,并进一步决定以何种方式(NAND, MMC/SD, UART)加载用户程序。这个配置错了,后续的一切软件工作都是空中楼阁。

本文将结合DM355的数据手册(SPRS575)和实际工程经验,深入拆解这三者的技术细节、交互关系与实操要点。无论你是正在评估DM355平台,还是正在调试一块新设计的板卡,理解这些内容都能帮你避开深坑,建立起对芯片行为的清晰预期。

2. 引脚复用(Pin Multiplexing)深度解析与配置实战

2.1 引脚复用的核心逻辑与寄存器架构

DM355的引脚复用并非全局统一管理,而是通过系统控制模块(System Control Module)中一组专用的寄存器进行分区控制。这种设计体现了模块化的思想,将功能相近的引脚分组管理,降低了配置的复杂性。主要包含以下几个寄存器:

  • PinMux0寄存器: 专门负责视频输入(Video In)相关信号的复用。例如,摄像头传感器接口的数据线、行场同步信号等可能与GPIO或其他功能复用。
  • PinMux1寄存器: 控制视频输出(Video Out)信号,如LCD显示接口的数据线、时钟、使能等信号。
  • PinMux2寄存器: 这是异步外部存储器接口(AEMIF)相关引脚复用的核心。它决定了EMIF的地址线、数据线、控制线是作为存储器接口功能,还是作为普通的GPIO来使用。这在启动配置和外部存储扩展时至关重要。
  • PinMux3寄存器: 管理通用输入输出(GIO)信号的复用。很多GPIO引脚都兼具第二甚至第三功能,如UART、SPI、I2C等,都需要通过此寄存器切换。
  • PinMux4寄存器: 控制SPI和MMC/SD0接口的引脚复用。

配置的本质: 每个复用引脚在寄存器中都有对应的位域(通常2-3个比特)。向这些位域写入特定的值,芯片内部的模拟开关和数字路径就会被切换,将物理引脚连接到目标功能模块的电路上。上电复位后,这些寄存器会处于一个默认状态,这个默认状态通常由芯片的固件(Boot ROM)根据硬件配置引脚(AECFG, BTSEL)的状态进行初步设置,但后续完全可由软件重新配置。

实操心得:配置时机引脚复用寄存器的配置必须在对应外设模块被使能和初始化之前完成。一个常见的错误顺序是:先初始化UART驱动,再配置引脚复用为UART模式,结果发现串口无法收发数据。正确的流程是:系统启动早期(在Bootloader或内核非常初期的阶段)就根据板级硬件设计,一次性或分模块地完成所有引脚的复用配置。在Linux系统中,这通常在设备树(Device Tree)的pinctrl节点中描述,由内核的pinctrl子系统在驱动探测前自动应用。

2.2 AEMIF引脚复用详解:以Table 3-17为例

你提供的资料中的Table 3-17是理解DM355引脚复用,特别是启动相关配置的关键。它描述了AECFG[3:0]这4位配置引脚如何影响AEMIF相关引脚的初始功能。我们将其翻译成更易理解的逻辑:

AECFG[3:0]是一个4位二进制码,在复位上升沿被锁存。它决定了AEMIF接口的引脚在复位后的默认角色,主要为了适配不同的外部存储器类型。

AECFG[3:0]配置模式EM_A[14], EM_BA[0]EM_BA[1]EM_A[0:13]EM_D[8:15]GPIO[46:53]
1101NAND Flash (8位)GPIO[54]GPIO[55]EM_A[0:13]EM_D[8:15]GPIO[46:53]
1100(保留或未定义)GPIO[54]EM_BA[1]EM_A[0:13]EM_D[8:15]GPIO[46:53]
1010(保留或未定义)EM_A[14]EM_BA[1]EM_A[0:13]EM_D[8:15]GPIO[46:53]
10008-bit SRAMEM_A[14]EM_BA[1]EM_A[0:13]EM_D[8:15]GPIO[46:53]
001016-bit SRAM/OneNANDEM_A[14]EM_BA[1]EM_A[0:13]EM_D[8:15]GPIO[46:53]
0000(保留或未定义)EM_A[14]EM_BA[1]EM_A[0:13]EM_D[8:15]GPIO[46:53]

关键解读与设计影响:

  1. NAND模式(1101)的特殊性: 当选择从NAND Flash启动时(BTSEL[1:0]=00),AECFG通常需设置为1101。此时,EM_A[14]和EM_BA[0]这两个引脚被复用为GPIO[54]和GPIO[55],而EM_BA[1]引脚未使用(表中未列出,通常也为GPIO)。这是因为标准的8位NAND Flash接口不需要额外的地址线(A14)和Bank地址线(BA0, BA1),这些引脚可以节省出来用作系统状态指示(如连接LED)或其他功能。而EM_D[8:15]高8位数据线在8位NAND模式下是不需要的,所以对应的GPIO[46:53]也得以释放。
  2. SRAM/OneNAND模式: 当使用16位宽度的SRAM或OneNAND时,需要完整的16位数据总线,因此EM_D[8:15]被用作数据线,GPIO[46:53]功能被占用。同时,EM_A[14]作为地址线第14位被使用。
  3. 硬件设计必须匹配: 这个表直接指导你的PCB布线。如果你计划使用NAND启动,那么硬件上可以将EM_A[14], EM_BA[0], EM_BA[1]以及GPIO[46:53]连接到其他器件(如LED、按键、其他外设),并在软件中将其配置为GPIO。反之,如果你需要连接16位SRAM,那么这些引脚就必须留给AEMIF,不能另作他用。
  4. 软件后续可覆盖: 复位时的AECFG配置只是初始状态。Boot ROM或你的Bootloader在运行时,完全可以通过写PinMux2寄存器来重新配置这些引脚的功能。例如,即使硬件上配置为NAND模式,启动完成后你也可以在软件中将GPIO[54]重新配置为EM_A[14]来扩展地址空间(如果硬件也连接了的话)。但硬件连接是前提,软件不能无中生有。

2.3 引脚复用配置的软件操作示例

假设我们在Bootloader中,需要将GPIO[20]和GPIO[21]配置为UART0的TX和RX功能(假设其复用控制位在PinMux3寄存器中)。

首先,我们需要查阅DM355的数据手册,找到PinMux3寄存器的内存映射地址(例如:0x01C4 0000)以及GPIO[20]和GPIO[21]对应的控制位域(例如,每2个比特控制一个引脚,00=GPIO,01=功能A,10=功能B)。

// 示例代码,地址和位域需以实际手册为准 #define PINMUX3_BASE (volatile unsigned int *)0x01C40000 #define PINMUX3_GPIO20_21_MASK (0x3 << 10) // 假设GPIO20控制位在[11:10],GPIO21在[13:12] #define PINMUX3_UART0_FUNC (0x1 << 10) // 假设01代表UART0功能 void configure_pinmux_for_uart0(void) { volatile unsigned int *pinmux3_reg = PINMUX3_BASE; unsigned int reg_val; // 1. 读取当前寄存器值 reg_val = *pinmux3_reg; // 2. 清除GPIO20和GPIO21的原有配置位 reg_val &= ~PINMUX3_GPIO20_21_MASK; // 3. 设置GPIO20和GPIO21为UART0功能 // 注意:这里需要为两个引脚都设置,假设它们连续且配置值相同 reg_val |= PINMUX3_UART0_FUNC; // 设置GPIO20 reg_val |= (PINMUX3_UART0_FUNC << 2); // 设置GPIO21,左移2位到下一个控制域 // 4. 写回寄存器 *pinmux3_reg = reg_val; // 5. (可选)添加内存屏障,确保配置生效后再操作外设 __asm__ volatile("" ::: "memory"); }

注意事项:配置的原子性与顺序在实际操作中,特别是像AEMIF这种涉及多个引脚、配置复杂的场景,建议将整个寄存器的目标值计算好,一次性写入,而不是多次读-修改-写操作。多次操作在极端情况下(如被中断打断)可能导致引脚状态出现瞬时冲突,虽然概率低,但在对稳定性要求极高的场合需要避免。另外,配置完引脚复用后,通常还需要配置这些引脚的上/下拉电阻、驱动强度等IO属性,这些在另外的寄存器中控制。

3. 复位(Reset)机制:种类、源头与影响分析

复位是让系统回到一个已知、确定状态的机制。DM355的复位系统设计精细,区分了不同严重程度和影响的复位类型,这对于系统故障恢复、低功耗管理和调试至关重要。

3.1 五种复位类型详解

根据你提供的Table 3-18,DM355支持五种复位,我们可以将其理解为五个不同级别的“重启”:

复位类型触发源 (Initiator)影响范围 (Effect)类比与使用场景
POR (上电复位)RESET引脚拉低TRST引脚拉低。完全复位(冷复位)。复位所有模块,包括存储器(如内部RAM内容丢失)和仿真逻辑。彻底关机再开机。适用于首次上电,或需要完全清除芯片所有状态的场景。TRST(测试复位)参与,确保了在仿真环境下也能彻底复位。
Warm Reset (热复位)RESET引脚拉低TRST引脚拉高(通常由ARM仿真器发起)。复位所有模块(包括存储器),除了ARM仿真逻辑系统级重启但保持调试连接。当系统跑飞,但需要通过仿真器(JTAG)保持连接进行调试时使用。内存内容会丢失。
Max Reset (最大复位)ARM仿真器看门狗定时器(WDT)。效果与Warm Reset相同。看门狗超时或主动触发。这是最常见的系统恢复机制。当软件死锁或异常时,看门狗超时产生此复位,让系统重启。仿真器也可主动发起。
System Reset (系统复位)ARM仿真器。复位所有模块,除了存储器和ARM仿真逻辑。它是一种软复位,保持内存内容,不影响时钟和电源状态。应用复位。想象成重启操作系统但不断电。当应用程序崩溃,但希望保留内存中的数据(如未保存的缓存)进行问题分析时,可使用此复位。
Module Reset (模块复位)ARM软件(写特定寄存器)。复位特定的某个外设模块。外设重启。某个外设(如UART、SPI)工作异常时,软件可以单独复位它,而无需重启整个系统,对系统其他部分无影响。

3.2 复位源与系统行为

  1. 外部复位引脚(RESET): 这是最基础的硬件复位。通常连接到一个电源监控芯片(如TPS3307)或手动复位按钮。当电源不稳定或按钮按下时,产生低电平脉冲,触发POR或Warm Reset(取决于TRST状态)。
  2. 看门狗定时器(WDT): 一个至关重要的可靠性设计。软件需要定期“喂狗”(清零WDT计数器)。如果软件因死循环、任务阻塞等原因未能及时喂狗,WDT超时就会产生一个Max Reset信号,强制系统重启,从软件故障中恢复。
  3. 仿真器(ARM Emulator): 通过JTAG接口,调试工具可以发起Warm Reset、Max Reset或System Reset,方便开发者进行调试。
  4. 软件复位: ARM核可以通过写系统控制模块中的寄存器来触发对自身或其他模块的复位。Module Reset就是典型的软件复位。

复位后的默认状态: 无论是POR、Warm Reset还是Max Reset之后,芯片都会进入一个默认的硬件配置状态。这个状态包括:

  • PLL被旁路(Bypass)且关闭,芯片直接使用外部输入的参考时钟(如24MHz晶振)。
  • 时钟系统处于最低速状态。
  • 绝大多数外设模块处于关闭或同步复位(SyncRst)状态。
  • 设备配置引脚(BTSEL, AECFG)的状态被锁存,用于决定启动模式和AEMIF初始配置。
  • 随后,Boot ROM代码开始执行,并根据锁存的配置进一步初始化系统。

实操心得:复位电路设计与调试

  • RESET引脚处理: 必须连接一个可靠的上拉电阻(通常10kΩ)到I/O电源(VDD_3V3)。复位信号应干净无毛刺,复位低电平脉冲宽度需满足芯片手册要求(通常几十毫秒)。使用专业的复位管理芯片比简单的RC电路更可靠,它能监控核心电压并在其异常时果断复位。
  • TRST引脚: 在非JTAG调试场合,必须通过一个下拉电阻(如4.7kΩ)可靠接地。如果悬空,其状态不确定,可能导致意外的Warm Reset行为,而非期望的POR。
  • 看门狗的使用: 在量产软件中务必启用看门狗。喂狗操作应放在主循环或关键任务中,但要避免在长时间关中断的代码段内喂狗。可以考虑使用独立的“看门狗任务”来监控其他关键任务的心跳。
  • 调试阶段的复位: 当通过JTAG连接芯片进行调试时,仿真器的复位操作(如点击IDE中的“Reset”)通常是发起System Reset或Warm Reset。这可能会清除你正在查看的内存变量(Warm Reset会)。如果需要保留内存现场分析问题,应使用调试器的“Halt”暂停CPU,而非复位。

4. 启动模式(Boot Mode)配置与流程全解析

启动配置是DM355上电后执行的第一段“剧本”,它决定了CPU从哪里、以何种方式获取并执行最初的代码。配置错误,后续所有工作都无法开展。

4.1 配置引脚:BTSEL[1:0]与AECFG[3:0]

这两个配置信息在复位信号的上升沿被芯片内部锁存,之后这些引脚就会恢复为AEMIF功能(EM_A[8:13]),不能再用于改变启动模式。

  1. BTSEL[1:0] - 启动选择

    • 00:从ROM启动(NAND模式)。强制跳转到内部ROM起始地址(0x00008000)执行。ROM中的引导加载程序(RBL)会读取BOOTCFG寄存器(可能由RBL根据其他条件设置),然后尝试从NAND Flash加载用户引导程序(UBL)。
    • 01:从AEMIF启动。强制跳转到AEMIF存储空间起始地址(0x02000000)执行。注意:这要求外部存储器(如OneNAND)必须连接在AEMIF的CE0片选空间,并且该存储器在复位后就能被AEMIF以默认低速时序访问。AEMIF不支持直接从NAND Flash执行代码(XIP),所以此模式主要用于Nor Flash或OneNAND。
    • 10:从ROM启动(MMC/SD模式)。跳转到内部ROM,RBL尝试从MMC/SD0接口加载UBL。
    • 11:从ROM启动(UART模式)。跳转到内部ROM,RBL尝试从UART0接口加载UBL。
  2. AECFG[3:0] - AEMIF引脚配置

    • 此配置仅在BTSEL[1:0]为00(NAND启动)或01(AEMIF启动)时起作用
    • 它决定了AEMIF相关引脚在复位后的初始功能,如前文Table 3-17所示,主要是为了适配NAND Flash或SRAM/OneNAND的硬件连接差异。
    • 例如,当BTSEL=00且AECFG=1101时,硬件认为连接的是8位NAND,并相应地将EM_A[14], EM_BA[0]等引脚初始化为GPIO。

4.2 详细启动流程与RBL行为

以最常用的NAND Flash启动(BTSEL=00)为例,详细流程如下:

  1. 硬件动作: 复位释放后,ARM核的PC指针被强制设置为0x00008000(内部ROM起始地址)。
  2. RBL执行: ROM Boot Loader开始运行。它首先进行一些最基本的芯片初始化(可能包括关闭看门狗、设置堆栈)。
  3. 读取BOOTCFG: RBL会读取一个内部寄存器(BOOTCFG),这个寄存器可能由芯片出厂固化,或由RBL根据GPIO状态等条件动态设置,以最终确定从NAND、MMC/SD还是UART加载。但通常BTSEL引脚已经指明了主要路径。
  4. 尝试NAND引导
    • RBL根据AECFG配置,初始化AEMIF控制器为NAND Flash访问模式(8位宽,使用EM_CE0)。
    • 它会在NAND Flash的第一个块(Block 0)中寻找有效的UBL镜像。UBL通常有一个特定的“Magic Number”(幻数)头部。
    • RBL支持ECC(错误校验与纠正),使用4位ECC算法。
    • 它尝试从NAND加载最多30KB的UBL代码到ARM的内部RAM(AIM,地址通常为0x00000000开始)。
    • 如果加载成功且校验通过,RBL会跳转到AIM中的UBL入口点,并将控制权交给UBL。
  5. 备用引导流程: 如果NAND引导失败(例如,找不到有效的Magic Number),RBL会按照预设的备用顺序尝试其他方式。根据你提供的流程图(Figure 3-6),顺序是:NAND -> MMC/SD -> USB -> (重试USB) -> UART -> (重试UART)。在尝试备用引导时,RBL会通过GPIO61引脚以不同的频率(4Hz或2Hz)翻转电平来指示状态,这可以连接一个LED用于调试。
  6. UBL及后续: UBL是用户编写的第二级引导程序,它负责更复杂的硬件初始化(如设置PLL提高时钟速度、初始化DDR2 SDRAM),然后从NAND、SD卡等介质加载更大的应用程序(如DSP固件、Linux内核)到DDR中,并最终跳转执行。

AEMIF启动(BTSEL=01)流程则更直接:硬件直接将PC指向0x02000000(AEMIF CE0空间),CPU开始从外部存储器取指执行。这就要求在AEMIF的CE0上连接支持XIP的存储器(如Nor Flash或OneNAND),并且该存储器中的代码必须自己负责初始化AEMIF控制器(因为复位后AEMIF时序极慢,约68kHz),然后进行后续的系统初始化。

4.3 启动模式配置的硬件设计与软件考量

硬件设计:

  • BTSEL[1:0]引脚: 必须通过电阻上拉或下拉到固定的电平(VDD或VSS),以确保复位时状态稳定。通常使用10kΩ电阻。例如,要配置为NAND启动(00),就将两个引脚都通过电阻下拉到地。
  • AECFG[3:0]引脚: 同样需要上拉/下拉电阻配置。其电平必须与PCB上实际连接的存储器类型严格匹配。如果板上焊的是8位NAND,就必须配置为1101。
  • GPIO61(Boot Status): 强烈建议在PCB上将此引脚连接到一个LED(串联限流电阻)。这是一个极其宝贵的调试手段。上电后LED的状态(常亮、常灭、闪烁)直接反映了RBL的执行阶段。
  • 存储介质连接
    • NAND Flash: 必须连接到AEMIF的CE0。数据宽度为8位(使用EM_D[0:7])。注意AECFG配置对EM_A[14]和EM_BA[0]引脚的影响,如果硬件上这些引脚连接了NAND的R/B#或WP#等信号,就需要根据AECFG配置在软件中重新映射。
    • OneNAND/SRAM: 也必须连接到CE0,数据宽度为16位(使用EM_D[0:15])。

软件(UBL/Bootloader)考量:

  • 时序初始化: RBL使用最保守的AEMIF时序(约68kHz)。你的UBL在开始与外部存储器高速通信(如从NAND加载内核到DDR)之前,必须根据所用存储器的数据手册,重新编程AEMIF的等待状态寄存器,设置正确的建立、保持和选通时间,以提高访问速度。
  • 引脚复用重配置: 如前所述,根据硬件设计,你可能需要在UBL中重新配置PinMux寄存器。例如,在NAND启动模式下,如果硬件将EM_A[14]连接到了一个状态LED,你可以在UBL中将其配置为GPIO输出,并控制其亮灭。
  • Magic Number与镜像结构: 你的UBL二进制文件必须在固定位置(通常是开头)包含RBL能识别的Magic Number(如0xA1ACED00,具体值需查手册)。同时,UBL的大小不能超过30KB(32KB IRAM减去RBL栈空间)。

常见问题与排查技巧实录

  1. 问题:板上电后毫无反应,GPIO61指示灯不亮。排查:
    • 首先检查电源、时钟、复位电路是否正常。用示波器测量核心电压(CVDD, 1.3V)、IO电压(VDD, 3.3V)、复位引脚(RESET,应为高电平)、晶振输出(24MHz)是否起振。
    • 确认BTSEL[1:0]和AECFG[3:0]的上拉/下拉电阻焊接正确,阻值符合设计(10kΩ),电平在复位瞬间稳定。
    • 检查TRST引脚是否已可靠下拉(如果不用JTAG)。
    • 如果以上均正常,可能是Boot ROM损坏(罕见),或芯片未正确初始化(检查电源时序)。
  2. 问题:GPIO61 LED闪烁几次后常灭,系统未启动。排查:
    • 闪烁模式是关键。根据文档,4Hz闪烁表示在尝试MMC/SD或USB引导,2Hz闪烁表示在尝试UART引导。常灭表示RBL执行完毕(无论成功与否)。如果闪烁后常灭但系统没运行,说明RBL尝试了备用引导但都失败了,最后可能跳转到了一个无效地址或死循环。
    • 检查主引导介质:如果配置为NAND启动,检查NAND Flash是否焊接良好,CE0片选信号是否正确连接。用编程器确认NAND的Block 0前几个扇区是否烧写了正确的、带有有效Magic Number的UBL镜像。
    • 检查UBL镜像:确认UBL镜像大小未超限,Magic Number正确,并且编译链接的入口地址是ARM内部RAM的地址(如0x00000000)。
  3. 问题:系统能从NAND启动UBL,但UBL在初始化DDR或切换高速时钟时死机。排查:
    • 这通常是UBL代码问题或硬件参数不匹配。重点检查:
      • PLL配置: 计算并设置的倍频、分频系数是否正确?PLL锁定是否通过查询锁定状态位确认?
      • DDR2/mDDR初始化序列: 是否严格按照存储器数据手册和DM355的DDR控制器要求,按顺序、有时延要求地配置了所有模式寄存器(MR)和控制器寄存器?时序参数(tRCD, tRP, tRAS, tRFC等)是否根据芯片型号和时钟速度正确计算并设置?
      • 电源稳定性: DDR电源(VDD_DDR, 1.8V)是否干净?纹波是否在允许范围内?上电时序是否符合要求?
    • 使用仿真器(JTAG)连接,在UBL初始化DDR和PLL的代码前后设置断点,单步调试,查看寄存器配置值,并测量相关时钟和电源信号。
  4. 问题:想切换启动模式(如从NAND改为SD卡),但修改BTSEL电阻后无效。排查:
    • 确认是在完全断电(包括所有电源轨)后进行的修改。仅软件复位或热复位不会重新采样BTSEL引脚。
    • 检查修改后的电阻焊接,确保与目标电平(VDD或VSS)连接可靠,无虚焊。
    • 使用万用表在板上电瞬间(或按住复位键时)测量BTSEL引脚电压,确认其为目标电平。

5. 复位与启动后的默认模块状态及电源管理初探

理解复位后芯片的默认状态,对于编写正确的初始化代码至关重要。根据你提供的Table 3-20,我们可以总结出一些规律:

  • AlwaysOn电源域: 表中所有模块的电源域都是“AlwaysOn”,这意味着在DM355上,电源管理主要是通过时钟门控(关闭模块时钟)和睡眠模式来实现,而非完全关闭模块电源。
  • 模块状态(Module State)
    • SyncRst: 大多数模块在复位后处于“同步复位”状态。这意味着该模块的时钟可能还在运行,但其内部逻辑被保持在复位状态,需要软件将其使能(Enable)后才能工作。
    • Enable: 少数关键模块在复位后根据BTSEL配置直接处于“使能”状态。例如:
      • EDMA (CC, TC0, TC1): 在NAND、OneNAND、UART启动模式下是Enable的,说明DMA控制器在启动过程中可能被RBL使用(例如从NAND加载数据到RAM)。
      • AEMIF: 在NAND、OneNAND、UART启动模式下是Enable的,因为需要访问外部存储器或配置接口。
      • UART0: 仅在UART启动模式(BTSEL=11)下为Enable,其他模式下为SyncRst。
      • TIMER0: 在所有启动模式下都是Enable的,因为它被RBL用于产生GPIO61的闪烁定时。
    • ARM、System Module、BUS: 这些核心模块始终是Enable的。

电源管理(Power Management): DM355的电源管理主要通过以下方式降低功耗:

  1. 时钟管理: 这是最主要的手段。每个模块都有独立的时钟使能位,不需要时可以关闭其时钟,消除动态功耗。PLL在不需要高速时钟时也可以关闭或进入旁路模式。
  2. ARM睡眠模式: ARM核支持Wait-for-Interrupt(WFI)指令,进入低功耗状态。
  3. 系统睡眠模式: 如Deep Sleep模式,可以停止所有设备时钟并关闭内部振荡器,将动态功耗降至最低,同时保持寄存器和内存内容。
  4. I/O管理: 可以关闭不用的USB PHY、视频DAC等模拟电路的电源。
  5. DDR管理: 可以将外部DDR存储器置于自刷新(Self-Refresh)或掉电(Power Down)状态。

在编写低功耗应用时,需要仔细规划各模块的工作时段,在不使用时及时关闭其时钟,并在系统空闲时让ARM进入睡眠模式,甚至让整个芯片进入Deep Sleep。同时,要处理好唤醒源(如定时器、外部中断、GPIO事件)的设置。

6. 64位Crossbar与EDMA控制器:数据搬运的引擎

DM355内部采用64位Crossbar(交叉开关)架构连接主设备(如ARM, VPSS, EDMA)和从设备(如ARM内部RAM, DDR, 配置总线)。这提供了高带宽、低延迟的内部互联,允许多个主设备并发访问不同的从设备。

EDMA(Enhanced Direct Memory Access)控制器是DM355数据搬运的核心,它独立于CPU工作,可以高效地在内存与外设、内存与内存之间传输数据,极大减轻CPU负担,对于视频、音频等大数据流处理至关重要。

  • 核心组成
    • 通道控制器(CC): 用户接口,管理64个DMA通道和8个QDMA通道。每个通道对应一个传输请求(Transfer Request),由事件(如外设发送完成、定时器溢出)或软件触发。
    • 传输控制器(TC): 实际执行数据传输的引擎。DM355有两个TC(TC0, TC1),可以并行工作。
    • 参数RAM(PaRAM): 存储每个通道的传输参数(源地址、目的地址、传输数量、索引等),非常灵活,支持乒乓缓冲、循环缓冲、通道链式触发等高级功能。
  • 同步事件: Table 3-23列出了所有64个DMA通道的默认事件映射。例如,通道2和3分别映射到ASP0的发送和接收事件,通道18和19映射到UART0的接收和发送事件。当这些外设产生中断事件时,可以自动触发相应的DMA传输,无需CPU干预。
  • 使用流程
    1. 配置PaRAM: 设置好一次传输的所有参数。
    2. 配置通道: 将通道与特定事件关联(对于事件触发的DMA),或设置为手动触发。
    3. 使能通道/事件: 当外设事件发生或软件写入触发寄存器时,EDMA CC会将传输请求提交给TC。
    4. TC执行传输: 从源地址读取数据,写入目的地址,完成后可产生中断或触发另一个通道(链式)。

在视频处理中,EDMA被大量用于将摄像头数据从视频端口搬运到DDR中的帧缓冲区,或将处理后的帧从DDR搬运到显示控制器。正确配置和使用EDMA是发挥DM355媒体处理能力的关键。

我个人在多个基于DM355的项目中体会到,引脚复用、复位和启动配置是硬件与底层软件交汇的“握手区”。硬件工程师必须根据选定的启动介质和外围电路,正确设置BTSEL和AECFG的电阻网络,并规划好复用引脚的第二功能。而软件工程师则必须深刻理解这些硬件配置带来的初始状态,在Bootloader中准确地完成从默认状态到目标运行状态的切换。其中任何一个环节的疏忽,都可能导致令人困惑的启动失败。最好的实践是,在PCB投板前,硬件和软件团队就一起评审原理图,特别是这些配置引脚和关键复用引脚的使用方式,并形成一份明确的《启动配置与引脚复用表》作为共同遵循的文档。这样能最大程度避免后续的联调障碍。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/26 12:47:38

护眼宝:智能用眼防护工具的技术解析与应用

1. 项目概述&#xff1a;护眼宝防护神器的核心价值盯着电脑屏幕连续工作三小时后&#xff0c;我的眼球开始发干发涩&#xff0c;视线也变得模糊——这是去年体检时医生警告我"视频终端综合征"的前兆。护眼宝这类工具的出现&#xff0c;正是为了解决现代办公族这种&qu…

作者头像 李华
网站建设 2026/7/26 12:45:13

PyQtDarkTheme终极指南:如何为PySide和PyQt打造现代扁平化界面

PyQtDarkTheme终极指南&#xff1a;如何为PySide和PyQt打造现代扁平化界面 【免费下载链接】PyQtDarkTheme A flat dark theme for PySide and PyQt. 项目地址: https://gitcode.com/gh_mirrors/py/PyQtDarkTheme PyQtDarkTheme是一款专为PySide和PyQt框架设计的现代扁平…

作者头像 李华
网站建设 2026/7/26 12:45:09

LERF 可视化工具使用指南:如何生成高质量 Relevancy Maps?

LERF 可视化工具使用指南&#xff1a;如何生成高质量 Relevancy Maps&#xff1f; 【免费下载链接】lerf Code for LERF: Language Embedded Radiance Fields 项目地址: https://gitcode.com/gh_mirrors/le/lerf LERF&#xff08;Language Embedded Radiance Fields&…

作者头像 李华
网站建设 2026/7/26 12:44:41

libxml2核心功能详解:验证、XPath与命名空间实战

libxml2核心功能详解&#xff1a;验证、XPath与命名空间实战 【免费下载链接】libxml2 Read-only mirror of https://gitlab.gnome.org/GNOME/libxml2 项目地址: https://gitcode.com/gh_mirrors/lib/libxml2 libxml2是一款功能强大的XML解析库&#xff0c;提供了XML验证…

作者头像 李华
网站建设 2026/7/26 12:43:19

零代码配置+动态权限路由+多模态推送,企业级AI报表分发系统搭建全链路(附银行/零售行业脱敏架构图)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;AI 自动化报表分发 在现代数据驱动型企业中&#xff0c;报表分发已从人工邮件转发演进为端到端智能流程。AI 自动化报表分发系统通过自然语言理解、时序模式识别与动态受众建模&#xff0c;实现“谁需要、何时…

作者头像 李华
网站建设 2026/7/26 12:40:05

下一代AI自动化框架:深度解析Midscene的技术架构与最佳实践

下一代AI自动化框架&#xff1a;深度解析Midscene的技术架构与最佳实践 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene Midscene.js是一款革命性的跨平台AI自动化…

作者头像 李华