TI CC26x0/CC13x0 AES硬件加密实战:从FCFG寄存器到DMA配置详解 1. 项目概述与核心价值在嵌入式物联网和无线通信设备里数据安全从来都不是一个可选项而是产品设计的基石。无论是智能门锁的密钥传输还是穿戴设备的心率数据同步一旦数据在传输过程中被截获或篡改后果都不堪设想。因此硬件集成的加密模块比如德州仪器TICC26x0/CC13x0系列芯片里的AES高级加密标准加密处理器就成了我们这些嵌入式开发者的“安全卫士”。它的价值在于把繁重的加解密计算从通用CPU上卸载下来由专门的硬件电路并行处理不仅速度快、功耗低更重要的是能确保实时性不会因为加密运算而阻塞主控芯片的其他关键任务。然而用好这个“卫士”并不只是调用几个API那么简单。很多开发者尤其是刚接触硬件加密的同行往往只关注算法本身比如ECB、CBC模式怎么选却忽略了让这个硬件模块正确、高效工作的两个地基寄存器配置和DMA直接内存访问数据传输。寄存器配置尤其是芯片出厂时已经写好的工厂配置FCFG决定了加密模块的时钟精度、功耗基准等底层特性是硬件稳定运行的“出厂设定”。而DMA控制器则是连接加密引擎和系统内存的“高速公路”配置不当就会成为性能瓶颈甚至导致数据错乱。本文将以TI CC26x0/CC13x0的AES模块为蓝本深入“芯片数据手册”通常语焉不详的细节地带。我会结合自己在实际项目中的调试经历带你从两个最容易被忽视的工厂配置寄存器FREQ_OFFSET和CAP_TRIM说起理解它们如何影响模块的基准状态。然后我们会把重点放在DMA控制器的配置逻辑和与AES引擎的联动上拆解从启动一次加密到数据完整搬移的全过程。无论你是正在评估芯片加密性能的架构师还是苦于调试加密数据流的一线工程师相信这些从寄存器位到数据流的硬核分析都能给你带来直接的参考价值。2. 硬件加密模块的基石工厂配置FCFG寄存器深度解析在开始配置AES引擎和DMA之前我们必须先理解芯片的“先天体质”。TI的CC26x0/CC13x0系列芯片内部有一块特殊的存储区域用于存放出厂校准数据这就是工厂配置Factory Configuration, FCFG。这部分数据在芯片生产测试阶段被写入通常是只读的Read-Only软件无法修改只能读取。它们为内部各种模拟模块如振荡器、电源管理提供了关键的校准参数确保芯片在不同工艺角、电压和温度下都能稳定工作。对于AES模块而言虽然不直接参与加密运算但系统时钟的稳定性和功耗管理策略会间接影响其工作状态和系统整体功耗。2.1 FREQ_OFFSET寄存器高精度振荡器的微调之手FREQ_OFFSET寄存器偏移地址0x390是高频振荡器HPOSC的频率补偿寄存器。数据手册中它的三个字段HPOSC_COMP_P0、HPOSC_COMP_P1、HPOSC_COMP_P2都被标记为“Internal. Only to be used through TI provided API.”。这行说明非常关键它告诉我们两件事第一这些是芯片内部自用的校准值第二用户不应直接操作而应通过TI提供的驱动API如TI-RTOS或SimpleLink SDK中的相关函数来间接利用这些值。它的作用原理是什么芯片内部的高频振荡器是系统主时钟的来源之一。由于半导体制造工艺的微小偏差每一颗芯片振荡器的实际频率与设计标称值之间都存在细微的差异。在生产测试环节测试设备会测量这个偏差并计算出一组补偿值Trim Value写入FREQ_OFFSET寄存器。芯片上电初始化时系统固件Bootloader或驱动会读取这些值并配置时钟生成模块对振荡器的输出频率进行微调使其尽可能接近标称值如48MHz。一个稳定的时钟源对于AES模块至关重要因为其加密操作是严格按时钟周期进行的。时钟频率的漂移虽然不会导致加密算法错误算法是数字逻辑但可能影响加密完成的时序预测在极端情况下如果时钟偏差过大导致时序违例甚至可能引发模块工作异常。实操心得在实际开发中我们几乎不需要直接读取这个寄存器。但当你发现系统定时器不准或射频通信的时钟同步有问题时可以检查一下TI的时钟驱动初始化代码是否正确读取并应用了这些FCFG参数。确保你使用的SDK版本与芯片型号完全匹配因为不同批次的芯片其FCFG数据格式可能微调。2.2 CAP_TRIM寄存器射频相关的电容校准CAP_TRIM寄存器偏移地址0x394包含FLUX_CAP_0P28_TRIM和FLUX_CAP_0P4_TRIM字段。从命名“FLUX_CAP”可以推断它与射频RF部分的电容阵列校准有关 likely用于调整射频内核中某些关键节点的电容值以优化射频性能如发射功率、接收灵敏度。同样它的描述也是“Internal. Only to be used through TI provided API.”为什么AES模块需要关心射频校准在CC26x0/CC13x0这类无线MCU中AES模块常常用于加密即将通过射频发送的数据如蓝牙配对信息、ZigBee应用数据。虽然AES模块本身是数字域独立于射频模拟前端但整个芯片共享电源和时钟域。射频部分工作时可能会引入电源噪声一个经过良好校准、工作稳定的射频模块其电源管理更平滑间接为AES模块提供了更“干净”的工作环境。此外芯片的功耗管理模式是统一的射频部分的校准数据会影响芯片的整体功耗模型而AES模块的功耗也是这个模型的一部分。2.3 功耗控制寄存器组温度与功耗的权衡从PWD_CURR_20C0x39C到PWD_CURR_125C0x3B8这一系列寄存器构成了芯片在不同温度下的功耗控制查找表。以PWD_CURR_20C为例BASELINE(7-0位): 基准最大关断电流单位是0.5µA。DELTA_XOSC_LPM(15-8位): 当高频晶体振荡器XOSC_HF在低功耗模式下开启时增加的额外最大电流单位是1µA。DELTA_RFMEM_RET(23-16位): 当射频存储器保持时增加的额外最大电流单位是1µA。DELTA_CACHE_REF(31-24位): 当缓存保持时增加的额外最大电流单位是1µA。这些寄存器对AES模块的启示AES模块本身在非活动状态时可以被完全断电以节省能耗。但是当系统需要快速响应一个加密请求时例如接收到一个需要立即解密的网络数据包如果AES模块处于深度掉电状态唤醒和重新初始化它需要时间和能量。这些功耗控制寄存器定义了在不同温度下保持某些模块如缓存、射频内存处于“待命”状态所需的额外电流。系统电源管理软件会根据当前温度和应用场景例如是频繁加密的网关设备还是偶尔加密的传感器节点参考这些表格数据动态决策是将AES模块及其相关资源置于何种功耗状态。理解这张“功耗地图”有助于我们在设计低功耗应用时更精准地预估电池寿命并合理配置睡眠和唤醒策略。注意事项这些FCFG寄存器都是只读的且含义非常底层。在应用层编程中绝对不要尝试去写入或修改它们。TI的驱动程序库例如DriverLib或操作系统如TI-RTOS会在初始化阶段自动读取并应用这些校准值。你的任务是在系统设计时确保为这些校准数据预留出正确的读取时机通常是在上电初始化阶段并理解它们所影响的系统行为边界。3. AES加密处理器架构与核心寄存器配置实战理解了芯片的“出厂设置”后我们进入正题AES加密处理器本身。CC26x0/CC13x0的AES模块是一个独立的硬件加速器支持128位密钥的AES算法并集成了密钥存储区和DMA控制器。它的设计目标很明确高效、安全地卸载主CPU的加密负担。3.1 AES模块功能全景与工作模式选择模块支持五种主流的工作模式以适应不同安全需求ECB (Electronic Codebook电子密码本模式)最基础的模式相同的明文块加密后产生相同的密文块。它不适合加密有重复模式的数据流但因其简单在加密独立数据块如单个密钥时仍有应用。CBC (Cipher Block Chaining密码分组链接模式)每个明文块先与前一个密文块进行异或操作然后再加密。这引入了“链式”依赖相同的明文块在不同位置会产生不同的密文安全性优于ECB。需要一个初始化向量IV。CTR (Counter计数器模式)将计数器加密后与明文异或得到密文。它可以将分组密码转换为流密码支持并行计算和随机访问非常适合加密实时通信数据流。CBC-MAC (Cipher Block Chaining Message Authentication Code)用于生成消息认证码MAC验证数据完整性但不提供机密性。它只处理输入数据不输出加密数据流。CCM (Counter with CBC-MAC)这是CTR和CBC-MAC的结合体同时提供加密和认证是无线通信协议如蓝牙低功耗、ZigBee 3.0中广泛使用的模式。模式选择背后的逻辑选择哪种模式取决于你的安全需求和数据特性。例如如果你只需要验证固件包的完整性而不怕内容被看见用CBC-MAC。如果你需要加密一个实时音频流并且希望低延迟CTR模式是首选。如果你需要同时满足机密性和完整性比如传输用户密码那么CCM模式是标准答案。在CC26x0中这些模式的选择是通过配置AESCTL等寄存器来完成的。3.2 关键寄存器详解与配置流程AES模块的寄存器映射从地址0x4002 4500开始。我们挑几个最核心的来讲1. AESCTL (AES Control Register, 0x4002 4550)这是AES模块的总控制开关。其最高位第31位的SAVE_CONTEXT位尤为重要。当该位置1时AES模块在完成一个操作后会保留其内部状态如CBC模式下的链值、CTR模式的计数器状态。这对于加密一个长数据流被分割成多个DMA传输的场景至关重要。如果你在加密一个数据包的过程中间暂停然后不清除上下文就启动下一个包那么加密链就会错乱导致解密失败。通常对于一个完整的数据包我们会在开始时清除上下文SAVE_CONTEXT0在包内多个DMA块之间保持上下文SAVE_CONTEXT1在包结束时再根据情况决定是否清除。2. AESDATALEN0/AESDATALEN1 (0x4002 4554/4558)这两个寄存器组合起来定义了本次加密/解密操作的总数据长度以字节为单位。这是一个非常关键的配置点。模块内部会根据这个长度和块大小AES为16字节来计算需要处理多少个完整块以及最后一个块是否是“短块”misaligned block。模块硬件支持自动填充短块用零填充这简化了软件处理。你必须确保这里设置的长度与实际通过DMA传输的数据总字节数严格一致否则会导致认证失败在CCM/CBC-MAC模式下或输出数据错误。3. AESIV_0 到 AESIV_3 (0x4002 4540 - 454C)初始化向量寄存器。在CBC、CTR、CCM模式下必须配置一个随机且不可预测的IV。对于CBC和CBC-MAC相同的密钥和IV加密相同明文会产生相同密文因此IV需要随机变化。对于CTR模式计数器Counter的初始值通常由Nonce一次性数字和块序号组合而成也存放在这里。最佳实践是使用芯片的真随机数生成器TRNG模块来生成IV绝对不要使用固定值或简单递增的值。4. AESKEY2_0 到 AESKEY2_3 / AESKEY3_0 到 AESKEY3_3 (0x4002 4500 - 450C / 4510 - 451C)这是密钥加载寄存器。但请注意数据手册的描述是“Clear/wipe”寄存器。这暗示了其工作方式软件将密钥写入这些寄存器实际上是将密钥导入到AES模块内部的密钥存储器或触发密钥扩展计算。为了安全写入后应立即覆盖或清除这些寄存器在系统内存中的副本防止密钥通过内存扫描被窃取。更安全的方式是使用芯片的密钥存储模块Key Store通过DMA将密钥直接从安全存储区加载到AES引擎完全避免密钥出现在通用内存中。配置流程示例以CBC加密为例选择密钥源决定是使用软件写入密钥寄存器还是通过DMA从密钥存储区加载。配置模式与上下文向AESCTL寄存器写入值设置模式为CBC加密并根据是否需要保存上下文设置SAVE_CONTEXT位。设置数据长度将待加密数据的字节数写入AESDATALEN0和AESDATALEN1。写入初始化向量将生成的随机IV写入AESIV_0到AESIV_3寄存器。加载密钥如果使用软件加载则将128位密钥分成4个32位字依次写入AESKEY2_0到AESKEY2_3。配置DMA下一步详述设置源地址明文数据存放地址、目标地址密文存放地址和传输长度。启动DMA与AES引擎使能DMA通道AES模块在检测到数据就绪后会自动开始处理。踩坑记录我曾遇到一个棘手的Bug在CCM模式下认证总是失败。排查了很久最后发现是AESAUTHLEN附加认证数据长度寄存器配置错误。在CCM模式中除了加密数据还可以有额外的、只认证不加密的数据AAD。AESAUTHLEN必须精确设置为AAD的字节长度即使AAD长度为0也要显式写入0。很多驱动库的示例代码忽略了这一点导致认证失败。记住对于AES模块所有长度寄存器都必须显式、准确地配置不能依赖复位默认值。4. DMA控制器数据高速通道的精细调控AES模块的高效一半功劳要归于其集成的专用DMA控制器DMAC。它负责在系统内存和AES引擎之间搬运数据完全解放CPU。但这条“高速公路”如果设置不当就会堵车甚至发生“车祸”数据错误。4.1 DMA控制器架构与通道分工从图10-1可以看出AES模块的DMAC有两个独立的通道通道0 (Channel 0, Inbound)负责将数据从外部内存源搬运到AES引擎或密钥存储区目的地。对应寄存器DMACH0CTL,DMACH0EXTADDR,DMACH0LEN。通道1 (Channel 1, Outbound)负责将处理结果密文/明文或认证标签从AES引擎源搬运到外部内存目的地。对应寄存器DMACH1CTL,DMACH1EXTADDR,DMACH1LEN。这种分离设计允许输入和输出数据流并行处理。例如当AES引擎正在加密当前数据块时DMA可以同时将上一个已加密的块写出到内存并将下一个待加密的块读入形成流水线最大化吞吐量。4.2 核心寄存器配置与传输逻辑1. DMACHxCTL (通道控制寄存器)这个寄存器控制通道的基本行为。关键字段包括EN(使能位)启动或停止该通道的DMA传输。MODE选择传输方向。对于通道0通常是READ从内存读数据到AES对于通道1是WRITE从AES写数据到内存。PRIORITY通道优先级。当两个通道同时请求总线时优先级高的先服务。通常将输出通道1设为高优先级防止结果数据堵塞在AES引擎内。2. DMACHxEXTADDR (外部地址寄存器)对于通道0这是源地址存放明文或待解密密文的内存地址。 对于通道1这是目的地址存放输出密文、明文或标签的内存地址。地址对齐至关重要。虽然DMA控制器支持非对齐访问会分解为字节传输但这会严重降低效率。最佳实践是确保源和目的地址都是32位4字节对齐的。3. DMACHxLEN (DMA长度寄存器)定义单次DMA操作传输的总字节数。这里有一个非常重要的概念这个长度是DMA控制器与外部AHB总线之间传输的长度。而AES引擎内部是以块16字节为单位进行操作的。DMA控制器会智能地将这个长的传输请求分解成多个以“块”为单位的子请求与AES引擎交互。例如你设置DMACH0LEN 64字节AES引擎会分4次每次从DMA请求一个16字节的块。4. DMABUSCFG (总线配置寄存器0x4002 4078)这个寄存器配置DMA主控接口在AHB总线上的行为。数据手册特别用NOTE强调“CC26x0 and CC13x0 devices do not support burst or nonsequential transfers through internal interconnect. The DMABUSCFG register must not be changed for proper operation.”这句话是金科玉律它意味着芯片内部互联总线不支持突发传输或非连续传输。因此这个寄存器必须保持其复位默认值0x0000 6000绝对不要修改。任何修改都可能导致DMA传输挂起或系统总线错误。默认配置下DMA主控只会发起单次Single、连续Sequential的32位传输。4.3 DMA与AES引擎的握手协议这是理解整个数据流的关键。DMA控制器和AES引擎之间并非简单的“推数据”而是有一套握手协议AES引擎发起请求当AES引擎的输入缓冲区有空闲可接收一个新数据块它会向DMA通道0发出一个数据请求data_in_req。DMA响应并传输DMA通道0收到请求后通过AHB主控从外部内存读取一个数据块16字节通过TCM接口写入AES引擎的输入缓冲区。AES处理与输出就绪AES引擎开始加密/解密该块。处理完成后结果数据块就绪AES引擎向DMA通道1发出数据就绪信号data_out_avail。DMA写出结果DMA通道1收到信号后通过TCM接口从AES引擎的输出缓冲区读取该结果块然后通过AHB主控写入外部内存的目标地址。循环与完成上述过程循环直到DMACHxLEN设定的所有字节传输完毕。当最后一个块处理完成且输出DMA也完成后AES模块会置位IRQSTAT.RESULT_AVAIL标志并可能产生中断。配置流程示例配合AES的DMA设置假设我们需要用DMA将64字节明文从地址0x2000_0000加密结果存到0x2000_0100。配置AES模块如前所述设置模式、密钥、IV、数据长度AESDATALEN0/1 64。配置DMA通道0输入DMACH0EXTADDR 0x20000000(源地址)DMACH0LEN 64(传输字节数)DMACH0CTL.MODE READ(从内存读)DMACH0CTL.PRIORITY LOW(可选)配置DMA通道1输出DMACH1EXTADDR 0x20000100(目的地址)DMACH1LEN 64(传输字节数)DMACH1CTL.MODE WRITE(向内存写)DMACH1CTL.PRIORITY HIGH(建议设为高确保结果及时写出)配置主控选择在ALGSEL寄存器中选择AES引擎作为DMA的目标/源AES位1TAG位0。启动传输最后使能两个DMA通道设置DMACH0CTL.EN 1和DMACH1CTL.EN 1。AES引擎会在检测到输入数据可用后自动开始工作。性能调优技巧为了最大化吞吐量可以利用“双缓冲”或“乒乓缓冲”策略。在内存中准备两个明文缓冲区BufA, BufB。当DMA正在将BufA的数据送入AES加密时CPU可以准备下一批明文到BufB。一旦AES对BufA的加密完成并开始输出立即配置DMA通道0的下一次传输指向BufB通道1指向另一个结果缓冲区。这样可以使数据准备、加密计算、结果写出三个步骤部分重叠充分利用硬件并行能力。关键在于精确协调DMA完成中断和缓冲区切换的时机。5. 中断、错误处理与软件复位机制一个健壮的驱动不仅要处理正常流程更要能妥善应对异常。AES模块提供了中断和状态寄存器来辅助这一点。5.1 中断管理模块有两个主要的中断源由IRQSTAT寄存器标识RESULT_AVAIL当一次完整的加密/解密操作包括所有DMA传输完成时触发。这是最常用的中断用于通知应用程序可以读取或使用结果数据了。DMA_IN_DONE仅当输入DMA传输完成时触发。这个中断主要用于调试或者在CCM模式下用于标识“仅附加认证数据AAD”的DMA传输阶段已完成可以开始加密数据阶段的DMA传输。使能中断的步骤在系统级的NVIC中使能AES中断。在AES模块的IRQTYPE寄存器中将EN位置1使能中断功能。在IRQEN寄存器中将你关心的中断源对应的位置1例如置位RESULT_AVAIL_IRQ。在中断服务程序ISR中读取IRQSTAT寄存器以确认中断源并必须向IRQCLR寄存器的相应位写入1来清除中断标志。否则中断会持续触发。5.2 错误检测与处理IRQSTAT寄存器还包含了几个错误状态位它们是排查问题的关键DMA_BUS_ERRAHB主控总线传输错误。这通常意味着DMA试图访问一个无效的、受保护的或未对齐的地址。检查DMACHxEXTADDR设置的内存地址是否有效且可访问例如不是Flash的只读区域。KEY_ST_WR_ERR密钥存储模块写入错误。发生在通过DMA向密钥存储区加载密钥时。KEY_ST_RD_ERR密钥存储模块读取错误。发生在AES引擎请求从密钥存储区读取密钥时。当这些错误发生时AES模块会中止当前操作。软件必须采取以下步骤恢复在ISR中读取IRQSTAT记录错误类型。执行一次软件复位见下文。重新初始化AES和DMA模块的所有相关寄存器。重新启动加密操作。5.3 软件复位流程软件复位是清除模块错误状态、使其恢复到已知空闲状态的唯一可靠方法。通过向SWRESET寄存器的RESET位写入1来触发。关键操作顺序确保AES模块当前没有进行中的操作可以通过查询DMASTAT寄存器确认两个DMA通道均处于空闲状态。向SWRESET.RESET位写1。轮询等待SWRESET.RESET位自动变回0。这表示复位操作已完成。不要在写入后立即进行下一步操作。复位完成后必须重新配置所有AES和DMA寄存器因为复位会将它们清除为默认值。这包括AESCTL、AESDATALEN、AESIV、DMACHxCTL、DMACHxEXTADDR、DMACHxLEN等。排查实录我曾遇到一个偶发的DMA_BUS_ERR。日志显示错误发生在系统运行数小时后。排查发现问题根源是内存管理。应用程序在启动DMA后由于某些逻辑错误提前释放了DMA源数据所在的动态内存缓冲区。当DMA稍后去读取时该内存区域可能已被分配给其他任务并写入新数据或者已被标记为不可用从而触发总线错误。教训是必须确保DMA操作的生命周期内其源地址和目的地址指向的内存区域始终保持有效且内容稳定。使用静态缓冲区或确保在DMA完成中断触发前绝不释放相关内存。6. 从零构建一个AES-CCM加密传输实例理论说得再多不如一个实例来得透彻。让我们设想一个典型的物联网场景一个传感器节点需要将一段加密且认证的传感器数据通过无线电发送出去。我们选择AES-CCM模式因为它同时提供保密性和完整性。步骤一准备工作与参数定义密钥128位共享密钥。我们将其预先通过安全方式写入芯片的密钥存储区Key Store的某个槽位例如槽位0。Nonce13字节的一次性随机数CCM标准常用长度。使用芯片TRNG生成。附加认证数据AAD8字节的设备ID和消息类型标识只认证不加密。明文数据32字节的传感器读数温度、湿度等。内存缓冲区plaintext_buf[32]: 存放明文。ciphertext_buf[32]: 存放输出的密文。tag_buf[16]: 存放输出的认证标签MAC。nonce_buf[13]: 存放Nonce。aad_buf[8]: 存放AAD。步骤二软件配置流程伪代码逻辑// 1. 使能AES模块时钟通过PRCM寄存器 PRCMPowerDomainOn(PRCM_DOMAIN_PERIPH); PRCMPeripheralRunEnable(PRCM_PERIPH_AES); PRCMLoadSet(); while(!PRCMLoadGet()); // 2. 等待AES模块复位完成并上电 while(AESGetResetStatus() AES_RESET_ACTIVE); // 3. 从Key Store加载密钥到AES引擎通过DMA或API // 假设使用TI驱动库API AESKeyRead(KEY_STORE_AREA0, AES_KEY_AREA_0); // 4. 配置AES模块寄存器 // 设置CCM模式加密不保存上下文新数据包 AESCTL AES_CTL_CCM | AES_CTL_DIR_ENCRYPT; // 设置总数据长度明文长度 AESDATALEN0 32; // 低32位 AESDATALEN1 0; // 高32位 // 设置AAD长度 AESAUTHLEN 8; // 组合Nonce和Counter初始值写入IV寄存器 // CCM模式要求特定的IV格式通常为Flags | Nonce | Counter[0] // 这里需要根据CCM规范构造一个128位的初始块写入AESIV_0-3 ConstructCCMIV(nonce_buf, iv_block); AESIV_0 iv_block[0]; AESIV_1 iv_block[1]; AESIV_2 iv_block[2]; AESIV_3 iv_block[3]; // 5. 配置DMA // 通道0传输AAD 明文 DMACH0EXTADDR (uint32_t)aad_buf; // 先传AAD DMACH0LEN 8 32; // AAD长度 明文长度 DMACH0CTL DMAC_CH_CTL_EN | DMAC_CH_CTL_MODE_READ; // 注意这里需要分两次DMA传输或者将AAD和明文在内存中连续存放。 // 更常见的做法是先启动一次仅AAD的DMA完成后中断再启动明文的DMA。 // 为简化假设AAD和明文已连续存放在内存。 // 通道1接收密文 DMACH1EXTADDR (uint32_t)ciphertext_buf; DMACH1LEN 32; // 密文长度与明文等长 DMACH1CTL DMAC_CH_CTL_EN | DMAC_CH_CTL_MODE_WRITE | DMAC_CH_CTL_PRIO_HIGH; // 6. 配置主控选择与中断 ALGSEL ALGSEL_AES; // 选择AES引擎 IRQTYPE IRQTYPE_EN; // 使能中断功能 IRQEN IRQEN_RESULT_AVAIL; // 使能结果可用中断 // 在NVIC中使能AES中断 // 7. 启动传输 // 使能DMA通道如果未在CTL中使能 // AES引擎会在检测到输入数据后自动开始处理 // 8. 在中断服务程序(ISR)中 void AES_ISR(void) { uint32_t status IRQSTAT; if (status IRQSTAT_RESULT_AVAIL) { // 操作成功完成 // 1. 读取认证标签通过从AESTAGOUT寄存器读取或通过另一个DMA // 2. 清除中断标志 IRQCLR IRQCLR_RESULT_AVAIL; // 3. 处理得到的密文和标签准备发送 radio_send(ciphertext_buf, tag_buf); } if (status IRQSTAT_ERROR_MASK) { // 处理错误 // 1. 记录错误类型 // 2. 执行软件复位 SWRESET SWRESET_RESET; // 3. 等待复位完成 while(SWRESET SWRESET_RESET); // 4. 重新初始化并重试或报告错误 } }步骤三关键点与验证Nonce管理每个加密数据包必须使用不同的Nonce。通常使用递增的包计数器与随机数组合生成。重复使用相同的Key, Nonce对是严重的安全漏洞。标签验证接收方使用相同的密钥、Nonce和AAD对密文进行解密和验证。计算出的标签必须与接收到的标签完全一致否则说明数据在传输中被篡改必须丢弃整个数据包。性能评估通过测量从启动DMA到触发RESULT_AVAIL中断的时间可以评估实际加密吞吐量。CC26x0的AES模块处理一个128位块大约需要32个时钟周期。对于40字节的数据2.5个块加上DMA开销整个过程通常在微秒级远快于软件实现。通过这个完整的实例你应该对如何将寄存器配置、DMA传输、中断处理和安全协议结合起来构建一个真实的硬件加密数据流有了一个清晰的认识。记住数据安全无小事每一个配置位都值得仔细推敲。