aaarrr 69 27 мая, 2010 Опубликовано 27 мая, 2010 · Жалоба Как получается, что флэш начинается с 0x08000000, RAM с 0x20000000, а таблица векторов с 0? Где же она физически находится? Ответ, как ни странно, находится в разделе 2.4 мануала: Depending on the selected boot mode main Flash memory, System memory or SRAM is accessible as follows: ● Boot from main Flash memory: the main Flash memory is aliased in the boot memory space (0x0000 0000), but still accessible from its original memory space (0x800 0000). In other words, the Flash memory contents can be accessed starting from address 0x0000 0000 or 0x800 0000. ● Boot from System memory: the System memory is aliased in the boot memory space (0x0000 0000), but still accessible from its original memory space (0x1FFF F000). ● Boot from the embedded SRAM: SRAM is accessible only at address 0x2000 0000. Скажите, а какой, собственно, смысл грузиться из SRAM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 27 мая, 2010 Опубликовано 27 мая, 2010 · Жалоба Скажите, а какой, собственно, смысл грузиться из SRAM? Хороший вопрос :) IMHO ноги растут от предыдущих чипов, где это было с внешней памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 27 мая, 2010 Опубликовано 27 мая, 2010 · Жалоба Ответ, как ни странно, находится в разделе 2.4 мануала: Скажите, а какой, собственно, смысл грузиться из SRAM? За ссылку в мануал спасибо, это я проглядел... А грузиться из RAM - в первую очередь хочу разобраться в механизме. А во вторую - жалко флэш насиловать - чуть что-то изменил в программе, заходишь в отладку - опять зашивай! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 28 мая, 2010 Опубликовано 28 мая, 2010 · Жалоба А грузиться из RAM - в первую очередь хочу разобраться в механизме. А во вторую - жалко флэш насиловать - чуть что-то изменил в программе, заходишь в отладку - опять зашивай! Вы что ноги будете перепаивать? Или там джамперы есть? Что бы под отладчиком грузиться из ОЗУ - нужен правильный скрипт, который VTOR ставит. И все отлично работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 мая, 2010 Опубликовано 28 мая, 2010 · Жалоба Вы что ноги будете перепаивать? Или там джамперы есть? Что бы под отладчиком грузиться из ОЗУ - нужен правильный скрипт, который VTOR ставит. И все отлично работает. Выдайте свой скрипт, если не жалко. Джамперы есть, а как же. Дальнейшие размышления привели к следующим выводам. Загрузка из флэш или систем понятна - выставил джамперы, сбросился, скакнул в адрес 0x0, прочитал, куда назначить стек, скакнул в 0x4, прочитал и перешел на адрес. Можно сразу задать, что микроконтроллер имеет память по нулевым адресам. А при загрузке из ОЗУ на нулевые адреса ничего не отображается. Т.е. по нулевым адресам ничего нет. Как тогда прочитать вектор сброса? В отладчике это можно сделать предварительно, настроив VTOR 0xE000ED08 (кстати, а это где описано? с ходу не нашел). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 мая, 2010 Опубликовано 28 мая, 2010 · Жалоба И еще один вывод получился. Если я загружаюсь из флэш, установив перемычки в (0,0), то я могу доступиться к флэш по нулевым адресам и по 0x08000000. А также я могу доступиться и в систем память (загрузчик) по адресам 0x1ffff000. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 28 мая, 2010 Опубликовано 28 мая, 2010 · Жалоба Выдайте свой скрипт, если не жалко. Для IAR execUserReset( ) { __message "RAM START"; __writeMemory32(0x20000000,0xE000ED08,"Memory"); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба У Keil есть чуть более "хитрый" файл ini FUNC void Setup (void) { SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register } LOAD RAM\Blinky.axf INCREMENTAL // Download Setup(); // Setup for Running G ,main // Выполнить программу до main Blinky.axf, понятно, должен быть скомпилирован для RAM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Maks 0 11 июня, 2010 Опубликовано 11 июня, 2010 (изменено) · Жалоба Скажите, а какой, собственно, смысл грузиться из SRAM? Я решил для себя, что смысл есть. Во-первых быстрее грузится и моментально подгружает части кода, если это нужно. Во-вторых Flash имеет конечное количество циклов перезаписи. Изменено 11 июня, 2010 пользователем _Макс Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 11 июня, 2010 Опубликовано 11 июня, 2010 · Жалоба Во-первых быстрее грузится и моментально подгружает части кода, если это нужно. Зато объем меньше и скорость исполнения программы ниже. Во-вторых Flash имеет конечное количество циклов перезаписи. 10K - это уже ограничение не столько на число загрузок программы, сколько на число модификаций флеш со стороны самой программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 14 февраля, 2011 Опубликовано 14 февраля, 2011 · Жалоба Обнаружил непонятное явление - в Keil при отладке программы в RAM невозможно пользоваться симулятором. На первой же команде выскакивает HardFault. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-JonnS- 0 14 февраля, 2011 Опубликовано 14 февраля, 2011 · Жалоба Наверно надо добавить в RAM.INI строку: xPSR = 0x1000000; Подробнее здесь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 14 февраля, 2011 Опубликовано 14 февраля, 2011 · Жалоба Наверно надо добавить в RAM.INI строку: xPSR = 0x1000000; Подробнее здесь Спасибо, помогло. Теперь новая напасть вылезла. Не находится main функция в минимально простеньком проекте. LOAD Keil_Minimal.axf incremental // Download Setup(); // Setup for Running GO ,main ______^ *** error 34, line 26: undefined identifier Хотя main в проекте есть, и по командам симулятор доходит и до нее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-JonnS- 0 14 февраля, 2011 Опубликовано 14 февраля, 2011 (изменено) · Жалоба Возможно что надо еще разписать и периферию в ini файле: MAP 0x40000000, 0x40023400 read write // Peripferial Вобщем лучше отключить "go main" запустить симуляцию, смотреть по асм. Прилагаю свой ram.ini Ps Добавить в "Option for Target"->"C/C++"->"Define" VECT_TAB_SRAM RAM.rar Изменено 14 февраля, 2011 пользователем -JonnS- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 14 февраля, 2011 Опубликовано 14 февраля, 2011 · Жалоба Прилагаю свой ram.ini Добавить в "Option for Target"->"C/C++"->"Define" У меня, практически, такой же файл upd Такой, да не совсем. Посмотрите на мои 2 и 3 строки. По-моему, у вас ошибка. FUNC void Setup(void) { SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register xPSR = 0x1000000; } // RESET // MAP 0x64000000, 0x6407ffff read write // MAP 0x6c000000, 0x6c03ffff read write // MAP LOAD Keil_Minimal.axf incremental // Download Setup(); // Setup for Running G , main А периферию я не использую, выкинул все. Может, перестарался :) Вот весь файл с майн #include "stm32f10x.h" uint32_t Cnt; int32_t main(void) { while (1) { Cnt++; } } А "Define" что? :) Ага, нашел. Нет, у меня такого нет. Работает и так. У меня: STM32F10X_HD upd2 И с Go разобрался - нужно писать G, а не GO. Исправил в файле, все работает! (ну и лох же я) :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться