реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Reinvoke ISP, LPC2388, Процессор отвечает не на все команды
Dreamer
сообщение Mar 26 2010, 10:12
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154



Здравствуйте.

Хочу в процессе выполнения программы запустить бутлоадер и перепрошить программу.
Для этого в нужном мне месте программы вызываю команду загрузчика "Reinvoke ISP", старался делать все по юзер мануалу, но видимо, что-то недоделал.

Вот код:

Код
#define IAP_LOCATION 0x7ffffff1
unsigned long command[5]={0};
unsigned long result[3]={0};
typedef void (*IAP)(unsigned int[],unsigned int[]);
IAP iap_entry = (IAP)IAP_LOCATION;

#define ISP_OPTION_2
void PrepareProgCPU()
{
    VICINTENCLEAR = 0xFFFFFFFF;     // Disable all interrupts
#ifdef  ISP_OPTION_2     
    //по документации - в этом случае надо выключать плл и выбрать внутренний IRC
    MAMCR =  0; //читал, что в ранних ревизиях нужно отключать MAM, у меня ревизия B
    PLLCON  = 0x00;
    PLLFEED = 0xAA;
    PLLFEED = 0x55;
    CLKSRCSEL=0;
#endif //иначе исполняем с опцией "1" - pll не выключаем
    command[0] = 57;
    iap_entry(command,result);
}


В результате получаем следующую картину.
Вызываем в программе указанную функцию. Открываем терминал. Настраиваем (пока пользуюсь скоростью 9600).
Шлем в терминал символ "?".
Получаем ответ "Synhronized". Получается, что боотлоадер запустился и отвечает на команды.
Закрываем терминал, открываем флешмеджик. Настраиваем на те же параметры, делаем старт.
Происходит стирание флеша (в статусной строке проскакивают сообщения "Erasing block").
Далее в статусной строке пишется "Programming..."
После чего выводится сообщение "Anable to communicate (transmit/receive)". Программирование прекращается, если запустить терминал, на команды больше не отвечаем.

Далее отключаю питание. Включаю. Процессор не исполняет рабочую программу, находится в редиме загрузчика. Проверяю - запускаю флешмеджик, делаю "старт" - программируется "на ура", причем с любой скоростью.

Компилирую программу с "#define ISP_OPTION_1". Это допустимо, как утверждается в документации, при этом должна установиться PCLK = CCLK/4.
У меня используется частота 72 мегагерца, если поделить на 4, получается 18, для скорости 9600 это допустимое значение.

Тестируем, получаем абсолютно идентичный результат.


Получается, что я перед вызовом "Reinvoke ISP" что-то не вернул в исходное состояние. Вопрос, что?

ЗЫ. Компилятор - IAR 5.4.


--------------------
Все врут (с) /M.D.House/
Go to the top of the page
 
+Quote Post
Dreamer
сообщение Mar 26 2010, 14:09
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154



Что-то чем дальше, тем менее понятно.
Итак, в обеих случаях бутлоадер запускается.
Об этом свидетельствуют ответы в терминале:
посылаю '?', получаю ответ "Synchronized", отвечаю "Synchronized" - получаю ответ "ОК".
Далее по юзермануалу я должен послать значение CCLK. Посылаю, но на любое число получаю ответ "1".
При этом, уже начинают работать команды "K" и "J" - получаю номер бутлоадера и номер кристалла. Получается, что либо значение частоты загрузчику либо нафиг не нужно, либо его надо передавать как-то по-другому.

А флешмеджиком воспроизвести программирование "с первого захода" по-прежнему не получается.


--------------------
Все врут (с) /M.D.House/
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 26 2010, 14:52
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dreamer @ Mar 26 2010, 13:12) *
Получается, что я перед вызовом "Reinvoke ISP" что-то не вернул в исходное состояние. Вопрос, что?

