Почитал, потыкался, и судя по всему IAR ARM не поддерживает у себя какую-либо работу с EEPROM.
- регион EEPROM в файле линкера такой-же как и для rw data.
- все что помещается в регион EEPROM компилятор считает за данные в ОЗУ и соответственно обыденно с ними и пытается работать.
- если эти данные делать __no_init, то все корректно.
- если попытаться им присвоить начальные значения, компилятор генерит секцию инициализации в стартапе как для ОЗУ.
как следствие, после старта приложения проходит попытка записи в EEPROM как в ОЗУ и взводятся флаги ошибок записи.
- дебаггер об особой области EEPROM знает, но сам записывать в нее не умеет (write failed (CPU data abort))
На сайте ИАРа нашел
Tech Note "Initializing the eeprom at program download" для STM8, где иаровцы говорят, что это они пока не доделали, но обещают доделать. Два года уже прошло...
Просмотрел Release Notes на новые версии ИАРа, включая ноне последний 8.20, нигде упоминания слова eeprom нет.
Так что, пока в ИАРе нужно делать инициализацию самому на run-time стадии.
з.ы. может быть есть еще вариант, наподобие предложенного Сергеем, заставить линкер генерить отдельный файл прошивки для региона EEPROM, в ручную добавлять эти строки в общий файл прошивки и скармливать его нормальному программатору, типа STM32 ST-LINK Utility. Он точно умеет писать все.
Но исследовать не буду. Ключи от AVR линкер ARMа не понимает, а мне после размышлений, для моих задач, run-time инициализация сейчас нравиться даже больше.