|
Reinvoke ISP, LPC2388, Процессор отвечает не на все команды |
|
|
|
Mar 26 2010, 10:12
|
Участник

Группа: Участник
Сообщений: 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/
|
|
|
|
|
Mar 26 2010, 14:09
|
Участник

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

|
Что-то чем дальше, тем менее понятно. Итак, в обеих случаях бутлоадер запускается. Об этом свидетельствуют ответы в терминале: посылаю '?', получаю ответ "Synchronized", отвечаю "Synchronized" - получаю ответ "ОК". Далее по юзермануалу я должен послать значение CCLK. Посылаю, но на любое число получаю ответ "1". При этом, уже начинают работать команды "K" и "J" - получаю номер бутлоадера и номер кристалла. Получается, что либо значение частоты загрузчику либо нафиг не нужно, либо его надо передавать как-то по-другому.
А флешмеджиком воспроизвести программирование "с первого захода" по-прежнему не получается.
--------------------
Все врут (с) /M.D.House/
|
|
|
|
|
Mar 26 2010, 14:52
|

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

|
Цитата(Dreamer @ Mar 26 2010, 13:12)  Получается, что я перед вызовом "Reinvoke ISP" что-то не вернул в исходное состояние. Вопрос, что? Не до, а после. Вы скорее всего не дочитали инструкцию  - PLL по этой команде НЕ отключается и следовательно при прошивке утилитой, после синхронизации Вы должны указать частоту на которой работает контроллер. Причем эта частота ДРУГАЯ нежели Вы запустились с нуля и имеете встроенный генератор и PLL c настройками по умолчанию (14.7456KHz). В результате Flash шьется с ошибками и не работает. Из-за неверного указания частоты бывают и более интересный эффект - шьется, работает, но при попытке читать Flash, как данные - читает со сбоями.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 26 2010, 16:27
|
Участник

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

|
Цитата Вы скорее всего не дочитали инструкцию Так оно понятно, что все беды от этого. Вопрос только, где именно  Цитата следовательно при прошивке утилитой, после синхронизации Вы должны указать частоту на которой работает контроллер. Пытаюсь указать эту частоту. Действую четко по юзер-мануалу: Цитата 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/
|
|
|
|
|
Mar 26 2010, 16:33
|

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

|
Цитата(Dreamer @ Mar 26 2010, 19:27)  Я пробовал отключить его программно. Не помогло. Да не надо его отключать - великолепно работает на любой частоте. Сделаете все без лишних фантазий с указанием правильной частоты и заработает. Проверено. Цитата Кстати, есть ли какая-то альтернатива ФлешМеджику, в которой виден будет протокол опроса?  да http://electronix.ru/forum/index.php?showt...mp;#entry714994Цитата а кроме того, каким образом он все-таки задает эту самую пресловутую частоту. Как описано в User Manual, так в точности и задает.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 28 2010, 20:30
|
Участник

Группа: Участник
Сообщений: 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/
|
|
|
|
|
Mar 28 2010, 21:07
|

Гуру
     
Группа: Свой
Сообщений: 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 Явно не то  для 72MHz. В общем-то все просто, но можете взять калькулятор на сайте NXP.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 29 2010, 14:02
|
Участник

Группа: Участник
Сообщений: 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/
|
|
|
|
|
Mar 29 2010, 14:22
|

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

|
Цитата(Dreamer @ Mar 29 2010, 17:02)  а их значения, уменьшенные на 1. Тогда и называйте имена регистров, а не переменных. "FCCO Check: 288.00000" там в errata на Вашу ревизию ограничений никаких нет? Инициализацию Вашу не вычитывал - слабо читабельно  . У самого инициализация по традиции сразу в startup делается. Но судя по тому, что UART у Вас работает, то как-то Вы проинициализировали. А с MAM у Вас что?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 29 2010, 14:48
|
Участник

Группа: Участник
Сообщений: 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/
|
|
|
|
|
Mar 29 2010, 16:04
|
Участник

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

|
Цитата А с MAM у Вас что? Включен: Код MAMCR = 0; MAMTIM = 4; MAMCR = 2;
Сообщение отредактировал Dreamer - Mar 29 2010, 16:23
--------------------
Все врут (с) /M.D.House/
|
|
|
|
|
Mar 29 2010, 16:37
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 30 2010, 09:30
|
Участник

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

|
Пока хороших мыслей в голову не приходит. Приходят плохие  Попробую зайти с другой стороны. Ведь после передергивания питания прошивка работает. Что если вместо использования invoke isp сделать программно reset, до этого к примеру испортив контрольную сумму, вызвав соответствующую команду IAP - тогда при ресете должно отдаться управление штатному загрузчику. Вопрос в том, как грамотно сделать такой reset ? Как watchdog, так и вызов функции по нулевому указателю не вернет все устройства в исходные состояния, соответствующее включению устройства.
--------------------
Все врут (с) /M.D.House/
|
|
|
|
|
Mar 30 2010, 10:34
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 30 2010, 14:36
|
Участник

Группа: Участник
Сообщений: 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/
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|