我试图在Windows 7上使用JTAG ST-Link / V2在STM32L476的闪存中写入。不需要上传任何软件,我只需要在非易失性地方写入数据被阅读和删除。
作为一个关于硬件的新手,只有在编写非嵌入式常规C时才有效,恐怕我可能会伤害或修改不可逆转的闪存。另外,我不确定我能做什么或不能做什么。
我已经想到阅读manual在 0x08000000 内存中写入内容似乎是一个好主意。使用C代码调用ST-Link_Utility:
const char CMD_ACCESS_ST_UTILITY[] = "cd C:/Program Files (x86)/STMicroelectronics/STM32 ST-LINK Utility/ST-LINK Utility&&ST-LINK_CLI.exe ";
bool STLINKWriteSystemCalls(void)
{
char cmd[200] = "";
strcpy(cmd, CMD_ACCESS_ST_UTILITY); // cmd to access utility
strcat(cmd, "-c"); // Then connect with ST-Link
if (system(cmd) != 0)
return false; // If failed exit
strcpy(cmd, CMD_ACCESS_ST_UTILITY);
strcat(cmd, "-r8 0x08000000 0x100"); // Read to check if there is data already
// I haven't managed yet how I'll compare the result of read
// To FFFF but that's not the main issue
if (system(cmd) != 0)
return false; // If failed exit
strcpy(cmd, CMD_ACCESS_ST_UTILITY);
strcat(cmd, "-w8 0x08000000 0x00"); // Write data into 0x080000000
if (system(cmd) != 0)
return false; // If failed exit
return true;
}
有没有更好的方法来处理写作和编写方法(错误检查,使用的资源等)? < / p>
答案 0 :(得分:1)
关于闪存的主要知识:
2K
。这是什么意思?您必须确保您的代码不在2k
页面范围内。1
的位修改为设置为0
的位。如果您要修改从0
到1
的位,您必须删除整页。 ST-Link_Utility
以嵌入方式进行,所以当你写入flash时,它会擦除整个扇区,然后写入数据。如果您的代码在使用后需要简化数据,则相同。
默认情况下,您的mCU在启动时使用0x0000 0000
别名地址0x0800 0000
。
第一个单词应包含重置向量和默认向量表。复位向量始终是要执行的第一条指令。该表中的复位向量将包含一个包含复位代码的地址的分支。
所以,换句话说,
在加电时,处理器跳转到固定位置0x0 ,这意味着它会跳转到0x0800 0000
。显然,您选择的地址不正确;)
答案 1 :(得分:0)
永久锁定芯片的唯一方法是将读保护设置为最大 2级。要执行此操作,您必须写入选项字节。并且您不会意外地将0xCC33写入锁定字节。
要考虑的一件事是芯片只写半字(16位),并且只有当FLASH仍为0xFFFF(擦除状态)时才会写入。否则会返回写入错误。
更新:手动摘录片RDP。代码读保护。
第2级:无需调试
在此级别,保证级别1得到保证 此外,还有Cortex®-M4 调试端口 从RAM启动(启动RAM模式)和从系统内存启动(启动加载程序模式) 是不再可用 在用户执行模式(启动FLASH模式)下,所有操作都是 允许在Flash主内存上。 ...
2级无法删除: 这是一次不可逆转的行动。
简而言之:不要写入0x1FFF7800。