Не до, а после.
Вы скорее всего не дочитали инструкцию sad.gif - PLL по этой команде НЕ отключается и следовательно при прошивке утилитой, после синхронизации Вы должны указать частоту на которой работает контроллер. Причем эта частота ДРУГАЯ нежели Вы запустились с нуля и имеете встроенный генератор и PLL c настройками по умолчанию (14.7456KHz). В результате Flash шьется с ошибками и не работает. Из-за неверного указания частоты бывают и более интересный эффект - шьется, работает, но при попытке читать Flash, как данные - читает со сбоями.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dreamer
сообщение Mar 26 2010, 16:27
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154



Цитата
Вы скорее всего не дочитали инструкцию

Так оно понятно, что все беды от этого. Вопрос только, где именно wink.gif

Цитата
следовательно при прошивке утилитой, после синхронизации Вы должны указать частоту на которой работает контроллер.

Пытаюсь указать эту частоту. Действую четко по юзер-мануалу:

Цитата
If the signature is not valid, the auto-baud routine synchronizes with the host via serial port
0. The host should send a ’?’ (0x3F) as a synchronization character and wait for a
response. The host side serial port settings should be 8 data bits, 1 stop bit and no parity.
The auto-baud routine measures the bit time of the received synchronization character in
terms of its own frequency and programs the baud rate generator of the serial port. It also
sends an ASCII string ("Synchronized<CR><LF>") to the Host. In response to this host
should send the same string ("Synchronized<CR><LF>"). The auto-baud routine looks at
the received characters to verify synchronization. If synchronization is verified then
"OK<CR><LF>" string is sent to the host. Host should respond by sending the crystal
frequency (in kHz) at which the part is running. For example, if the part is running at 10
MHz , the response from the host should be "10000<CR><LF>". "OK<CR><LF>" string is
sent to the host after receiving the crystal frequency. If synchronization is not verified then
the auto-baud routine waits again for a synchronization character


Все проходит именно до момента ввода частоты после получения "OK<CR><LF>" от процессора.
Ввожу "<чило><CR><LF>" - получаю ответ "1<CR><LF>", что соответствует "Invalid Command".
Причем, это происходит и в случае Invoke из программы, и в случае самомтоятельного исполнения загрузчика после передергивания питания.
Получается, частота задается каким-то другим образом, но каким - не нашел. Или не там искал.

Цитата
PLL по этой команде НЕ отключается

Я пробовал отключить его программно до вызова InvokeISP. Не помогло.

Кстати, есть ли какая-то альтернатива ФлешМеджику, в которой виден будет протокол обмена? Хочется увидеть, на каком этапе происходит сбой, а кроме того, каким образом он все-таки задает эту самую пресловутую частоту. Конечно, имеется осциллограф, но хочется менее мучительных решений.

А вообще спасибо за участие.

Сообщение отредактировал Dreamer - Mar 26 2010, 16:36


--------------------
Все врут (с) /M.D.House/
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 26 2010, 16:33
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dreamer @ Mar 26 2010, 19:27) *
Я пробовал отключить его программно. Не помогло.

Да не надо его отключать - великолепно работает на любой частоте. Сделаете все без лишних фантазий с указанием правильной частоты и заработает. Проверено.
Цитата
Кстати, есть ли какая-то альтернатива ФлешМеджику, в которой виден будет протокол опроса?

smile.gif smile.gif smile.gif да http://electronix.ru/forum/index.php?showt...mp;#entry714994
Цитата
а кроме того, каким образом он все-таки задает эту самую пресловутую частоту.

Как описано в User Manual, так в точности и задает.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dreamer
сообщение Mar 28 2010, 20:30
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154



Хорошая программа, спасибо. Как задается частота, разобрался.

Но чем больше читаю документацию, тем больше путаницы.
Размышляю вот над этой фразой:
Цитата
The command does not disable
the PLL hence it is possible to invoke the bootloader when the part is running off
the PLL. In such case the ISP utility should pass the CCLK (crystal or PLL output
depending on the clock source selection Section 4–5.1) frequency after autobaud
handshake.


В настройках PLL Fcclk у меня 72 мегагерца.
Получается, что когда я пытаюсь программироваться через Invoke ISP и при этом PLL не отключаю, нужно задавать частоту осциллятора 72 мегагрца?
Задаю, запускаю программу, не прошивается, получаю вот такой результат:

