|
Запускается во FLASH, но не доходит до main() !?, IAR, LPC2294, J-link, 1M RAM, 4M ROM (OLIMEX) |
|
|
|
May 15 2009, 21:24
|
Группа: Новичок
Сообщений: 4
Регистрация: 15-05-09
Пользователь №: 49 137

|
Несколько дней бьюсь над проблемой. Помогите.. Имею: IAR, LPC2294, J-link, 1M RAM, 4M ROM (OLIMEX). Проект нормально работает в RAM (под JTAG'ом). После прошивки PHILIPS'овской утилитой во FLASH (с расчетом KS и размещением по 0х00000014 адресу) имею следующее: В отладчике IAR'а, через JTAG, работает. Без отладчика - прорабатывает cstarup, __low_level_init и после проработки ее последней команды return (1) куда-то "девается"... Я исполльзую scmRTOS ну и соответственно __low_level_init ее родная, в нее добавил только инициализацию частоты процессора, портов и включение MAM (MAMTIM=3). В стандартном cstartup, в самом начале, перед определением стеков добавил настройку внешней памяти. Там есть такие слова, что-то вроде: "свои инициализации добавлять сюда..". Добавил вот только сегодня. Возлагал на это дело большие надежды.. Не помогло..! Как я понял, что добираюсь до указанного места? Просто в самом начале __low_level_init настроил один из pin'ов процессора на выход и в цикле мигаю светодиодом. Так вот до выхода из __low_level_init мигает, а в main() уже нет. В отладчике мигает и в main(). Да и вообще в отладчике программа выполняет свое назначение. Да, еще! В отладчике наблел, что между __low_level_init и main() прорабатывается две (видимо стандартные процедуры) что-то вроде __sector_init (инициализирует ICODE) и чего-то там еще (какя-то вложенная процедура). Не запомнилось, так, как уже уходил с работы. Увидел только, что во всю используется стек, а он у меня во внешней памяти (проект большой, ну и стек ему соответствует). Успел только попробовать с инициализацией внешней памяти в cstartup. Но, как уже сказал - не помогло. Раньше работал с 51-ми, ATmega, Winbond, с msp430-м немного. В ARM все не так! Медленно, как-то все продвигается! Помогите советом.
Сообщение отредактировал DnTrm - May 15 2009, 21:29
|
|
|
|
|
 |
Ответов
|
May 19 2009, 16:27
|
Группа: Новичок
Сообщений: 4
Регистрация: 15-05-09
Пользователь №: 49 137

|
Andy Mozzhevilov, примите слова благодарности! Все заработало! Спасибо за советы где искать! Насчет сумбура согласен. Часть того, что наблюдал - под вопросом. Рассказываю, что сделал: Начал по одной ремить строчки Setup макроса и запускать отладчик. Выяснил, что на строчке инициализации регистра PINSEL2 все и происходит, т.е. начинает работать (точнее не работать), как и при простом запуске без IAR'а. Регистр PINSEL2 при этом содержит 0x0F6009F4. В макросе же я инициировал значением 0x0F000924: __writeMemory32(0x0F000924, 0xE002C014, "Memory"); //00001111 00000000 00001001 00100100 //bits 0 1 = xx(00) (reserved) //bit 2 = 1 (pins P1.31:26 are used as a JTAG port) //bit 3 = 0 (pins P1.25:16 are used as GPIO pins) //bits 5 4 = 10 (pins P2.7:0 - D7:0 // pin P1.0 - CS0, // pin P1.1 - OE, // pin P3.31 - BLS0, // pins P2.15:8 - D15:8, // pin P3.30 - BLS1, // pins P2.27:16 - D27:16, // pins P2.29:28 - D29:28, // pins P2.31:30 - D31:30, // pins P3.29:28 - BLS2:3) //bit 6 = x(0) (controls the use of pin P3.29 is not, as bits 5:4 are 10) //bit 7 = x(0) (controls the use of pin P3.28 is not, as bits 5:4 are 10) //bit 8 = 1 (pin P3.27 - WE) //bits 10 9 = xx(00) (reserved) //bit 11 = 1 (pin P3.26 - CS1) //bit 12 = x(0) (reserved) //bit 13 = x(0) (controls the use of pin P3.23 is not, as bits 25:23 are 110) //bits 15 14 = 00 (pin P3.25 are used as GPIO pin) //bits 17 16 = 00 (pin P3.24 are used as GPIO pin) //bits 19 18 = xx(00) (reserved) //bit 20 = x(0) (controls the use of pin P2.29:28 is not, as bits 5:4 are 10) //bit 21 = x(0) (controls the use of pin P2.30 is not, as bits 5:4 are 10) //bit 22 = x(0) (controls the use of pin P2.31 is not, as bits 5:4 are 10) //bit 23 = 0 (P3.0 are used as GPIO pin) //bit 24 = 1 (P3.1 - A1) //bits 27 25 = 111 (P23:2 - A23:2) //bits 31 28 = xxxx(0000) (reserved) Кдючевым оказалось то, что при значении 0x0F6009F4 биты 5, 4 равны 11 и внешняя шина данных отсутствует! После того, как добавил следующий код в cstartup, все заработало: CODE32 ?cstartup . . . ; Add initialization nedded before setup of stackpointers here
; Initialization of MEMMAP MOV R1,#0xE0000000 ORR R1,R1,#0x1FC000 #ifdef RAM_MAP ;MEMMAP = 2; MOV R2,#0x2 #endif #ifdef ROM_MAP ;MEMMAP = 1; MOV R2,#0x1 #endif STR R2,[R1,#+64] ;Set Data bus functionality ;PINSEL1 = 0x0; ;GPIO for P0.16 - P0.25 and P0.27 - P0.30 MOV R0,#0xE0000004 ORR R0,R0,#0x2C000 MOV R1,#0x0 STR R1,[R0,#+0] ;PINSEL2 &= 0x00000004; LDR R1,[R0,#+16] AND R1,R1,#0x4 STR R1,[R0,#+16] ;PINSEL2 |= 0x0F000920; ;00001111 00000000 00001001 00100000 LDR R1,[R0,#+16] MOV R2,#0xF000000 ORR R2,R2,#0x920 ORR R1,R2,R1 STR R1,[R0,#+16] ; Initialization of EMC ; BCFG0=0x10002480; ; FLASH 16bit; IDCY = 1; WST1 = 4; RBLE = 1; WST2 = 4 ; 00010000 00000000 00100100 10000000 MOV R1,#0xF0000000 ORR R1,R1,#0xFE00000 MOV R2,#0x10000000 ORR R2,R2,#0x2480 STR R2,[R1,#+0] ; BCFG1=0x20000400; ; SRAM 32bit; IDCY = 1; WST1 = 0; RBLE = 1; WST2 = 0 ; 00100000 00000000 00000100 00000000 MOV R2,#0x20000000 ORR R2,R2,#0x400 STR R2,[R1,#+4] . . . MEMMAP, наверно, можно было не инициировать, т.к. на старте в нем уже единица (подтянутая ножка P0.14 + KS по адресу 0х00000014), но я его проинициировал на всякий случай. Биты 5 и 4 PINSEL2 после сброса в единицах, я так понимаю, тоже из-за внутренних подтяжек на соответствующих пинах ( BOOT1:0 ). Много получилось, но зато поделился изысканиями! :0) Еще раз спасибо! Успехов! Думаю, что загляну еще и нераз! Пока.
Сообщение отредактировал DnTrm - May 19 2009, 16:30
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|