尊敬的香榭丽舍
我们的工厂请求校验和应通过 UART 发送出去。 因此、我实现了如下所示的校验和计算代码、如果没有编程到器件中的传递字、该代码就能正常工作。 但在编程密码后无法正常工作。
UINT16 FLASH_CHECKSUM_CALCULATE (UINT16 * StartAddr、UINT16大小)
{
易失性 UINT16校验和= 0;
易失性 UINT16 I = 0;
对于(i = 0;i < size;i++)
{
校验和+=(uint16)(* StartAddr++);
校验和=校验和0xFFFF;
}
返回校验和;
}
UINT16 FLASH_CHECKSUM;
void main (void)
{
init_system_and_device();
//闪存起始地址= 0x3F0000
//闪存大小= 0x8000、32KB
FLASH_CHECKSUM = FLASH_CHECKSUM_CALCULATE (((UINT16 *) 0x3F0000、(UINT16) 0x8000);
(笑声) (笑声)
}
浏览系统参考手册后、使用下面显示的安全和不安全闪存的 C 代码示例、但仍然无法正常工作、在我看来、CPU 在使用 unsecure_flash 和 secure_flash 后卡在某个位置。 可以在这方面帮助我吗? 我所期望的是、固件应支持在有密码和没有密码的情况下计算闪存校验和。 谢谢。。。
unsecure_flash();
//闪存起始地址= 0x3F0000
//闪存大小= 0x8000、32KB
FLASH_CHECKSUM = FLASH_CHECKSUM_CALCULATE (((UINT16 *) 0x3F0000、(UINT16) 0x8000);
SECURE_FLASH ();
我的不安全代码:
void unsecure_flash (void)
{
volatile int * csm =(volatile int *) 0x000AE0;//csm 寄存器文件
volatile int * PWL =(volatile int *) 0x003F7FF8;//密码位置
volatile int tmp[8];
int i = 0;
//读取128位密码位置(PWL)
//在地址0x3F 7FF8-0x3F 7FFF 处的闪存中
//如果器件是安全的、则读取的值将是
//实际上没有加载到 temp 变量中,所以
//这称为虚拟读取。
对于(i=0;i<8;i++) tmp[i]=* PWL++;
//if (SECURE_FLAG = 1)
//如果密码不是全一(0xFFFF),则需要下面的代码
//取消 CSM 的安全保护。
//将128位密码写入密钥寄存器
//如果此密码与中存储的密码匹配
// PWL 则 CSM 将变得不安全。 如果没有
//匹配、则器件将保持安全。
//示例密码为:
//使用0x111122223344455556677778888。
asm (" EALLOW");//密钥寄存器受 EALLOW 保护
*CSM++= 0xFFFF;//在0xAE0上注册 KEY0
*CSM++= 0xFFFF;//在0xE1处注册密钥1
*CSM++= 0xFFFF;//在0xAE2处注册密钥2
*CSM++= 0xFFFF;//在0xAE3处注册密钥3
*CSM++= 0xEBEE;//在0xAE4处注册 KEY4
*CSM++= 0xD8FF;//在0xAE5上注册 KEY5
*CSM++= 0xE9D3;//在0xAE6上注册 KEY6
*CSM++= 0xAB38;//在0xAE7上注册 KEY7
asm (" EDIS");
}
void resecure_flash (void)
{
volatile int * CSMSCR =(volatile int *) 0x00AEF;//CSMSCR 寄存器
//设置 FORCESEC 位
asm (" EALLOW");//CSMSCR 寄存器受 EALLOW 保护。
* CSMSCR = 0x8000;
asm ("EDIS");
}