Как программно изменить байт/слово во flash? Согласно даташита старшие модели МК AVR (у меня AT90USB647) умеют программно писать себе во flash, используя имеющуюся у них инструкцию SPM. И вот уже как неделю бьюсь над этой проблемой, но ничего не выходит.
Программирую я на IAR AVR 5.11B. По указателю типа __flash unsigned char* компилятор позволяет только читать из flash, но запись не поддерживает (в случае EEPROM нормально читает и пишет в обе стороны).
Нашла в хидерах макрос _SPM_FILLTEMP(Addr,Word), который вроде бы должен решать проблему записи. Пытаюсь посредством его провести тест - записать слово 0x4142 по адресу 174.
Засомневалась, какой адрес надо подставлять, в байтах или словах, однако решила этим вопрросом пока не заморачиваться, а просто программатором в режиме чтения убедиться, меняется ли во flash хоть что-нибудь, после выполнения этого макроса. Если хоть куда-нибудь да пишется, то дампы flash-памяти до и после исполнения макроса должны отличаться (предварительно убедилась, что рядом стоящих символов 0x41 и 0x42 в моем бинарнике нет).
Для тех, кто не имел дела с IAR AVR, привожу ассемблерный код, в который оттранслировался этот макрос с моими параметрами:
989 __disable_interrupt();
\ 0000082A 94F8 CLI
990 _SPM_FILLTEMP( 174, 0x4142);
\ 0000082A E021 LDI R18, 1
\ 0000082C E402 LDI R16, 66
\ 0000082E E411 LDI R17, 65
\ 00000830 EAEE LDI R30, 174
\ 00000832 E0F0 LDI R31, 0
\ 00000834 0108 MOVW R1:R0, R17:R16
\ 00000836 BF27 OUT 0x37, R18
\ 00000838 95E8 SPM
991 __enable_interrupt();
\ 0000083C 9478 SEI
...
// Дальше программа дает эхо о выполнении задания
Напоминаю, что регистр 0x37, куда пишется единичка, - это регистр SPMCSR, а сама единичка - бит SPMEN.
Тест этот не прошел - какой был дамп flash сразу после прошивки, таким и остался после запуска макроса.
В чем может быть загвоздка? Может быть предварительно еще какие-то телодвижения надо было выполнить, чтобы запись состоялась?
Фузы у меня тоже вроде бы записи во flash не должны препятствовать:
avreal/WIN32 - AVR controllers LPT programmer by Redchuk Alexandr
v1.25rev6 (Dec 30 2007 17:00:01) http://www.ln.ua/~real/avreal
...
Device connected, 90USB647 detected
Fuses
...
BLB1 = 3 // No restrictions for SPM or (E)LPM accessing the Boot Loader section.
BLB0 = 3 // No restrictions for SPM or (E)LPM accessing the Application section.
Что еще может быть не так?