www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

LPC2138 in IAP

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
jvolk
Član
Član



Pridružen-a: Ned 05 Mar 2006 1:14
Prispevkov: 737
Aktiv.: 3.14
Kraj: okolica Divače

PrispevekObjavljeno: Čet Jun 10, 2010 12:37 am    Naslov sporočila:  LPC2138 in IAP Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.04
Kraj: Novo mesto

PrispevekObjavljeno: Čet Jun 10, 2010 7:46 am    Naslov sporočila:   Odgovori s citatom

Č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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Član
Član



Pridružen-a: Pon 23 Avg 2004 16:16
Prispevkov: 16777190
Aktiv.: 70755.47

PrispevekObjavljeno: Čet Jun 10, 2010 8:23 am    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jvolk
Član
Član



Pridružen-a: Ned 05 Mar 2006 1:14
Prispevkov: 737
Aktiv.: 3.14
Kraj: okolica Divače

PrispevekObjavljeno: Čet Jun 10, 2010 9:47 am    Naslov sporočila:   Odgovori s citatom

Danes sem tel preverit kaj je v LR registru, pa mi je skočil na "DAbt_Handler"...

Preizkusil sem še kodo, ki jo je umnik pripel v drugi temi (ne vem kako sem jo spregledal d'oh! )

Tista dela, vendar mi get_secnum() ne vrne pravega sektorja glede na tabelo iz pdfja (dodana kot priponka).

Recimo naslov 0x00078000 mi vrne številko sektorja 24 (po tabeli je 22).

Zakaj prihaja do razlik?

Če ročno vpišem številko sektorja, brisanje deluje super. Smile



sektorji.PNG
 Opis:
 Velikost datoteke:  44.32 KB
 Pogledana:  6 krat

sektorji.PNG


Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
jvolk
Član
Član



Pridružen-a: Ned 05 Mar 2006 1:14
Prispevkov: 737
Aktiv.: 3.14
Kraj: okolica Divače

PrispevekObjavljeno: Čet Jun 10, 2010 6:24 pm    Naslov sporočila:   Odgovori s citatom

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. Smile
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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