Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сброс контроллера
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
ruslannd
Как програмно на С сбросить контроллер (заставить выполнить прошивку заново). Камень LPC2388.
GetSmart
Вачдогом - классика. Ну или запретить все прерывания (в CPSR) и скакнуть на адрес 0. Со вторым вариантом поосторожней, криво написанная прога может неадекватно отработать такой сброс.
sergeeff
Через watchdog reset.
ruslannd
Цитата(sergeeff @ Nov 2 2009, 23:22) *
Через watchdog reset.


Час от часу не легче... А нельзя как-нить просто перейти на нулевой адрес. Если можно, то как? Мне физический сброс контроллера не нужен.
GetSmart
для IAR
asm("MOV R15,#0");
для GCC
volatile asm("MOV R15,#0");
Перед этой командой рекомендую поставить __disable_interrupt();
rezident
Цитата(ruslannd @ Nov 3 2009, 01:31) *
Час от часу не легче... А нельзя как-нить просто перейти на нулевой адрес. Если можно, то как? Мне физический сброс контроллера не нужен.

http://electronix.ru/forum/index.php?s=&am...st&p=414993
ruslannd
Цитата(GetSmart @ Nov 2 2009, 23:46) *
для IAR
asm("MOV R15,#0");
для GCC
volatile asm("MOV R15,#0");
Перед этой командой рекомендую поставить __disable_interrupt();


А для Keil?
GetSmart
Keil = GCC
Запрет прерываний там скорее всего по-другому как-то делается.
ruslannd
Не работает.

Так даже не компилится:
volatile asm("MOV R15,#0");

Сделал так, но что-то не пошло (не понятно куда вывалился):

U32 r15;
__asm
{
MOV r15, #0
}


Делал еще так:

register U32 foo __asm("r15");
foo = 0;

Реультат один в один, как и в предыдущем варианте.
rezident
А
Код
((void (*)())0x0000)();

тоже не работает?
ruslannd
Работает! Спасибо.
S1LENCE
Я вот тоже попробывал, на адрес 0 переходит, но при этом виснет в этих строчках

Код
0x0000019C  E2522010  SUBS      R2,R2,#0x00000010
0x000001A0  28A10078  STMCSIA   R1!,{R3-R6}
0x000001A4  8AFFFFFC  BHI       0x0000019C
esaulenka
Ну виснет, ну с кем не бывает...

Что за контроллер и какие предположения, что эти строки делают?
Желательно также увидеть, что там вокруг написано.
S1LENCE
LPC2148

Сам сброс:
Код
    54:         ((void (*)())0x0000)();
    55:  
0x00000512  F000      BL        __ARM_common_call_via_r0(0x000011FC) - Part #1
0x00000514  FE73      BL        __ARM_common_call_via_r0(0x000011FC) - Part #2

...

                 __ARM_common_call_via_r0:
0x000011FC  4700      BX        R0
                 __ARM_common_call_via_r2:
0x000011FE  4710      BX        R2

//Тут вроде правильно доходит до вектора ресета

   239: Vectors         LDR     PC, Reset_Addr          
0x00000000  E59FF018  LDR       PC,[PC,#0x0018]


Далее идет Setup VPBDIV, Setup PLL, Configure and Enable PLL, Wait until PLL Locked, Switch to PLL Clock, Setup MAM, Setup Stack for each mode, Enter Undefined Instruction Mode and set its Stack Pointer (также Abort, FIQ, IRQ, Supervisor, User mode)

и дальше повисает
Код
; Enter the C code

                IMPORT  __main
                LDR     R0, =__main
                BX      R0

//asm:

   416:                 IMPORT  __main
0x00000100  E24DAB01  SUB       R10,R13,#0x00000400
   417:                 LDR     R0, =__main
0x00000104  E59F0010  LDR       R0,[PC,#0x0010]
   418:                 BX      R0
   419:  
   420:  
   421:                 IF      :DEF:__MICROLIB
   422:  
   423:                 EXPORT  __heap_base
   424:                 EXPORT  __heap_limit
   425:  
   426:                 ELSE
   427:; User Initial Stack & Heap
   428:                 AREA    |.text|, CODE, READONLY
   429:  
   430:                 IMPORT  __use_two_region_memory
   431:                 EXPORT  __user_initial_stackheap
   432: __user_initial_stackheap
   433:  
0x00000108  E12FFF10  BX        R0
0x0000010C  E01FC100  DD        0xE01FC100
0x00000110  E01FC080  DD        0xE01FC080
0x00000114  E01FC000  DD        0xE01FC000
0x00000118  40000550  DD        0x40000550
0x0000011C  00000120  DD        0x00000120
                 __main:
0x00000120  EB000000  BL        __scatterload_rt2(0x00000128)
0x00000124  EB00002F  BL        __rt_entry_sh(0x000001E8)
                 __scatterload_rt2:
0x00000128  E28F002C  ADD       R0,PC,#0x0000002C
0x0000012C  E8900C00  LDMIA     R0,{R10-R11}
0x00000130  E08AA000  ADD       R10,R10,R0
0x00000134  E08BB000  ADD       R11,R11,R0
0x00000138  E24A7001  SUB       R7,R10,#0x00000001
                 __scatterload_null:
0x0000013C  E15A000B  CMP       R10,R11
0x00000140  1A000000  BNE       0x00000148
0x00000144  EB000027  BL        __rt_entry_sh(0x000001E8)
0x00000148  E8BA000F  LDMIA     R10!,{R0-R3}
0x0000014C  E24FE018  SUB       R14,PC,#0x00000018
0x00000150  E3130001  TST       R3,#0x00000001
0x00000154  1047F003  SUBNE     PC,R7,R3
0x00000158  E12FFF13  BX        R3
0x0000015C  00001188  DD        0x00001188
0x00000160  000011A8  DD        0x000011A8
                 __scatterload_copy:
0x00000164  E2522010  SUBS      R2,R2,#0x00000010
0x00000168  28B00078  LDMCSIA   R0!,{R3-R6}
0x0000016C  28A10078  STMCSIA   R1!,{R3-R6}
0x00000170  8AFFFFFB  BHI       __scatterload_copy(0x00000164)
0x00000174  E1B02E82  MOVS      R2,R2,LSL #29
0x00000178  28B00030  LDMCSIA   R0!,{R4-R5}
0x0000017C  28A10030  STMCSIA   R1!,{R4-R5}
0x00000180  45904000  LDRMI     R4,[R0]
0x00000184  45814000  STRMI     R4,[R1]
0x00000188  E12FFF1E  BX        R14
                 __scatterload_zeroinit:
0x0000018C  E3B03000  MOVS      R3,#0x00000000
0x00000190  E3B04000  MOVS      R4,#0x00000000
0x00000194  E3B05000  MOVS      R5,#0x00000000
0x00000198  E3B06000  MOVS      R6,#0x00000000
0x0000019C  E2522010  SUBS      R2,R2,#0x00000010        //и вот
0x000001A0  28A10078  STMCSIA   R1!,{R3-R6}                //тут
0x000001A4  8AFFFFFC  BHI       0x0000019C                  //крутится
0x000001A8  E1B02E82  MOVS      R2,R2,LSL #29
0x000001AC  28A10030  STMCSIA   R1!,{R4-R5}
0x000001B0  45813000  STRMI     R3,[R1]
0x000001B4  E12FFF1E  BX        R14
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.