ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
4 мая
141465
Ксения (07.12.2008 15:47, просмотров: 16903)
Как программно изменить байт/слово во 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. Что еще может быть не так?