OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5507|回复: 13

【新人求助】一个在使用CPUID加密时遇到的问题

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-1-10
在线时间
6 小时
发表于 2016-1-11 14:41:25 | 显示全部楼层 |阅读模式
11金钱
本帖最后由 dnzj 于 2016-1-12 15:45 编辑

小弟刚学STM32不久,在实践CUPID加密时遇到一个问题。 芯片型号为STM32F103C8T6下面是加密相关的代码:

volatile const static uint32_t CPUIDmiwen = 0xFFCFFCFF;

int main (void)
{
......
Di_Yi_Ci();
Verification_Pass();
......
}
void Di_Yi_Ci(void)
{

    if(CPUIDmiwen==0xFFCFFCFF)
   {
        uint32_t CpuID[3];
        uint32_t miwen;        
                 
        CpuID[0]=*(vu32*)(0x1ffff7e8);
        CpuID[1]=*(vu32*)(0x1ffff7ec);
        CpuID[2]=*(vu32*)(0x1ffff7f0);        

        miwen=(CpuID[0])+(CpuID[1])-(CpuID[2]);   
        FLASH_Unlock();
        FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
        FLASH_ProgramWord((uint32_t)&CPUIDmiwen, miwen);
        FLASH_Lock();                 
    }
}

u8 Verification_Pass(void)
{      
         uint32_t CpuID[4];      
        CpuID[0]=*(vu32*)(0x1ffff7e8);
        CpuID[1]=*(vu32*)(0x1ffff7ec);
        CpuID[2]=*(vu32*)(0x1ffff7f0);   
        
    CpuID[3]=(CpuID[0])+(CpuID[1])-(CpuID[2]);   

    if (CPUIDmiwen==CpuID[3]) {return 1;} else {return 0;}
}

测试以后发现每次开机 CPUIDmiwen的值一直都是0xFFCFFCFF,明明已经运行过了这条语句:
FLASH_ProgramWord((uint32_t)&CPUIDmiwen, miwen); 按理说CPUIDmiwen里的值会被加密后的结果替换掉呀。
但是,为什么CPUIDmiwen的值一直都没有变化?加密以后的密文没有写进FLASH地址里,为什么会这样?
求大侠指教,我的问题出在哪里了?谢谢了!!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

422

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1139
金钱
1139
注册时间
2014-5-24
在线时间
116 小时
发表于 2016-1-11 15:02:49 | 显示全部楼层
Flash操作不正确,请检查。
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.  只给方向,不妨碍思考
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-1-10
在线时间
6 小时
 楼主| 发表于 2016-1-12 03:06:03 | 显示全部楼层
emWin 发表于 2016-1-11 15:02
Flash操作不正确,请检查。

恩,我又测试了一下,发现执行完
FLASH_ProgramWord((uint32_t)&CPUIDmiwen, miwen);
这个语句后,CPUIDmiwen的值并没有变化。研究了一阵还是没找出为什么这句话没有起作用的原因。求解!!!
回复

使用道具 举报

0

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-1-18
在线时间
60 小时
发表于 2016-1-12 07:54:46 | 显示全部楼层
这违反了flash写的规则,flash先擦除,后写,也就是每一次新的写入,要把原来的数据擦除掉,也就是还原为0xFFFFFFFF.

你把这一句volatile const static uint32_t CPUIDmiwen = 0xFFCFFCFF;

改为:

volatile const static uint32_t CPUIDmiwen = 0xFFFFFFFF;

试试,也许就可以了。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-1-10
在线时间
6 小时
 楼主| 发表于 2016-1-12 14:22:15 | 显示全部楼层
hunyuanqi 发表于 2016-1-12 07:54
这违反了flash写的规则,flash先擦除,后写,也就是每一次新的写入,要把原来的数据擦除掉,也就是还原为0x ...

要先擦除的话,要不要在写进去之前加一句
FLASH_ErasePage((uint32_t)&CPUIDmiwen);?
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-1-10
在线时间
6 小时
 楼主| 发表于 2016-1-12 15:43:05 | 显示全部楼层
hunyuanqi 发表于 2016-1-12 07:54
这违反了flash写的规则,flash先擦除,后写,也就是每一次新的写入,要把原来的数据擦除掉,也就是还原为0x ...

我改成了这句:volatile const static uint32_t CPUIDmiwen = 0xFFFFFFFF;

结果还是不成功,依旧无法写入

但是有个现象:
当我执行完  
FLASH_ProgramWord((uint32_t)&CPUIDmiwen, miwen); 这句后
判断语句if (CPUIDmiwen==CpuID[3]) {return 1;} else {return 0;} 返回1,说明这里CPUIDmiwen的值和CpuID[3]一样了呀。 那不是说明写入成功了吗?
但是关机后再开机,CPUIDmiwen的值又变成了0xFFFFFFFF……太奇怪了,CPUIDmiwen不是临时变量才对呀……
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-1-10
在线时间
6 小时
 楼主| 发表于 2016-1-12 15:47:10 | 显示全部楼层
