Pristup FLASH memoriji mikrokontrolera
Hi Tech PICC STD pruža nekoliko metoda za pristup sadržaju programske memorije za vreme izvršavanja programa. Prilikom izmene sadržaja programske memorije mora se biti izuzetno oprezan. Ukoliko se modifikuje lokacija koja se trenutno izvršava ili se selektuje region izvršnog koda da se koristi kao stalno skladište podataka, rezultat može biti fatalan i može doći do otkazivanja rada uređaja.
Kompajler će voditi računa o brisanju lokacija u FLASH memoriji, za mikrokontrolere koji zahtevaju operaciju bisanja lokacije pre upisivanja u istu, tako da nije neophodno implementirati posebno ovaj korak. Podaci, u istom bloku podataka koji se briše istovremeno i u koje se neće izvršiti upis, biće sačuvani pre operacije brisanja i povraćeni po završetku te operacije.
Makroi za pristup FLESH memoriji
Slično kao i kod EEPROM rutina za čitanje i pisanje postoje ekvivalentne rutine za FLASH memoriju. Da bi se upisao podatak veličine jednog bajta na određenu adresu u FLASH memoriji koristićemo sledeći makro:
FLASH_WRITE(adresa,promenljiva);
Za čitanje podatka sa adrese u flash memoriji, i smeštanje istog u promenljivu koristimo drugi makro:
Promenljiva = FLASH_READ(adresa);
Funkcije za pristup FLESH memoriji
Za pristup FLASH memoriji koriste se tri funkcije. Njihova deklaracija je sledeća:
#include <htc.h>
unsigned int flash_read(unsigned short addr);
void flash_erase(unsigned short addr);
void flash_copy(const unsigned char * source_addr, unsigned char length, unsigned short dest_addr);
Funkcije flash_read()
pruža istu funkcionalnost kao i makro FLASH_READ()
, ali će potencijalno smanjiti zauzetost prostora u kodu, ukoliko postoji više poziva iste. Istovremeno je omogućeno čitanje jedne reči iz FLASH memorije. Kao povratnu informaciju ova funkcija vraća reč koju je pronašla na zadatoj adresi.
#include <htc.h>
void main(void) {
unsigned int data;
unsigned short addr = 0x1000;
data = flash_read(addr);
}
Funkcija flash_copy()
dozvoljava kopiranje blokova memorije na lokacijama u FLASH memoriji. Blokovi podataka koji se kopiraju mogu biti smešteni u RAM ili u programsku memoriju. Ova rutina je omogućena samo za mikrokontrolere koji omogućavaju upis u flash memoriju veličine koje su veće od jedne reči istovremeno.
Pri pozivu funkcije prvi parametar mora biti konstantni pokazivač (const pointer) na adresu sa koje se kopirju podaci. Pokazivač može da pokazuje na validnu adresu u RAM-u ili u FLASH memoriji. Drugi parametar označava broj reči podataka koje je potrebno kopirati. Poslednji parametar predstavlja adresu u FLASH memoriji gde će podaci biti smešteni.
#include <htc.h>
const unsigned char ROMSTRING[] = "0123456789ABCDEF";
void main(void) {
const unsigned char * ptr = &ROMSTRING[0];
flash_copy(ptr,5,0x70);
}
Dakle u prethodnom primeru funkcija flash_copy
kopira 5 podataka, počevši od adrese na kojoj se nalazi prvi karakter stringa ROMSTRING
, na adresu >code>0x70 u FLASH memoriju.
Za malu podgrupu mikrokontrolera koji omogućavaju nezavisnu kontrolu za brisanje blokova FLASH memorije, funkcija flash_erase()
omogućava traženu funkcionalnost. Pri pozivu ove funkcije sve lokacije u okviru bloka memorije, biće vraćene na vrednost u neprogramiranom stanju (0xFF
). U okviru bloka memorije se nalaze 32 lokacije i nije moguće pojedinačno brisanje. Prosleđivanje adrese funkciji flash_erase()
će obrisati sve 32 lokacije u bloku u kome se prosleđena adresa nalazi.
#include <htc.h>
void main(void) {
unsigned short addr = 0x1000;
flash_erase(addr);
}
Napomena: Funkcija flash_write
ne postoji.
Leave your response!
You must be logged in to post a comment.