Цитата
AT200/AES ISP/Terminal for LPC2000 V0.31.1 by I.Zalts
HEX file: [Ctrl+F9] rtosdemo.hex
Turn on debug level: 04
Serial Port: COM6 Baud: 9600
Oscilator: 72000KHz
COM6 opened...
Entering to LPC2000 Bootloader
DTR(1) RTS(1)
DTR(0) RTS(1)
DTR(0) RTS(0)
S(l= 1)'?'
A(l=14)'Synchronized(0D) (0A) '
-Ok
S(l=14)'Synchronized(0D) (0A) '
A(l=18)'Synchronized(0D) (0A) OK(0D) (0A) '
Synchronized 1
Setting oscillator
S(l= 7)'72000(0D) (0A) '
A(l=11)'72000(0D) (0A) OK(0D) (0A) '
Unlock
S(l= 9)'U 23130(0D) (0A) '
A(l=12)'U 23130(0D) (0A) 0(0D) (0A) '
Bootcode: S(l= 3)'K(0D) (0A) '
A(l=12)'K(0D) (0A) 0(0D) (0A) 3(0D) (0A) 3(0D) (0A) '
3.3.0
Chip ID: S(l= 3)'J(0D) (0A) '
A(l=17)'J(0D) (0A) 0(0D) (0A) 402718517(0D) (0A) '
LPC2388 512KB ROM/64KB SRAM (ID:402718517/0x1800FF35)
File : 'rtosdemo.hex' -Loaded
Converting file 'rtosdemo.hex' to binary format...
Load Address: 00000000
Linear Address: 00010000
Linear Address: 00020000
Linear Address: 00030000
Run Address Found: 0002D318
End of File
Image size: 198548. Data Aligned to 4096 Bytes (198548->200704)
Sector 00S(l= 7)'P 0 0(0D) (0A) '
A(l=10)'P 0 0(0D) (0A) 0(0D) (0A) '
S(l= 7)'E 0 0(0D) (0A) '
A(l=10)'E 0 0(0D) (0A) 0(0D) (0A) '
S(l=19)'W 1073742336 4140(0D) (0A) '
A(l=22)'W 1073742336 4140(0D) (0A) 0(0D) (0A) '
S(l=63)'M&/"?Y1CPG^5&L`#J&/"?Y1CPG^4BKK^T(/$?Y1CPG^48TP(`!`````@````,(0D) (0A) '
A(l=63)'M&/"?Y1CPG^5&L`#J&/"?Y1CPG^4BKK^T(/$?Y1CPG^48TP(`!`````@````,(0D) (0A) '
Line: 1
S(l=63)'M````$````/__________'```````````````````````````````````````(0D) (0A) '
A(l=63)'M````$````/__________'```````````````````````````````````````(0D) (0A) '
Line: 2

< bla-bla-bla...>

Line: 15
S(l=63)'M`"$`(0`A`"$`/P`````````````````_`"$`(0`A`"$`(0`A`"$`(0`_````(0D) (0A) '

