[i] Чтение информационной области Flash-памяти с помощью отладчика в Keil uVision
В общем случае память микроконтроллера считать в файл под отладкой в среде Keil uVision можно с помощью команды SAVE: https://developer.arm.com/documentation/101407/0543/Debug-Commands/SAVE.
Информационная область Flash-памяти не отображается в адресное пространство микроконтроллера и доступна только через регистровый доступ, для ее чтения необходима определенная последовательность действий. Команда SAVE в Keil uVision обращается к адресному пространству микроконтроллера, поэтому считать с ее помощью информационную память не получится.
Однако, в данной среде разработки можно добавить специальные функции, которые будут исполняться отладчиком (https://developer.arm.com/documentation/ka002991/latest/, https://developer.arm.com/documentation/101407/0543/Debug-Functions/User-Functions, https://developer.arm.com/documentation/101407/0543/Debugging/Debug-Windows-and-Dialogs/Toolbox?lang=en - вводная информация, https://www.keil.com/support/man/docs/uv4/uv4_dg_debug.asp - информация о том, где добавлять ini-файл в настройках проекта (поле Initialization File)).
В качестве примера ниже приведен фрагмент ini-файла, с помощью которого можно читать слова из информационной области FLASH-памяти. Логика функции чтения которой повторяет логику функции EEPROM_ReadWord() из SPL, при этом сам скрипт проверен на микросхемах К1986ВЕ1FI/GI (для других микросхем при необходимости можно доработать исходя из их функционирования).
FUNC void print_info_eeprom(unsigned int address) {
_WDWORD(0x40020000 + 0x1C, _RDWORD(0x40020000 + 0x1C) | (1 << 3)); // PER_CLOCK |= EEPROM_CNTRL
_WDWORD(0x40018000 + 0x10, 0x8AAA5551); // EEPROM_KEY
_WDWORD(0x40018000, (_RDWORD(0x40018000) & 0x38) | 0x00000200 | 0x00000001); // EEPROM_CMD = (EEPROM_CMD & DELAY) | IFREN | CON
_WDWORD(0x40018000 + 0x04, address); // EEPROM_ADR = address
_WDWORD(0x40018000, _RDWORD(0x40018000) | 0x00000040 | 0x00000080 | 0x00000100); // EEPROM_CMD |= XE | YE | SE
_RDWORD(0x40018000 + 0x0C); // EEPROM_DO
_RDWORD(0x40018000 + 0x0C); // EEPROM_DO
_RDWORD(0x40018000 + 0x0C); // EEPROM_DO
printf("0x%08X\n", _RDWORD(0x40018000 + 0x0C)); // EEPROM_DO
_WDWORD(0x40018000, _RDWORD(0x40018000) & 0x38); // EEPROM_CMD &= DELAY
_WDWORD(0x40018000 + 0x10, 0); // EEPROM_KEY
}
// Примечание: Для примера выбраны адреса 0x0 и 0x4
DEFINE BUTTON "Print info EEPROM 0", "print_info_eeprom(0)"
DEFINE BUTTON "Print info EEPROM 4", "print_info_eeprom(4)"
// Примечание: Вывод от printf может быть выведен в файл, которых сохранится на ПК. Например:
// exec("log > log.log");
// printf ("TEST\n");
// exec("log off");
Сохранить статью в PDF