hunyuanqi 发表于 2016-1-12 07:54
这违反了flash写的规则,flash先擦除,后写,也就是每一次新的写入,要把原来的数据擦除掉,也就是还原为0x ...

对了,之前我用volatile const static uint32_t CPUIDmiwen = 0xFFCFFCFF; 这句的时候, 当时判断语句if (CPUIDmiwen==CpuID[3]) {return 1;} else {return 0;} 也是返回1的。
回复

使用道具 举报

0

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-1-18
在线时间
60 小时
发表于 2016-1-12 16:35:57 来自手机 | 显示全部楼层
可能flash写操作要求地址对齐,你可能要把这个变量的地址规定死,用atuibute
回复

使用道具 举报

0

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-1-18
在线时间
60 小时
发表于 2016-1-13 05:22:45 来自手机 | 显示全部楼层
你也可以试试把变量定义改为uint32_t   *CPUIDmiwen = 0xFFFFFFFF试试。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-1-10
在线时间
6 小时
 楼主| 发表于 2016-1-13 06:01:06 | 显示全部楼层
hunyuanqi 发表于 2016-1-12 16:35
可能flash写操作要求地址对齐,你可能要把这个变量的地址规定死,用atuibute

我试着用了这句:
const static uint32_t CPUIDmiwen __attribute__((at(0x08005000)))= 0xFFFFFFFF;

但是编译后,程序不生成.bin文件了。
并且目录下多出一个名为XX.bin的文件夹。 点开后里面有两个文件:
一个是ER$$.ARM.__AT_0x08005000
另一个是ER_RO
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-1-10
在线时间
6 小时
 楼主| 发表于 2016-1-13 06:07:49 | 显示全部楼层
hunyuanqi 发表于 2016-1-13 05:22
你也可以试试把变量定义改为uint32_t   *CPUIDmiwen = 0xFFFFFFFF试试。

我也试了这句 uint32_t   *CPUIDmiwen = 0xFFFFFFFF;
但是Keil提示:
warning: incompatible integer to pointer conversion initializing 'uint32_t *' (aka 'unsigned int *') with an expression of type ' unsigned int '
回复

使用道具 举报

0

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-1-18
在线时间
60 小时
发表于 2016-1-13 08:45:46 | 显示全部楼层
我试了,可以生成 HEX文件

可能 volatile static const uint32_t CPUmiwen __attribute__((at(0x8010000))) = 0xFFFFFFFF;

是正确的唯一解了。
回复

使用道具 举报

0

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-1-18
在线时间
60 小时
发表于 2016-1-13 08:47:50 | 显示全部楼层
你这样操作试试:

volatile static const uint32_t CPUmiwen __attribute__((at(0x8010000))) = 0xFFFFFFFF;

uint32_t *p = (uint32_t *)&CPUmiwen;

以后的操作对p进行引用。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-1-10
在线时间
6 小时
 楼主| 发表于 2016-1-13 14:57:19 | 显示全部楼层
hunyuanqi 发表于 2016-1-13 08:45
我试了,可以生成 HEX文件

可能 volatile static const uint32_t CPUmiwen __attribute__((at(0x8010000 ...

我用了这句:
volatile static const uint32_t CPUmiwen __attribute__((at(0x8005000))) = 0xFFFFFFFF;
因为我用的芯片是64K,所以就写了0x8005000。
但是测试时发现
运行完这句        FLASH_ProgramWord((uint32_t)&CPUIDmiwen, miwen); 后,
CPUmiwen的值还是0xFFFFFFFF;
于是我就跟踪调试,发现进入FLASH_ProgramWord函数后,程序运行到
   *(__IO uint16_t*)Address = (uint16_t)Data; 这一句时,
Address和Data的值都是对的。但是运行玩这一句后,CPUmiwen的值依旧保持不变……
继续跟踪 运行到        tmp = Address + 2;

        *(__IO uint16_t*) tmp = Data >> 16; 后, tmp和Data的值也都对,但是运行完后,CPUmiwen还是没变。不知道为什么会这样。

PS:我运行完后也能生成hex文件,但是因为我需要用.bin,所以以前都是设置好直接多生成一个.bin文件。
但是加了 __attribute__((at(0x8005000)))  这个语句后,bin文件不生成了,反而目录下多了一个XXXX.bin(这个是bin文件的名字)的文件夹,点开后出现了两个文件:ER$$.ARM.__AT_0x08005000和ER_RO。

请问大侠要如何设置生成新的BIN文件?不然我不能烧入芯片实际测试了。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-14 17:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表