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



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.14 Kraj: okolica Divače
|
Objavljeno: Čet Jun 10, 2010 12:37 am Naslov sporočila: LPC2138 in IAP |
|
|
Pozdrav.
Na LPC2138 teče RTOS (RTL, Keil). Uporabljam 14.745600 MHz kristal.
Z enim taskom hočem izbrisati določen sektor. Uporabljam keilovo kodo iz "C:\Keil\ARM\Flash\LPC_IAP_256\Test".
Koda v main.c izgleda takole:
Koda: |
ret = Init(0, 14745600, 1); // vrne 0, se pravi je vse OK
ret |= EraseSector(0x0003C000);
|
V EraseSector stvar obvisi.
Šel sem debugirat funkcijo EraseSector: (obvisi pri drugem IAP_Execute stavku)
Koda: |
/*
* Erase Sector in Flash Memory
* Parameter: adr: Sector Address
* Return Value: 0 - OK, 1 - Failed
*/
int EraseSector (unsigned long adr) {
unsigned long n;
n = GetSecNum(adr); // Get Sector Number
IAP.cmd = 50; // Prepare Sector for Erase
IAP.par[0] = n; // Start Sector
IAP.par[1] = n; // End Sector
IAP_Execute (&IAP); // Execute IAP Command
if (IAP.stat) return (1); // Command Failed
IAP.cmd = 52; // Erase Sector
IAP.par[0] = n; // Start Sector
IAP.par[1] = n; // End Sector
IAP.par[2] = CCLK; // CCLK in kHz
IAP_Execute (&IAP); // Execute IAP Command <<--- tu obvisi
if (IAP.stat) return (1); // Command Failed
return (0); // Finished without Errors
}
|
Če grem šeglobje.. v IAP.s (obvisi pri BX R2)
Koda: |
;void IAP_Execute (struct sIAP *pIAP);
EXPORT IAP_Execute
IAP_Execute STMFD SP!,{LR} ; Save Return Address
ADD R1,R0,#0x14 ; R0 = &IAP.cmd, R1 = &IAP.stat
ADR LR,IAP_Exit ; Return Address
LDR R2,=0x7FFFFFF1 ; IAP Entry (Thumb Mode)
BX R2 ; Execute IAP Command <<-- tu obvisi
IAP_Exit LDMFD SP!,{LR} ; Restore Return Address
MOV PC,LR ; Return
END
|
Če ustavim debugiranje me debuger v keilu odpelje v Startup.s na tole vrstico:
Koda: |
Undef_Handler B Undef_Handler
|
Kako ugotoviti v čem je problem?
|
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.04 Kraj: Novo mesto
|
Objavljeno: Čet Jun 10, 2010 7:46 am Naslov sporočila: |
|
|
Če RTOS ne teče, te funkcije tudi ne delajo?
Ne vem več točno, a funkcija izgleda kot da je starejšega datuma.
Tole tudi ne funkcionira?
|
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70755.44
|
Objavljeno: Čet Jun 10, 2010 8:23 am Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika.
|
|
Nazaj na vrh |
|
 |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.14 Kraj: okolica Divače
|
|
Nazaj na vrh |
|
 |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.14 Kraj: okolica Divače
|
Objavljeno: Čet Jun 10, 2010 6:24 pm Naslov sporočila: |
|
|
Pravkar ugotovil...
LP2138 ima 512kB flasha, zato je potrebno uporabiti funkcijo za izračunavanje flasha iz 512kB primera... se pravi tole:
Koda: |
/*
* Get Sector Number
* Parameter: adr: Sector Address
* Return Value: Sector Number
*/
unsigned long GetSecNum (unsigned long adr) {
unsigned long n;
n = (adr >> 12) & 0x7F; // Pseudo Sector Number
if (n >= 0x78) { // High Small 4kB Sectors
n -= 0x62;
}
else if (n >= 0x08) { // Large 32kB Sectors
n = 0x07 + (n >> 3);
}
return (n); // Sector Number
}
|
Drugo deluje odlično s funkcijami, ki jih je podal umnik.
|
|
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: 499 dni
Powered by phpBB © 2001, 2005 phpBB Group
|