 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Pet Mar 12, 2010 12:56 pm Naslov sporočila: ARM: start bootloader? |
|
|
V aplikaciji na LPC2109 / 2129 bi rad imel tudi funkcijo nalaganja novega firmware-a.
Ne bi rad tlačil notri novega custom bootloaderja, če pa mi obstoječi odgovarja. Uporabljen bo samo kot servisni pripomoček, uporabnik ne bo imel dostopa do te funkcije.
Aplikacija že komunicira preko UART-a. Rad bi samo še, da ko pošljem ustrezen ukaz, štarta vgrajen bootloader.
Lahko samo naredim Jump na določen naslov in bo kar delalo? Kolikor sem bral, se dogaja tudi nek address-remaping, kar je neugodna zadeva.
Ali bi moral procesor najprej izpraznit en kondenzator na P0.14 pinu in potem sam sebe hardversko resetirat?  _________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pet Mar 12, 2010 1:48 pm Naslov sporočila: |
|
|
Če bi rad startal vgrajen bootloader je najboljše, da na UART povežeš še reset pin. Tako boš dosegel, da bootloader startaš kar iz svoje aplikacije.
Z UART signali potegneš P0.14 na maso, z njimi tudi resetiraš procesor in si v bootloaderju.
Potem samo uporabiš predpisane ukaze, naložiš program, zapišeš checksum (na eno lokacijo je potrebno zapisat dvojiški komplement nekega checksuma, na pamet ne vem točno) in to je vse. Address remaping boš potreboval samo v primeru, če boš nalagal svojo aplikacijo na poljuben naslov v flashu. Če aplikacijo naložiš na naslov, kamor običajno skoči procesor po resetu, address remapinga ne potrebuješ. |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70658.96
|
Objavljeno: Pet Mar 12, 2010 2:13 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Pet Mar 12, 2010 2:20 pm Naslov sporočila: |
|
|
P14 in Reset pin sta globoko v ohišju in nista priklopljena na serijski port (RS422 komunikacija na 100 metrov).
To rabim, kar je Mare napisal. Hvala  _________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Pet Mar 12, 2010 5:09 pm Naslov sporočila: |
|
|
Hmmmm
Zadeva ne deluje.
V dokumentaciji piše:
Citiram: |
Table 319. IAP command summary
IAP Command - Command Code
Prepare sector(s) for write operation - 50
Copy RAM to Flash - 51
Erase sector(s) - 52
Blank check sector(s) - 53
Read Part ID - 54
Read Boot code version - 55
Compare - 56 |
Dokumentacija je UM10114 LPC21xx and LPC22xx User manual Rev. 03 - 2 April 2008, stran 329
Tsti ukaz, zgoraj omenjen je
Citiram: |
command[0] = 0x39; |
0x39 = 57 (črka '9'), ki ni dokumentirana.
Zadeva izvrši IAP ukaz in se vrne. In se nato vrti v tisti while(1) zanki... Preverjeno.
Bi moral še preverit status, kakšen rezultat vrne v Result tabeli.
V glavnem, ne gre mi tole...
Dosti šihta za danes.
Če pa ima še kdo kakšno idejo, se priporočam. _________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
Benjamin Član

