用C语言写入STM32L4x1闪存

时间:2017-05-22 09:21:35

标签: c embedded stm32 flash-memory jtag

我试图在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>

2 个答案:

答案 0 :(得分:1)

关于闪存的主要知识:

  1. 闪存是页面可擦除的,在您的案例页面大小2K。这是什么意思?您必须确保您的代码不在2k页面范围内。
  2. 擦除后,内存中所有字节的状态为0xFF。
  3. 写入闪存字节意味着,在原始级别,将设置为1的位修改为设置为0的位。如果您要修改从01 的位,您必须删除整页。
  4. ST-Link_Utility以嵌入方式进行,所以当你写入flash时,它会擦除​​整个扇区,然后写入数据。如果您的代码在使用后需要简化数据,则相同。

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

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

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

答案 1 :(得分:0)

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

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

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

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

  

第2级:无需调试
  在此级别,保证级别1得到保证   此外,还有Cortex®-M4 调试端口   从RAM启动(启动RAM模式)和从系统内存启动(启动加载程序模式)   是不再可用   在用户执行模式(启动FLASH模式)下,所有操作都是   允许在Flash主内存上。   ...
   2级无法删除:   这是一次不可逆转的行动。

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