Запись во флэш-память STM32L4x1 на С

Я пытаюсь записать во флэш-память STM32L476 с помощью JTAG ST-Link/V2 в Windows 7. Не нужно загружать программное обеспечение, мне нужно только записывать данные в энергонезависимом месте, где их можно прочитать и удалить.

Как новичок в отношении аппаратного обеспечения и эффективности только при программировании не встроенного обычного 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;
}

Есть ли лучший способ сделать это относительно того, где писать и как писать (проверка ошибок, использование ресурсов и т. Д.) ?

2 ответа

Решение

Основные сведения о флэш-воспоминаниях:

  1. Флэш-память стирается страницей, в вашем случае размер страницы, если 2K, Что это значит? Вы должны быть уверены, что ваш код не находится в 2k диапазон страницы.
  2. После стирания состояние всех байтов в памяти равно 0xFF.
  3. Запись во флэш-байт означает, на необработанном уровне, чтобы изменить биты, установленные на 1 бит установлен 0, Если вы хотите немного изменить 0 в 1 Вы должны стереть всю страницу.

ST-Link_Utility делает это встроенным способом, поэтому, когда вы пишете на флэш-память, она стирает целый сектор и записывает данные. То же самое, если ваш код требуется для облегчения данных после их использования.


По умолчанию ваш mCU при запуске использует 0x0000 0000 псевдоним адреса 0x0800 0000,

Первые слова должны содержать вектор сброса и таблицу векторов по умолчанию. Вектор сброса всегда является первой инструкцией, которая будет выполнена. Вектор сброса в этой таблице будет содержать ветвь по адресу, который будет содержать код сброса.

Другими словами, во время включения процессор переходит в фиксированное положение 0x0, что означает, что он переходит в 0x0800 0000, Очевидно, адрес, который вы выбрали, не является правильным;)

Хорошие новости! Поскольку вы используете утилиту ST Link, вы не можете уничтожить чип. Он просто откажется писать там, где нет доступной памяти.

Единственный способ навсегда заблокировать себя в чипе - включить защиту от чтения до максимального уровня 2. Для этого вам нужно записать в опцию байты. И вы случайно не пишете 0xCC33 в байты блокировки.

Следует учитывать, что микросхема записывает только половинные слова (16 бит) и только тогда, когда FLASH все еще равен 0xFFFF (стертое состояние). В противном случае он вернет ошибку записи.

Обновление: ручной фрагмент от RDP. Защита от чтения кода.

Уровень 2: Нет отладки
На этом уровне уровень защиты 1 гарантирован.
Кроме того, порт отладки Cortex®-M4, загрузка из ОЗУ (режим загрузки ОЗУ) и загрузка из системной памяти (режимзагрузки) больше не доступны.
В режиме выполнения пользователя (режим загрузки FLASH) все операции разрешены в основной памяти Flash....
Уровень 2 вообще не может быть удален: это необратимая операция.

Короче говоря: не пишите на 0x1FFF7800.

Другие вопросы по тегам