Запись во флэш-память 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 ответа
Основные сведения о флэш-воспоминаниях:
- Флэш-память стирается страницей, в вашем случае размер страницы, если
2K
, Что это значит? Вы должны быть уверены, что ваш код не находится в2k
диапазон страницы. - После стирания состояние всех байтов в памяти равно 0xFF.
- Запись во флэш-байт означает, на необработанном уровне, чтобы изменить биты, установленные на
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.