TMS320C6424 DSP核心架构、内存与外设接口深度解析与实战 1. 项目概述为什么选择TMS320C6424在嵌入式信号处理领域选型往往是一场性能、功耗、成本和开发周期的博弈。十多年前当我第一次接触德州仪器TI的C6000系列DSP时就被其标榜的“VelociTI”超长指令字VLIW架构所吸引但真正让我在多个工业视觉和通信项目中坚定选择TMS320C6424这颗器件的远不止纸面参数那么简单。TMS320C6424是一颗基于C64x内核的高性能定点数字信号处理器。说“高性能”可能有些抽象我们换个说法在700MHz的主频下它的峰值处理能力能达到5600 MIPS百万条指令每秒或者更直观的每秒能完成2800M次16位乘累加MAC运算。这意味着什么意味着它能在1毫秒内轻松完成一个1024点的复数FFT快速傅里叶变换运算并且还有充足的余量去处理网络协议栈或执行控制逻辑。这种处理能力对于需要实时处理高带宽数据流的应用比如软件无线电SDR、多通道音频编解码、机器视觉中的图像预处理或者工业振动监测是至关重要的基础。但性能只是硬币的一面。C6424真正体现其设计智慧的地方在于其平衡性。它没有一味追求最高的主频而是在架构、内存系统和外设集成上做了精心设计。其核心的C64x CPU拥有8个高度独立的功能单元两个乘法器、六个算术逻辑单元在一个时钟周期内能并行执行多达8条32位指令。这种并行性不是靠运气而是靠编译器对指令的智能打包Instruction Packing和硬件对非对齐内存访问的支持来实现的这直接让我们的C代码在优化后能榨出更多的硬件性能。更让我青睐的是其内存架构。它采用了二级缓存L1P, L1D, L2与片上RAM混合的灵活设计。L1程序缓存L1P有32KBL1数据缓存L1D有80KB其中32KB可配置为缓存而统一的L2缓存/内存高达128KB。在项目初期我们可以将大部分关键数据和代码锁定在片上RAM中实现零等待访问确保最核心的循环代码达到极限速度。随着算法复杂化再动态调整L1和L2的缓存分配策略。这种灵活性避免了因内存瓶颈导致的性能断崖式下跌是长期项目迭代中的“安全气囊”。最后它的外设集堪称豪华且务实。一个10/100M以太网MACEMAC带MDIO管理让设备轻松接入网络一个32位33MHz的PCI接口为需要与主机进行高速数据交换的板卡设计如采集卡提供了标准桥梁两个多通道缓冲串行端口McBSP和一个多通道音频串行端口McASP直接面向语音、音频和电信接口还有增强型DMAEDMA3控制器拥有64个独立通道能在没有CPU干预的情况下在外设、内存之间高效搬运数据将CPU彻底解放出来专注于算法运算。这些外设不是简单的堆砌它们通过一个高效的交换中心资源Switched Central Resource互联协同工作时数据通路非常清晰。所以如果你正在寻找一颗能够应对复杂实时信号处理、同时需要丰富连接性和稳定可靠性的定点DSPTMS320C6424绝对是一个需要你认真评估的选项。它尤其适合那些算法密集型、对数据处理吞吐量和实时性有严苛要求且系统功能相对复杂的嵌入式应用。2. 核心架构深度解析C64x内核与内存系统2.1 C64x CPU内核VLIW架构的精髓C64x内核是TI C6000 DSP平台的性能担当其灵魂在于VelociTI.2 VLIW架构。与传统的标量或超标量处理器不同VLIW处理器依赖编译器在编译时就将多条可以并行执行的指令打包成一个“超长指令字”然后由硬件在同一周期内发射到多个功能单元上执行。C6424的CPU包含两个数据通路Data Path A和B每个通路有四个功能单元.L, .S, .M, .D和一个包含32个32位寄存器的寄存器文件。具体来看.M单元乘法器这是DSP的算力核心。C64x的.M单元功能极其强大每个周期可以完成一次32x32位乘法、两次16x16位乘法产生32位结果、或四次8x8位乘法。特别值得一提的是它对复数乘法的硬件支持。一条CMPY指令就能处理两组16位的复数输入实部虚部直接输出32位的实部和虚部结果。在做通信算法如调制解调、波束成形时这能带来数倍的性能提升。.L单元算术逻辑单元与.S单元算术/逻辑/分支单元负责常规的加、减、比较、移位、逻辑运算等。C64x增强了并行加减能力例如ADD2指令可以在一个周期内同时完成两个16位数的加法这对于图像处理中的像素操作非常有用。.D单元数据存取单元负责加载Load和存储Store操作。它支持非对齐的内存访问这在处理来自网络或ADC的打包数据流时避免了繁琐的数据重组操作提升了效率。实操心得编译器是关键光有强大的硬件没有聪明的编译器也是徒劳。TI的C编译器当时是CCS v3.3及以上版本配套的是发挥C64x性能的钥匙。你必须学会给编译器“提示”使用restrict关键字明确告诉编译器指针所指的内存区域不重叠编译器才能大胆地进行向量化优化。内联函数intrinsics对于最核心的循环直接使用C64x特有的内联函数来替代C运算符。例如用_dotp2来做16位数据的点积用_pack2来打包数据。这能生成最接近手写汇编效率的代码。循环展开与软件流水编译器能自动进行一定程度的软件流水但对于最关键的循环手动进行适度的循环展开例如4次或8次可以帮助编译器更好地调度指令填满8个功能单元。2.2 多层次内存架构性能与灵活性的权衡C6424的内存子系统是其高性能的基石理解并正确配置它是项目成功的关键。L1缓存/RAM这是离CPU最近的内存速度最快。L1P程序缓存32KB。可配置为全缓存、全RAM或混合模式。对于要求绝对确定性的实时任务我通常将最关键的、要求零等待的代码段如中断服务程序、最内层循环通过链接器命令文件.cmd直接分配到L1P RAM区域确保执行时间恒定。L1D数据缓存80KB其中48KB是固定RAM32KB可配置。我通常将频繁访问的系数表如FFT旋转因子、状态变量或DMA描述符放在L1D RAM中。对于较大的、访问模式不规则的数据集则启用L1D缓存。L2统一缓存/RAM128KB。这是片上最大的存储区也是缓存和RAM的混合体。它是调节系统性能的“总阀门”。默认上电后Bootloader会将其配置为全RAM除非是EMIFA直接引导模式。在应用初始化时你需要根据需求重新配置。配置实战缓存与RAM的分配通过写L2CFG,L1PCFG,L1DCFG寄存器来配置。例如在一个音频处理系统中我有多个并行的音频处理算法代码量较大但每个算法的核心循环很小。我的配置策略是L2配置为64KB缓存 64KB RAM。缓存用于缓存从外部DDR2加载的算法代码和数据RAM部分用于存放各算法模块间的共享数据和中间结果缓冲区。L1P配置为全缓存。因为我的核心循环代码已经通过#pragma CODE_SECTION指令放置到了专用的段并链接到了L1P RAM其他不常执行的代码就交给缓存。L1D前48KB固定RAM存放实时音频流缓冲区Ping-Pong Buffer和滤波器系数后32KB配置为缓存用于加速对其他全局变量的访问。// 示例配置L2为128KB全RAM常用在初始阶段或对确定性要求极高的场合 *(volatile unsigned int *)0x01840000 0x0; // L2CFG.L2MODE 0 // 配置L1D后32KB为缓存 *(volatile unsigned int *)0x01840040 0x7; // L1DCFG.L1DMODE 7 (32KB cache)注意缓存操作如无效化、写回需要仔细处理特别是在使用DMAEDMA与CPU共享数据时。CPU修改了缓存中的数据后必须写回Writeback内存EDMA才能看到新数据反之EDMA从外设搬来新数据到内存后必须无效化InvalidateCPU对应的缓存行CPU才能读到新数据。忘记这一步是导致数据不同步的最常见“坑”。2.3 增强型DMAEDMA3数据搬运的引擎如果说CPU是大脑那EDMA3就是不知疲倦的四肢。它拥有64个独立通道和8个QDMA快速DMA通道能够处理复杂的数据传输序列而无需CPU介入。EDMA3的核心概念是传输控制器TC和参数集PaRAM。每个通道关联一个参数集里面定义了源地址、目的地址、传输数量、索引等。EDMA3支持多种传输模式单次传输最简单的一次性传输。连续传输用于搬运一块连续数据。链式传输Chaining一次传输完成自动触发下一次传输用于处理复杂的数据流比如将ADC来的数据先搬到缓冲区A处理后再由EDMA搬到发送缓冲区B整个过程形成一个链。乒乓传输利用两个参数集和链接功能实现双缓冲是实时流处理如音频、视频的标配能实现无缝数据流。一个典型应用音频采集与播放假设我们使用McASP接收音频数据并通过McBSP发送出去。配置McASP和McBSP设置好串行参数采样率、字长等。设置EDMA参数集参数集A源地址 McASP数据接收寄存器目的地址 缓冲区A传输数量 一帧音频样本数。参数集B源地址 McASP数据接收寄存器目的地址 缓冲区B。参数集C源地址 缓冲区A处理后的数据目的地址 McBSP数据发送寄存器。参数集D源地址 缓冲区B目的地址 McBSP数据发送寄存器。建立链接配置参数集A完成后链接到BB完成后链接回A形成一个接收循环。同样C和D形成一个发送循环。触发将McASP的接收事件和McBSP的发送事件分别映射到EDMA的某个通道。这样每当McASP收到一个字EDMA就自动将其搬走每当McBSP准备好发送EDMA就自动送上数据。整个过程CPU只需要在缓冲区满通过EDMA传输完成中断感知时对缓冲区内的音频数据进行算法处理如滤波、混音实现了高效的流水线操作。3. 关键外设接口与应用实战3.1 外部存储器接口DDR2与异步EMIFAC6424提供了两个外部存储器接口这是连接外部大容量存储的关键。DDR2 SDRAM控制器这是高性能的同步接口支持16位或32位总线宽度最高时钟频率达166MHz数据速率333MT/s可寻址256MB空间。它用于连接大容量、高速的片外内存存放程序代码、大量数据或帧缓冲区。配置要点时序参数计算这是最易出错的地方。需要根据具体DDR2芯片的数据手册计算并设置控制器中的SDRAM_TIMING、SDRAM_CONFIG等寄存器。关键参数包括tRAS行有效至预充电时间、tRCD行到列延迟、tRP预充电时间、tRFC刷新周期等。TI的SPRUEX8文档提供了参考计算但必须根据你的内存芯片型号进行校准。电平与阻抗匹配DDR2接口是1.8V SSTL_18电平需要严格的PCB布线约束包括控制走线阻抗通常50欧姆、等长布线数据组内、地址/控制组内以减少时序偏移。初始化序列DDR2上电后必须遵循严格的初始化流程稳定电源与时钟 - 发送NOP命令 - 预充电所有bank - 执行多个自动刷新 - 设置模式寄存器MR。C6424的DDR2控制器通常会在Bootloader或用户代码中完成大部分步骤但你仍需确保提供的参数正确。异步EMIFA这是一个16位宽、支持SRAM、NOR Flash、NAND Flash等异步器件的接口。它提供了4个片选CS2-CS5每个有独立的时序可配置寄存器CE2CFG-CE5CFG。连接NOR Flash启动的实战 假设我们使用一片16位宽的NOR Flash如AM29LV320D存放启动代码和应用程序连接到EMIFA的CS2。硬件连接将Flash的地址线[A21:1]连接到DSP的EMA_A[21:1]注意DSP的EMA_A[0]通常不用因为按16位访问数据线[D15:0]连接到EMA_D[15:0]。控制信号CE#接EMA_CS[2]OE#接EMA_OEWE#接EMA_WE。时序配置这是核心。需要根据Flash的读/写周期时间设置EMIFA的建立Setup、选通Strobe、保持Hold时间。例如Flash的读访问时间为90nsEMIFA时钟假设为100MHz周期10ns。我们需要配置CE2CFG寄存器READ_SETUP 2 (20ns setup)READ_STROBE 9 (90ns strobe width) *注意Strobe周期数需要根据公式计算可能需考虑内部延迟。READ_HOLD 1 (10ns hold)WRITE_SETUP,WRITE_STROBE,WRITE_HOLD类似配置。TATurn Around时间也需要设置防止总线冲突。引导配置设置DSP的BOOTMODE引脚选择从EMIFA ROM引导BOOTMODE[3:0] 0100。上电后ROM Bootloader会从EMIFA CS2空间的0x4200 0000地址读取1KB的引导表根据其中的内容如代码尺寸、入口点将程序拷贝到内部RAM运行。踩坑记录EMIFA的时序配置寄存器单位是EMIFA时钟周期。务必确认你的EMIFA时钟ECLKIN或分频后的时钟频率并仔细计算。初期我因为把READ_STROBE算少了一个周期导致读Flash数据不稳定调试了很久。建议先用保守较大的时序参数让系统跑起来再逐步优化。3.2 通信接口以太网MACEMAC与PCI10/100 Mbps以太网MACEMAC这是一个全硬件实现的MAC层控制器支持MII和RMII介质无关接口。你需要外接一个物理层芯片PHY如DP83848来完成以太网通信。开发要点驱动与协议栈TI通常会提供NDKNetwork Developer‘s Kit或lwIP这样的轻量级TCP/IP协议栈。集成时关键是为EMAC和MDIO用于管理PHY编写底层驱动主要包括PHY初始化通过MDIO接口两根线MDIO和MDC读写PHY寄存器设置自协商、速度、双工模式等。EMAC初始化配置MAC地址、工作模式半/全双工、使能接收/发送。描述符链表EMAC使用描述符来管理数据包缓冲区。你需要初始化一组接收描述符和发送描述符形成链表。每个描述符指向一个数据缓冲区并包含包长度、状态等信息。数据流当收到一个数据包EMAC会将其DMA到描述符指定的缓冲区然后产生中断。中断服务程序ISR需要处理该描述符将数据交给上层协议栈并回填一个新的空缓冲区到描述符中以接收下一个包。发送过程类似。性能考量对于100Mbps全双工线速包处理时间非常紧张。建议将EMAC的中断服务程序放在L1P RAM中执行并使用EDMA来协助搬运大数据包减轻CPU负担。32位33MHz PCI接口这允许C6424作为主设备或从设备接入标准的PCI总线。这在工业计算机插卡如数据采集卡、处理卡中很常见。作为PCI从设备Target的配置PCI配置空间C6424的PCI模块实现了标准的PCI配置空间头Header。你需要在上电初始化时通过I2C EEPROM或由主机Host来配置其中的设备ID、厂商ID、基地址寄存器BAR等信息。BAR定义了DSP内部存储器或寄存器映射到主机PCI地址空间的窗口。地址映射例如你可以将DSP内部L2 RAM的一段空间如0x10800000 - 0x1080FFFF通过BAR0映射到主机的PCI内存空间。这样主机就能像访问本地内存一样直接读写DSP的这段内存实现高速数据交换。中断DSP可以通过PCI总线向主机发送中断如使用INTA#引脚通知主机数据准备好或请求服务。DMA更高效的模式是使用DMA。主机可以配置DSP的EDMA控制器通过PCI BAR映射的寄存器让EDMA在DSP内部或DSP与主机内存之间搬运数据完全不需要CPU参与。重要警告数据手册中特别提到在PCI时钟PCICLK不活动时访问某些PCI寄存器可能导致设备挂起。这意味着如果你的板卡设计是DSP作为从设备且主机可能随时移除PCI时钟例如在热插拔或主机进入低功耗状态时你必须确保DSP的代码不会在此期间去访问PCI控制寄存器。一种常见的做法是将访问PCI寄存器的代码放在确认PCICLK有效的中断服务例程中或者通过监控某个PCI状态位来确保安全。3.3 串行音频与数据接口McASP与McBSP多通道音频串行端口McASP这是一个高度可配置的音频专用接口支持I2S、TDM、DITS/PDIF等多种格式。它有4个串行器可以同时处理多路音频流。配置I2S主模式为例 假设我们需要将C6424配置为I2S主设备通过McASP0连接一个音频编解码器如TLV320AIC3106实现立体声24位音频输入输出。引脚复用首先在PINMUX寄存器中将相关引脚配置为McASP功能AXR[3:0]作为数据线ACLKX/ACLKR作为位时钟AFSX/AFSR作为帧同步。时钟配置设置McASP的输入时钟源和分频器。例如如果要求生成48kHz采样率、24位数据、I2S格式左右通道各32位时隙共64位帧则位时钟BCLK 48kHz * 64 3.072 MHz。我们需要配置McASP的时钟分频寄存器从输入时钟如来自PLL的AUXCLK分频得到这个BCLK。格式配置设置XFMT/RFMT寄存器数据延迟I2S是1位延迟、位序MSB first、字长24位、符号扩展等。设置DIR寄存器配置每个串行器是发送还是接收。例如串行器0发送左声道串行器1发送右声道串行器2接收左声道串行器3接收右声道。设置TDM寄存器配置时隙长度和每个串行器在TDM帧中的位置对于I2S就是简单的双时隙模式。DMA连接将McASP的发送/接收事件映射到EDMA通道。为每个活动的串行器设置独立的EDMA参数集分别搬运左右声道的数据。多通道缓冲串行端口McBSP这是一个更通用的同步串行接口除了音频还广泛用于连接编解码器、模拟前端AFE或作为SPI主设备。配置为SPI主设备 McBSP可以通过设置SPCR寄存器中的CLKSTP位和PCR寄存器中的CLKXP/CLKRP等模拟SPI协议。时钟极性与相位通过CLKXP和CLKRP设置CPOL和CPHA与从设备匹配。数据长度通过RWDLEN设置字长如8位或16位。帧同步SPI通常使用连续的帧同步即每个字都是一个帧。可以将McBSP配置为忽略帧同步FSGM0或由数据发送本身产生帧同步。连接McBSP的CLKX作为SPI SCKDX作为MOSIDR作为MISOFSX可作为片选CS需要额外配置GPIO来手动控制或利用McBSP的帧同步在每帧开始时有效。4. 系统设计与调试经验实录4.1 电源、时钟与复位设计电源设计C6424需要多路电源核心电压CVDD1.2V或1.05V、I/O电压DVDD181.8V和DVDD333.3V、DDR2接口电压DDR2_VREF等。必须遵循数据手册的上电/掉电时序要求通常要求核心电压先于或与I/O电压同时上电且I/O电压不能超过核心电压0.4V以上。使用TI推荐的电源管理芯片如TPS系列并仔细布局旁路电容每个电源引脚附近一个0.1uF陶瓷电容是稳定工作的基础。时钟系统C6424有两个PLL控制器PLL1和PLL2。PLL1通常用于产生DSP核心时钟SYSCLK1和大部分外设时钟。PLL2可用于产生特定的外设时钟如EMAC、PCI的独立时钟。参考时钟外部晶振或时钟源连接到MXI/CLKIN引脚。频率通常在15-30MHz之间。配置流程上电后PLL处于旁路模式。软件需要先配置PLL控制器PLLCTL的倍频、分频系数然后使能PLL。等待PLL锁定查询PLLSTAT寄存器后再切换时钟源选择器将系统时钟从旁路时钟切换到PLL输出。务必遵循这个顺序否则会导致系统运行在不可预测的频率下。复位与引导RESET引脚需要保持低电平足够长时间见数据手册的t_{rst}参数确保内部电路稳定复位。复位释放后DSP会采样BOOTMODE[3:0]引脚的状态决定引导方式。常见的引导方式包括EMIFA ROM引导从外部Flash启动。HPI引导通过主机接口由外部主机加载代码。以太网引导通过EMAC从网络加载需要Bootloader支持。PCI引导通过PCI接口从主机加载。调试技巧在开发板上通常通过跳线或拨码开关设置BOOTMODE。第一次调试时建议先使用仿真器JTAG直接加载程序绕过引导过程快速验证硬件和基础软件。确认基本系统时钟、电源、SDRAM工作正常后再测试引导流程。4.2 常见问题与排查指南在多年的项目开发中我总结了一些C6424平台上最常见的问题及其排查思路问题现象可能原因排查步骤与解决方案程序跑飞或死机1. 电源纹波过大或时序不符。2. 时钟配置错误PLL未锁定。3. 缓存一致性未处理CPU与EDMA共享数据。4. 中断向量表未正确设置或中断服务程序ISR处理有误。5. 堆栈溢出。1. 用示波器测量各电源轨的纹波确保在上电和动态负载下均稳定。2. 检查PLL配置寄存器确认锁定状态位PLLSTAT.LOCK是否为1。3. 在EDMA与CPU共享的内存区域使用Cache_wbInv或Cache_inv函数维护缓存一致性。4. 确认中断向量表正确链接到内存地址0或重定位地址ISR中及时清除中断标志。5. 增大链接器命令文件.cmd中的堆栈段.stack大小。DDR2内存访问失败1. DDR2时序参数配置错误。2. PCB布线不符合时序要求信号完整性差。3. 电源VDDQ, VTT不稳定。4. 上电初始化序列不完整。1. 使用TI提供的DDR2配置工具或仔细核对计算出的寄存器值。2. 检查PCB确保数据线、地址/控制线组内等长阻抗匹配。用示波器看DQS和DQ信号的眼图。3. 测量DDR2相关电源电压和参考电压VREF。4. 确保严格按照数据手册的初始化步骤上电稳定-CKE拉高-发送NOP-预充电-多个刷新-模式寄存器设置。EMAC网络不通1. PHY芯片未正确初始化MDIO通信失败。2. EMAC的MAC地址未设置或设置错误。3. 接收/发送描述符链表未正确初始化或已满/已空。4. 网络变压器或RJ45连接问题。1. 用逻辑分析仪抓取MDIO/MDC信号确认能正确读写PHY的ID寄存器。2. 检查MACSRCADDRLO/HI寄存器是否正确写入MAC地址。3. 在EMAC中断服务程序中仔细检查描述符的OWN位所有权位和EOP位包结束位。确保处理完数据包后将描述符交还给EMAC置OWN1。4. 检查硬件连接替换网线测试。McASP/McBSP无数据1. 引脚复用未配置为串行口功能。2. 时钟位时钟、主时钟未产生或频率不对。3. 帧同步信号极性或相位错误。4. DMA未正确配置或未启动。1. 检查PINMUX寄存器对应位的值。2. 用示波器测量ACLKX, ACLKR, AHCLKX等引脚是否有时钟输出频率是否符合预期。3. 用示波器同时测量帧同步和数据线确认数据在正确的边沿和时隙内。4. 检查EDMA参数集的源/目标地址是否正确传输计数是否匹配通道是否已使能并正确映射到串行口事件。通过JTAG无法连接1. JTAG接口TCK, TMS, TDI, TDO连接错误或信号弱。2. DSP未正确复位或处于低功耗模式。3.TRST信号未正确处理应上拉并在复位时保持低电平。4. 仿真器驱动或CCS配置问题。1. 检查JTAG链路上所有信号线的连接确保电阻上拉/下拉正确。对于长电缆可能需要缓冲器。2. 测量RESET引脚确认已释放为高电平。检查PLLCTL寄存器确认DSP不在旁路模式且时钟正常。3. 确保TRST引脚有上拉电阻通常10kΩ并且在系统复位期间为低。4. 尝试不同的仿真器XDS100v2, XDS560等或重新安装CCS和仿真器驱动。4.3 性能优化与功耗管理性能优化剖析与定位首先使用CCS的Profiler工具或时钟周期计数器TSCH/TSCL寄存器找到代码中的热点Hot Spot。80%的时间往往消耗在20%的代码上。内存优化将关键代码和数据放入L1使用#pragma CODE_SECTION和DATA_SECTION配合精心编写的链接器命令文件.cmd将最频繁执行的循环和访问的数据放入L1P和L1D RAM。利用L2缓存对于较大的、访问有一定局部性的数组确保它们被L2缓存覆盖。调整L2CFG的L2MODE在缓存大小和RAM大小之间取得平衡。避免缓存抖动如果数据集远大于缓存容量且访问模式是完全随机的考虑直接关闭缓存使用EDMA进行预取或搬移采用“乒乓缓冲区”策略。编译器优化使用-o3或-o2优化等级。尝试-mt选项假设没有数据别名问题以进行更激进的优化。查看编译器生成的汇编代码-k选项保留汇编文件确保关键循环已被软件流水化汇编代码注释中会出现“Software pipelining loop”。功耗管理 C6424提供了多种省电模式通过PWR_CTL寄存器控制。IDLE模式CPU停止执行指令但外设和时钟仍运行。可通过中断唤醒。适用于等待外部事件的场景。STANDBY模式比IDLE更深度的睡眠部分时钟可能被关闭。唤醒时间较长。SLEEP模式最省电的模式PLL被关闭仅保持唤醒逻辑供电。通常需要通过特定的唤醒引脚或事件来唤醒。使用建议在实时性要求不高的间歇工作系统中可以在任务间隙调用IDLE指令进入IDLE模式。在设计外设驱动时如果某外设暂时不用应关闭其时钟通过对应的外设时钟控制寄存器这能带来可观的动态功耗节省。