Люди ПАМАГИТЕ не могу больше на грабли наступать.
Есть связка SK-MLPC24787 от starterkit.ru + SkyLink + uVision3 3.53(компилер RealVew 3.1.0.93).
Хочу использовать внешнюю срам для размещения отдельных функций в ней.
шаг первый:
после стартапа Си-шной фунцией инициализирую EMC. Последовательно заполняю все ячейки внешней срам, потом считываю, сравниваю все ОК.
шаг второй:
переношу функцию инициализации в стартап. Повторяю процедуру все ОК полет нормальный.
шаг третий:
указываю линкеру разместить какую либо функцию во внешней памяти. После этого
начинаю выпадать DAbort на этапе __scatterload_copy
Код
__scatterload_copy:
0x00000250 E2522010 SUBS R2,R2,#0x00000010
0x00000254 28B00078 LDMCSIA R0!,{R3-R6}
0x00000258 28A10078 STMCSIA R1!,{R3-R6} <-падает в аборт здесь
0x0000025C 8AFFFFFB BHI __scatterload_copy(0x00000250)
0x00000260 E1B02E82 MOVS R2,R2,LSL #29
0x00000264 28B00030 LDMCSIA R0!,{R4-R5}
0x00000268 28A10030 STMCSIA R1!,{R4-R5}
0x0000026C 45904000 LDRMI R4,[R0]
0x00000270 45814000 STRMI R4,[R1]
0x00000274 E1A0F00E MOV PC,R14
для того чтобы убедиться что с EMC все ок до входа в __main делаю пробную запись в срам,
Код
PCONP_OFS EQU 0x0C4 ; SCB Base Address
PINSEL_BASE_ADDR EQU 0xE002C000
PINSEL6_OFS EQU 0x18
PINSEL8_OFS EQU 0x20
PINSEL9_OFS EQU 0x24
EMC_BASE_ADDR EQU 0xFFE08000
EMC_STA_CFG0_OFS EQU 0x200
EMC_STA_WAITWEN0_OFS EQU 0x204
EMC_STA_WAITOEN0_OFS EQU 0x208
EMC_STA_WAITRD0_OFS EQU 0x20C
EMC_STA_WAITPAGE0_OFS EQU 0x210
EMC_STA_WAITWR0_OFS EQU 0x214
EMC_STA_WAITTURN0_OFS EQU 0x218
MOV R1, #1
LDR R0, =EMC_BASE_ADDR
STR R1,[R0]
;PCONP |= 0x00000800; /* Turn On EMC PCLK */
LDR R0, =SCB_BASE
LDR R1,[R0,#PCONP_OFS]
ORR R1,R1,#0x00000800;/* Turn On EMC PCLK */
STR R1,[R0,#PCONP_OFS]
;PINSEL6 = 0x00005555;
LDR R1, =0x00005555
LDR R0, =PINSEL_BASE_ADDR
STR R1,[R0,#PINSEL6_OFS]
;PINSEL8 = 0x55555555;
LDR R1, =0x55555555
STR R1,[R0,#PINSEL8_OFS]
;PINSEL9 = 0x50555555;
LDR R1, =0x50555555
STR R1,[R0,#PINSEL9_OFS]
;EMC_STA_CFG0 = 1<<19;
LDR R1, =0x00080000
LDR R0, =EMC_BASE_ADDR
STR R1,[R0,#EMC_STA_CFG0_OFS]
;EMC_STA_WAITWEN0 = 0;
LDR R1, =0
STR R1,[R0,#EMC_STA_WAITWEN0_OFS]
;EMC_STA_WAITOEN0 = 0x0;
LDR R1, =0
STR R1,[R0,#EMC_STA_WAITOEN0_OFS]
;EMC_STA_WAITRD0 = 0x1;
LDR R1, =1
STR R1,[R0,#EMC_STA_WAITRD0_OFS]
;EMC_STA_WAITPAGE0 = 0x0;
LDR R1, =0
STR R1,[R0,#EMC_STA_WAITPAGE0_OFS]
;EMC_STA_WAITWR0 = 0x0;
LDR R1, =0
STR R1,[R0,#EMC_STA_WAITWR0_OFS]
;EMC_STA_WAITTURN0 = 0x0;
LDR R1, =0
STR R1,[R0,#EMC_STA_WAITTURN0_OFS]
;external ram write test
LDR R1, =3
LDR R0, =0x80000000
STR R1,[R0]
STMIA R0!,{R3-R6}
все работает,
но как только начинается копирование в __scatterload_copy падает в аборт.
Потом баг второй обнаружился уже позже когда я попытался отлаживаться не на железе, а в
симуляторе.Начал выпадать в DAbort здесь,
Код
MOV R1, #1
LDR R0, =EMC_BASE_ADDR
STR R1,[R0]
;PCONP |= 0x00000800; /* Turn On EMC PCLK */
LDR R0, =SCB_BASE
LDR R1,[R0,#PCONP_OFS]
ORR R1,R1,#0x00000800;/* Turn On EMC PCLK */
STR R1,[R0,#PCONP_OFS]
хотя в "железе" этот участок кода работал без проблем. Уже не знаю кому доверять симулятору или "железу",
может и сам подглюкиваю
Есть укого каки идеи?
Проект прилагаю.
P.S.Если делаю по аналогии только для внутренней срам (что для эзернет, что для усб срам) то все работает.