|
一直想自己做一个可对固件加密的烧录工具。保护自己的劳动成果。代码固件放置在服务器上,给用户一个客户端软件。客户可以自己升级程序。服务器端记录STM32的芯片的ID号码。。。。。。。。
参考https://www.amobbs.com/forum.php ... hlight=C%23%2Bjlink的C#代码。
刚开始写了个C#版本的,但是C#实在是不安全。所以又改成qt版本的。折腾了两天,总算运行起来了。实现了程序下载,芯片flash保护,flash解锁。涉及商业机密,所以只提供关键的对jlinkARM.dll的调用部分代码,给需要的人参考。
经过试验直接用jlink写flash太慢。所有写了个STM32的boot代码,通过jlink直接加载到RAM中运行起来,然后jlink把固件发送到ram中,ram中运行的boot程序负责擦写flash。还有个stm32的flash写保护和解除写保护,如果按照STM32的编程手册时序实在是太繁琐。但是把这个功能交给STM32自己完成就太简单了。
boot关键代码:
unsigned char __attribute__((at(0x20005014))) statu = 0; //0空闲 1待擦除 2待数据待写入到flash 3写入数据出错
unsigned int __attribute__((at(0x20005018))) add = 0;//固件写地址
uint8_t buf[2048] __attribute__((at(0x2000501c))) = {0};//固件缓存区
。。。。。。。。。。
statu = 0x55;//主机判断ram引导加载成功
while(1)
{
LED_TOGGLE; //LED亮灭变化
TIMDelay_Nms(100);
if(statu == 1)
{
FLASH_Unlock();
FLASH_EraseAllPages();
statu = 0;
}
else if(statu == 2)
{
FlashProgram((unsigned long *)buf,add,2048);
//FLASH_WriteByte(add,buf,2048);
statu = 0;
}
else if(statu == 0x18)//上锁定
{
if(FLASH_GetReadOutProtectionStatus()!=SET)
{
FLASH_Unlock(); //不解锁FALSH也可设置读保护
FLASH_ReadOutProtection(ENABLE);
FLASH_Lock();//上锁
}
statu = 0;
}
else if(statu == 0x19)//解除锁定
{
if(FLASH_GetReadOutProtectionStatus()!=RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
FLASH_Lock();//上锁
}
statu = 0;
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|