Pridružen-a: Tor 10 Jul 2007 11:23 Prispevkov: 116 Aktiv.: 0.53 Kraj: Trebnje, Ljubljana
|
Objavljeno: Pet Mar 12, 2010 6:03 pm Naslov sporočila: |
|
|
LPC2109 / 2129 kot kaže ne podpirata tega ukaza (vsaj v dokumentaciji ne piše).
Lahko pa tudi programsko določiš pin P0.14 kot '0', ter skočiš na reset.
http://www.nxp.com/documents/application_note/AN10356.pdf _________________ Cessna 152: "Flight Level Three Thousand, Seven Hundred"
Controller: "Roger, contact Houston Space Center" |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70658.96
|
Objavljeno: Pet Mar 12, 2010 7:22 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Sob Mar 13, 2010 9:30 pm Naslov sporočila: |
|
|
Super, bom preizkusil tale AN10356.
Hvala! _________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Pon Mar 15, 2010 2:53 pm Naslov sporočila: |
|
|
Kodi iz AN sem moral dodat še par vrstic, da sem spravil uC nazaj na reset vrednosti, in sicer: PLL, VPBDIV, FastIO, MAM, Timerje.
Hitrost UART-a je nastavljena na tisto, ki tudi sicer deluje pri prvem programiranju (v mojem primeru 38.400 baud pri 12 MHz kristalu).
Evo delujočo kodo
Kliče se funkcija start_bootloader (); in dela.
Koda: |
void start_bootloader (void);
void bootloader_init (void);
void (*bootloader_entry)(void);
unsigned long temp;
void bootloader_init(void)
{
SCS = 0; // izklop Fast IO na obeh portih
MAMCR = 0;
T0TCR=0; // ugasne števce
T1TCR=0;
VICIntEnClr = 0xFFFFFFFF; // disable vseh interruptov
/* Connect RXD0 & TXD0 pins to GPIO */
PINSEL0 = 0; // reset state - GPIO
PINSEL0|=0x00000005; // nastavi kot UART nogici
/* Select P0.14 as an output and P0.1 as an input */
temp = 0; // vsi so vhodi
temp = temp | 0x4000; //p0.14 = out
IODIR0 = temp;
/* Clear P0.14 */
IOCLR0 = 0x4000;
// Init UART0
// RxD0, TxD0
PINSEL0 &= 0xFFFFFF0F;
PINSEL0 |= 0x00000050;
// 8 bits, no Parity, 1 Stop bit
U0LCR = 0x83;
// Baud rate
U0FDR = 0x10; // default on reset - izklop baudarate fine-tuninga
// U0DLM = ( FPCLK / 16 ) / UART_BAUD / 0x100;
// U0DLL = ( FPCLK / 16 ) / UART_BAUD % 0x100;
U0DLM = 0;
U0DLL = 98; // 38400 baud @ 12 MHz kristal
U0LCR = 0x03;
U0FCR = 0x07;
/* Disconnect PLL if you want to do ISP at crystal frequency. Otherwise you need to pass the PLL freq when bootloader goes in ISP mode.
cclk = crystal when PLL is disconnected
cclk = PLL freq when PLL is connected.
Disconnecting the PLL is recommended. */
PLLCON = 0x00;
PLLFEED = 0xAA;
PLLFEED= 0x55;
/* 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 = 0x0;
/* Restore reset state of Timer1 */
T1PR=0x0;
T1MCR=0x0;
T1CCR=0x0;
/* Map bootloader vectors */
MEMMAP = 0x0;
/* Point to bootloader entry point i.e. reset vector 0x0 */
bootloader_entry = (void (*)(void))(0x0);
}
/* Invoke the bootloader
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. */
void start_bootloader (void)
{
bootloader_init();
while(1)
bootloader_entry();
} |
_________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
tonko Član


Pridružen-a: Sob 25 Jun 2005 13:45 Prispevkov: 541 Aktiv.: 2.28 Kraj: Črnomelj
|
Objavljeno: Sre Nov 09, 2011 9:59 am Naslov sporočila: |
|
|
A ima kdo izkušnje kako zagnati ISP mode na LPC2478 ?
Na LPC2148 mi deluje brez problema, tukaj pa kot kaže je nekaj drugače in ne gre. |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70658.96
|
Objavljeno: Sre Nov 09, 2011 10:09 am Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
tonko Član


Pridružen-a: Sob 25 Jun 2005 13:45 Prispevkov: 541 Aktiv.: 2.28 Kraj: Črnomelj
|
Objavljeno: Sre Nov 09, 2011 1:19 pm Naslov sporočila: |
|
|
Mare najlepša hvala!
Pred tvojo kodo sem dodal še nekaj in sedaj mi dela AutoBaud in pa Watchdogu sem povečal timeout. Uart0Init ni več potrebna.
Koda: |
#define WDCLOCK2 1000000 //INTERNI RC CLOCK ZA WATCHDOG 4mhz / 4
#define WATCHDOG_TIMEOUT2 (WDCLOCK2 * 60*10) // = 10min
#define WD_RESET2 {WDFEED = 0xAA; WDFEED = 0x55;} //WDTC = WATCHDOG_TIMEOUT; //SEKVENCA POTREBNA ZA RESET WATCHDOG TIMERJA
PLLCON = 0x00;
PLLFEED = 0xAA;
PLLFEED = 0x55;
PLLCFG = 0x00;
PLLFEED = 0xAA;
PLLFEED = 0x55;
CCLKCFG = 0x00;
//AUTO BAUD DELA CE JE CLOCK SOURCE INT-RC
CLKSRCSEL = 0x00; //Clock Source Select register - 00 Selects the Internal RC oscillator as the PLL clock source (default).
// SET WATCHDOG TIMEOUT - PODALJSAJ
WDCLKSEL = 0x00; //Selects the Internal RC oscillator as the Watchdog clock source 4Mhz
WDTC = WATCHDOG_TIMEOUT2; //32 bitni register za watchdog timeout - 100sek
WDMOD = 0x03;
WD_RESET2;
|
|
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 5 dni
Powered by phpBB © 2001, 2005 phpBB Group
|