Error on Echo Data(1)
M`"$`(0`A`"$`/P`````````````````_`"$`(0`A`"$`(0`A`"$`(0`_````

<bla-bla-bla...>

Line: 19
S(l=63)'M````/P`A`"$`(0`A`"$`(0`A`"$`/P`````````````````_`"$`(0`A`"$`(0D) (0A) '

Error on Echo Data(1)
M````/P`A`"$`(0`A`"$`(0`A`"$`/P`````````````````_`"$`(0`A`"$`

Line: 20
S(l= 7)'17142(0D) (0A) '

Error on writing CRC(1)


Получается, что-то я еще не учел... Не могу понять, что?
Разумеется, при передергивании питания и повторном запуске все прошивается, так как там не требуется задавать частоту.
Еще закралось подозрение, что я неправильно посчитал константы для PLL, но уже сколько раз перепроверил, замыленным глазом ошибок не нашел.
Кварц у меня стоит 12 мегагерц.

Константы для PLL вот такие:

PLL_M 11
PLL_N 0
CCLK_DIV 3

Сообщение отредактировал Dreamer - Mar 28 2010, 20:41


--------------------
Все врут (с) /M.D.House/
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 28 2010, 21:07
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dreamer @ Mar 28 2010, 23:30) *
В настройках PLL Fcclk у меня 72 мегагерца.
Получается, что когда я пытаюсь программироваться через Invoke ISP и при этом PLL не отключаю, нужно задавать частоту осциллятора 72 мегагрца?

Да, именно так.

В Вашем случае я вижу банальные сбои обмена по RS232
"Error on Echo Data(1)"
причины могут быть разными. Вы говорите, что при программировании после 'естественного' входа в загрузчик все нормально???
Цитата(Dreamer @ Mar 28 2010, 23:30) *
PLL_M 11
PLL_N 0
CCLK_DIV 3

Явно не то sad.gif для 72MHz. В общем-то все просто, но можете взять калькулятор на сайте NXP.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dreamer
сообщение Mar 29 2010, 14:02
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154



Цитата
Вы говорите, что при программировании после 'естественного' входа в загрузчик все нормально???

Да, в этом случае программируется нормально.

Цитата
Явно не то для 72MHz. В общем-то все просто, но можете взять калькулятор на сайте NXP.


Почему не то?
Взял этот калькулятор (имеется в виду экселевская табличка на сайте nxp?),
взял значение из самой верхней строки:

Цитата
CPU Divide (calc) : 4
Calculated "M" Value: 12
Given "N": 1
Fref Check: 12000000
FCCO Check: 288.00000
Actual CPU MHz:72.0000


В документации сказано, что в регистрах хранятся не сами константы M, N, CPUDivide, а их значения, уменьшенные на 1.
Отсюда получились значения 11, 0, 3.

Инициализирую PLL так:
Код
#define PLL_M         11
#define PLL_N         0
#define CCLK_DIV      3
#define USBCLK_DIV    5

  if(PLLSTAT & (1 << 25))
  {
    PLLCON = 1; // Enable PLL, disconnected.
    PLLFEED = 0xaa;
    PLLFEED = 0x55;
  }
  PLLCON = 0; // Disable PLL, disconnected.
  PLLFEED = 0xaa;
  PLLFEED = 0x55;
  SCS |= 0x20; // Enable main OSC.
  while(!(SCS & 0x40)); // Wait until main OSC is usable.
  CLKSRCSEL = 0x1; // Select main OSC, 12MHz, as the PLL clock source.
  PLLCFG = PLL_M | (PLL_N << 16);
  PLLFEED = 0xaa;
  PLLFEED = 0x55;
  PLLCON = 1; // Enable PLL, disconnected.
  PLLFEED = 0xaa;
  PLLFEED = 0x55;
  CCLKCFG = CCLK_DIV; // Set clock divider.
  USBCLKCFG = USBCLK_DIV; // Usbclk = 288 MHz/6 = 48 MHz.
  while (((PLLSTAT & (1 << 26)) == 0)); // Check lock bit status.
  do {  
    m_value = PLLSTAT & 0x00007FFF;
    n_value = (PLLSTAT & 0x00FF0000) >> 16;
  } while ((m_value != PLL_M) && ( n_value != PLL_N) );
  PLLCON = 3; // Enable and connect.
  PLLFEED = 0xaa;
  PLLFEED = 0x55;
  while ( ((PLLSTAT & (1 << 25)) == 0) ); // Check connect bit status.


--------------------
Все врут (с) /M.D.House/
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 29 2010, 14:22
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dreamer @ Mar 29 2010, 17:02) *
а их значения, уменьшенные на 1.

Тогда и называйте имена регистров, а не переменных.
"FCCO Check: 288.00000" там в errata на Вашу ревизию ограничений никаких нет?
Инициализацию Вашу не вычитывал - слабо читабельно sad.gif. У самого инициализация по традиции сразу в startup делается. Но судя по тому,
что UART у Вас работает, то как-то Вы проинициализировали. А с MAM у Вас что?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dreamer
сообщение Mar 29 2010, 14:48
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154



Цитата
"FCCO Check: 288.00000" там в errata на Вашу ревизию ограничений никаких нет?

Есть, но мои значения как раз в это ограничение вписываются:
Цитата
Problem:The maximum output of the CCO within the PLL block is limited to 290 MHz.
Workaround:Care should be taken while programming the PLL so that Fcco resides in the desired range. The suggested setting is to use a 12 MHz external crystal. Use a PLLdivider (N) of 1 and PLL multiplier (M) of 12. Putting the values in the equation:
FCCO = (2 × M × FIN) / N
Fcco = 288 MHz
The CPU Clock Configuration register (located at 0xE01F C104) can then be used to divide this frequency by 4 to produce the maximum CPU speed of 72 MHz (except on Rev ‘-’ and Rev ‘A’, see Flash.1).


--------------------
Все врут (с) /M.D.House/
Go to the top of the page
 
+Quote Post
Dreamer
сообщение Mar 29 2010, 16:04
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154



Цитата
А с MAM у Вас что?


Включен:
Код
  MAMCR = 0;
  MAMTIM = 4;
  MAMCR = 2;


Сообщение отредактировал Dreamer - Mar 29 2010, 16:23


--------------------
Все врут (с) /M.D.House/
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 29 2010, 16:37
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Не знаю. Думайте. Вот, для проверки только-что на LPC2378, но с той-же версией загрузчика, что и у Вас, по директиве boot 2000 вваливаемся в штатный загрузчик и шьемся, и запускаем прошитый 2nd загрузчик:
Код
USM3 Demo V0.03.0(520) Mar 26 2010 21:13:55, by I.Zalts
    ROM:45968 RAM:5072 Heap:400013D0 Size:60433
    Check CPU -LPC2378
    Init I2C  -Done
    Config  DC:D0F80055 -OK
    Init RTC  -Done
    Check OW  -DS18B20/Parasite.ID:87000001CD986428 Temp:+21.5
    Load FPGA -Loaded(111570) -OK
    Check FPGA:0A04 Firmware -OK
      Ext.Mem -OK
    Init TONE -Done
       Switch -OK
    Init KVVx & TS0(0100) -OK
    Init AT45 -AT45DB081x found(A4) -OK
    Init EMAC PHY01:KS8041TL Auto-negotiation:100Mb/Full -OK
         CAN1 -Done
Ready

boot 2000
Go to LPC2000 Bootloader...
Wait...
Entering to LPC2000 Bootloader -Ok
Bootcode: 3.3.0
Chip  ID: LPC2378 512KB ROM/32KB SRAM Rev:B (ID:385940773/0x1700FD25)

Erased Sectors 0..27
File    : '.\works\exe\loader_usm3.hex' -Loaded
       Linear Address: 00000000
         Load Address: 00000000
    Run Address Found: 00000000
    End of File
           Image size: 8192
Sector 00..............................................................................
...............
Sector 01..............................................................................
...............
Download Finished.
Now launching (000000) the brand new code....Success.

Dumb Terminal started
     [Alt+X] to exit[Ctrl+F9] Flash
    Found LPC2378 (Watchdog Mode)
    Loader CRC: Valid
    Kernel CRC: Not Found(FFFFFFFF)


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dreamer
сообщение Mar 30 2010, 09:30
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154



Пока хороших мыслей в голову не приходит. Приходят плохие wink.gif

Попробую зайти с другой стороны.
Ведь после передергивания питания прошивка работает.
Что если вместо использования invoke isp сделать программно reset, до этого к примеру испортив контрольную сумму, вызвав соответствующую команду IAP - тогда при ресете должно отдаться управление штатному загрузчику.
Вопрос в том, как грамотно сделать такой reset ? Как watchdog, так и вызов функции по нулевому указателю не вернет все устройства в исходные состояния, соответствующее включению устройства.


--------------------
Все врут (с) /M.D.House/
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 30 2010, 10:34
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dreamer @ Mar 30 2010, 12:30) *
Что если вместо использования invoke isp сделать программно reset

Вообще-то эта команда была не всегда, и раньше вызвал загрузчик примерно так - перепрограммируем бит перехода в загрузчик на выход и записываем в него нолик, после чего переходим по 0 адресу. Ну естественно всю конфигурацию восстанавливаем, как после сброса.
Вот образчик входа для старых чипов
Код
    // Disable all Interrupts in the VIC
    VICIntEnClear = 0XFFFFFFFF;

    // Wait while UART stop
      while( (U0LSR & LSR_TEMT) == 0 );
    temp = 0x00000000;
    VICIntSelect = temp;

    for( i=0, k=VICVectAddr0; i<= 15; i++, k += 4 )
        k = temp;

    for( i=0, k=VICVectCntl0; i<= 15; i++, k += 4 )
        k = temp;


    temp = PINSEL0;
    // Connect RXD0(P0.1) pin to GPIO P0.14 to GPIO!!!
    PINSEL0 = temp & 0xCFFFFFF0;
    // Select P0.14 as an output and (RXD0)P0.1 + P0.31 as an input
    temp = IO0DIR;
    temp = temp |   (BIT0|BIT14);
    temp = temp & (~(BIT1|BIT31));
    IO0SET = BIT0;
    IO0DIR = temp;
    // Clear P0.14
    // The bootloader will read pin P0.14 to detect if ISP is forced
    // Since P0.14 is configured as an output and set to 0, the bootloader
    // will go in ISP mode.
    IO0CLR = BIT14;

                      
    temp = 0;
    // Turn off the FIFO's and clear the buffers.
    U0FCR = temp;

    //    Disconnecting the PLL
    PLLCON  = temp;
    PLLFEED = 0xAA;
    PLLFEED = 0x55;

    // MAM Disable;
    MAMCR =  MAM_MODE_OFF;

    // Set the VPB divider to 1/4 if your application changes the VPBDIV value.
    //    The bootloader is hard-coded to use the reset value of VPBDIV register
    VPBDIV  = temp;

    // Restore reset state of Timer1
    T1PR  = temp;
    T1MCR = temp;
    T1CCR = temp;

    MEMMAP = 0x00;

... и пошли на нулевой адрес


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dreamer
сообщение Mar 30 2010, 14:36
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154



Переделал почти как вы сказали (почти - потому что процессор, инклюды и макросы в них у меня другие.)
Что-то не входит в загрузчик (или входит, но автобод не проходит)...


Сделал так:
Код
typedef  void ( * RSTFN)();
RSTFN rstfn = (RSTFN)0;

//................................................................................
.......

    VICINTENCLEAR = 0XFFFFFFFF;

    while( (U0LSR & LSR_TEMT) == 0 );

    temp = 0x00000000;
    VICINTSELECT = temp;

    for( i=0, k=VICVECTADDR0; i<= 31; i++, k += 4 )
        k = temp;

    PINSEL0 = 0; //all to gpio
    PINSEL4 = 0; //all to gpio

    // Select P2.10 as an output and (RXD0)P0.3
    //настраиваем все на вход, как при ресете
    IO0DIR = 0;
    IO0DIR |= 1 << 2; //txd - p0.2
    
    //настраиваем P2.10 на выход и сбрасываем его в 0.
    FIO2DIR = 1 << 10;
    FIO2CLR = 1 << 10;
                      
    temp = 0;
    // Turn off the FIFO's and clear the buffers.
    U0FCR = temp;

    //    Disconnecting the PLL
    PLLCON  = temp;
    PLLFEED = 0xAA;
    PLLFEED = 0x55;

    // MAM Disable;
    MAMCR =  0;//MAM_MODE_OFF;

    // Set the VPB divider to 1/4 if your application changes the VPBDIV value.
    //    The bootloader is hard-coded to use the reset value of VPBDIV register
    CCLKCFG = temp;

    // Restore reset state of Timer1
    T1PR  = temp;
    T1MCR = temp;
    T1CCR = temp;

    MEMMAP = 0x00;

//... и пошли на нулевой адрес
    rstfn();


Сообщение отредактировал Dreamer - Mar 30 2010, 14:44


--------------------
Все врут (с) /M.D.House/
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01545 секунд с 7
ELECTRONIX ©2004-2016