Thread 中讨论的其他器件:CC2652R
工具与软件:
您好!
我想添加安全区域的密钥。 我将使用 "12.9.1 Crypto 寄存器"完成此任务。 然后、我查阅了参考手册文档、并多亏了"12.7.4.2.1从外部存储器中加载密钥"、才编写了代码。 但是、我得到了一个错误。 我使用一些可读且可写类型的寄存器、但我无法读取这些寄存器。 因为这些寄存器是加密寄存器、我只能看到"?" 在调试期间通过存储器浏览器将该地址中的任何内容存储起来。
我的电路板是 cc26x2
12.7.4.2.1从外部存储器中加载密钥
伪代码中的以下软件示例介绍了主机软件通常为将一个或多个密钥加载到密钥存储模块中而执行的操作。
//配置主控制模块
写入 ALGSEL 0x0000_0001 //启用到密钥存储模块的 DMA 路径
写入 IRQCLR 0x0000_0001 //清除任何未处理的事件
//配置密钥存储模块(区域、大小)
写入密钥大小0x0000_0001 // 128位密钥大小
写入 KEYWRITEAREA 0x0000_0001 //启用密钥进行写入(例如密钥0)
//配置 DMAC
写入 DMACH0CTL 0x0000_00001 //启用 DMA 通道0
在外部存储器中写入 DMACH0EXTADDR //密钥的基地址
写入 DMACH0LEN //密钥总长度(以字节为单位)(例如、16表示1个128位密钥)
//等待完成
等待 IRQSTAT[0]='1'//等待操作完成
检查 IRQSTAT[31:30]=‘00'//检查 DMA 和密钥存储中是否没有错误
写入 IRQCLR 0x0000_0001 //确认中断
写入 ALGSEL 0x0000_0000 //禁用主控制/DMA 时钟
//检查状态
检查 KEYWRITTENAREA 0x0000_00001 //检查是否写入了密钥0
//算法结束
在下面伪代码中、我需要始终检查寄存器中的值是否正确。 此外、我在 while 和 if (等待和检查)块中遇到错误。 因为我无法读取地址中的值。 是否有任何可能的方法来读取加密寄存器中的值? 您可以在下面看到我的代码。
void loadKeys (uint32_t keyIndex、uint32_t * extMemoryAddr、uint32_t keyLength){
ALGSEL = 0x00000001; //启用 DMA 到密钥存储模块
IRQCLR = 0x00000001; //清除任何未完成的事件
KEYSIZE = 0x00000001; // 128位密钥大小
KEYWRITEAREA =(1 << keyIndex); //选择键槽(例如键0)
DMACH0CTL = 0x00000001; //启用 DMA 通道0
DMACH0EXTADDR =(uint32_t) extMemoryAddr; //设置外部存储器地址(存储密钥的位置)
DMACH0LEN =密钥长度; //设置密钥长度(例如、128位密钥为16个字节)
while ((IRQSTAT & 0x01)=0); //等待操作完成(IRQSTAT[0]被置位)
//检查操作是否成功(DMA 或密钥存储区中没有错误)
如果((IRQSTAT & 0xC0000000)=0){
//操作成功完成
IRQCLR = 0x00000001;//清除中断标志
其他{
//处理错误(DMA 或密钥存储区写入错误)
}
//验证密钥是否写入了正确的区域
如果(KEYWRITTENAREA &(1 << keyIndex)){
//密钥已成功写入密钥存储区
其他{
//处理失败(未写入密钥)
}
//禁用到密钥存储模块的 DMA 路径
ALGSEL = 0x00000000;//禁用 DMA 路径
}
谢谢