用C语言写入STM32L4x1闪存

我试图在Windows 7上使用JTAG ST-Link / V2在STM32L476的闪存中写入。不需要上传软件,我只需要在非易失性地方写入数据,可以读取和删除它。

作为一个关于硬件的新手,只有在编写非嵌入式常规C时才有效,恐怕我可能会伤害或修改不可逆转的闪存。 此外,我不确定我能做什么或不能做什么。

我已经想到阅读手册 ,写入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; } 

有没有更好的方法来做关于在哪里写和如何写错误检查,使用的资源等

关于闪存的主要知识:

  1. 闪存是页面可擦除的,在您的情况下,页面大小为2K 。 这是什么意思? 您必须确保您的代码不在2k范围的页面中。
  2. 擦除后,内存中所有字节的状态为0xFF。
  3. 写入闪存字节意味着在原始级别将位设置为1的位修改为位设置为0 。 如果要将01的位修改为必须删除整页。

ST-Link_Utility嵌入方式执行,因此当您写入闪存时,它会擦除​​整个扇区,然后写入数据。 如果您的代码在使用后需要简化数据,则相同。


默认情况下,mCU在启动时使用0x0000 0000别名地址0x0800 0000

第一个单词应包含重置向量和默认向量表。 复位向量始终是要执行的第一条指令。该表中的复位向量将包含一个包含复位代码的地址的分支。

因此,换句话说, 在加电时,处理器跳转到固定位置0x0 ,这意味着它跳转到0x0800 0000 。 显然你选择的地址不正确;)

好消息! 由于您使用的是ST Link实用程序,因此无法破坏芯片。 它只会拒绝写入没有可访问内存的地方。

永久锁定芯片的唯一方法是将读保护启用到最高级别2 。 要执行此操作,您必须写入选项字节。 并且您不会意外地将0xCC33写入锁定字节。

需要考虑的一件事是芯片只写半字(16位),并且只有当FLASH仍为0xFFFF(擦除状态)时才会写入。 否则会返回写入错误。

更新:手动代码片段RDP。 代码读保护。

第2级:无需调试
在此级别,保证级别1得到保证。
此外,Cortex®-M4 调试端口 ,从RAM 启动启动RAM模式 )和从系统存储器启动启动加载器模式) 不再可用
在用户执行模式(引导闪存模式)下,Flash主存储器上允许所有操作。 …
2级根本无法删除:它是一种不可逆转的操作。

简而言之:不要写入0x1FFF7800。