Для себя потихоньку изучаю Cortex-M3 на уровне хобби. Попытался наскоком проморгаться светодиодом на LPC1768. Не получилось...
Среда: uVision 4.
Кристалл тактируется внутренним 4 MHz RC-генератором.
Забил в uVusion следующий код на асме:
STACK EQU 0x10008000
FIO2DIR EQU 0x2009C040
FIO2SET EQU 0x2009C058
FIO2CLR EQU 0x2009C05C
AREA RESET,DATA,READONLY
DCD STACK
DCD Start
AREA MAIN,CODE,READONLY
ENTRY
Start
MOV R0,#0x0001
LDR R1,=FIO2DIR
STR R0,[R1]
NOP
LDR R1,=FIO2SET
STR R0,[R1]
B Start
END
Исходник успешно собрался. Захожу в отладку через встроенный симулятор. Прогнал пошагово всю программу - результат положительный: как и ожидал по адресам FIO2DIR (0x2009C058) и FIO2SET (0x2009C058) было записано значение 0x01.
Далее заливаю прошивку в кристалл через J-Link 8 и по JTAG выполняю пошаговое исполнение как ранее в симуляторе. В итоге получаю следующее:
По адресу FIO2DIR (0x2009C058) происходит корректная запись 0x01.
А вместо того, чтобы писать по адресу FIO2SET (0x2009C058) на деле 0x01 пишется по совсем левому адресу.
Далее добавляю после первой записи в FIO2DIR различное количество NOP и это влияет на значения мусора который образуется вместо заданых адресов FIO2DIR (0x2009C058) и FIO2SET (0x2009C058), т.е. идет запись по совсем левым адресам. Но при этом опять же в Keilовском симуляторе все исполняется корректно.
Подскажите, кто разобрался с CM3 ядром, где собака порылась?
Спасибо.