Цитата(AlexeyT @ Jul 23 2015, 11:30)

Это не мусор, это фрагмент кода).
0x0800_01DC – возврат из вызываемой функции putc(вывод символа по UART) в main. Main занимает пространство 0х0800_B8CA-0x0800_BF6C
Затем идет подготовка к передаче нового байта. Вход в следующий putc – 0x8000_01BA, putc занимает адреса 0x0800_01BA – 0x0800_01DC
Память по этим адресам есть (см. карту памяти), программа занимает адреса 0х0800_0000-0x0800_CCC0
Вы как-то странно написали... сразу трудно въехать... У Вас идёт команда по адресу 080001DC - возврат из функции и за ней сразу идёт команда по другому адресу...
Это адрес, на который происходит возврат?
Далее идёт загрузка R1 и за ней - загрузка константы с адреса
[0x8000BFFE]. 0x8000BFFE по Вашим словам находится сразу за функцией main() -
там похоже лежит таблица констант, используемых в main().
Так вот, я Вас спрашивал - по адресу 0x8000BFFE какие-то данные (согласно map-файлу) есть?
И кстати - адрес 0x8000BFFE (если я правильно посчитал) выровнен на границу 2, а доступ в команде
LDR R0, [PC, #+0x1B4] осуществляется к двойному слову (32бит).
В ядре Кортекс можно включить запрет невыровненных доступов к памяти, тогда будет генериться исключение (не помню какое). У Вас это разрешено?
А если оно разрешено, но не разрешены всякие MMfault и UserFault, то будет происходить эскалация до HardFault насколько я помню.
Да и вообще странно, что компилятор генерит такой невыровненный код....
Попробуйте поставить бряк на точку входа в ISR HardFault и выполнить эту команду, а потом попробуйте подровнять адрес на 4 и сделать то же самое.
ЗЫ: Кстати - у Вас putc() похоже какая-то очень простая, раз выход из неё BX LR...

Цитата(AlexeyT @ Jul 23 2015, 11:30)

Секция CODE (доступ по I, D шинам)
0x0000_0000-0x0000_0FFF Область для загрузчика, отражается на внешнюю шину
0x0800_0000-0x0805_FFFF Область внутреннего ОЗУ с пользовательской программой
0x1000_0000-0x1FFF_FFFF Область доступа к внешней системной шине
Раз в МК есть разделение ОЗУ на ОЗУ для кода и данных, то может быть что первая часть не поддерживает невыровненный доступ.
Область для загрузчика, отражается на внешнюю шину - а сам загрузчик не встроенный в МК что-ль???
Цитата(AlexeyT @ Jul 23 2015, 11:30)

Чтобы отмести подозрения на загрузчик - он не используется, идет напрямую загрузка bin-файла в ОЗУ через SWD. Потом выставляется MSP, VTOR, PC - и запуск на исполнение.
Обычно это (стек и PC) выставляется первым вектором таблицы прерывания, с которого CPU их считывает при подаче reset-а эмулятором.
Цитата(AlexeyT @ Jul 20 2015, 18:16)

CFSR 0x00000100
Этим 8-мым битом CPU Вам говорит:
A bus fault on an instruction prefetch has occurred. The fault is signalled only if the
instruction is issued.И у меня вызывает большие подозрения Ваша строка:
0800_BE4A: F4F7B6F9 BL #-0xBC94Это вызов функции? Скорее всего именно она и вызывает fault. Точно узнать можно по содержимому стекинга.
Цитата(AlexeyT @ Jul 19 2015, 23:28)

Память тестировали - записывали данные, считывали - все ОК, память работоспособна, но при переходе границы 32-кБ блоков происходит HardFault:
PC = 0x0800016A, LR = 0xFFFFFFE9, XPSR = 0x21000003
Вы привели неправильные регистры. Это состояние регистров внутри ISR. Толку от него мало. Вам нужно привести регистры сохранённые при стекинге при входе в fault.
Прочитайте раздел описания ядра кортекс, посвящённый описанию стекинга и формата сохраняемых регистров.
Тогда узнаете значение PC перед срабатыванием fault.
Ещё - проверьте стек. Может он у вас элементарно переполняется.