Я использую С8051F12x, но везде должно быть подобно. Нужно описать в С три основные функции (они все рабочие, взяты из App, комментарии оригинальные): //----------------------------------------------------------------------------- void FLASH_ByteWrite (byte addr, byte b1) {byte ps = SFRPAGE; // preserve SFRPAGE bit EA_SAVE = EA; // preserve EA char xdata * data pwrite; // FLASH write pointer EA = 0; // disable interrupts pwrite=addr; SFRPAGE = LEGACY_PAGE; FLSCL |= 0x01; // enable FLASH writes/erases PSCTL |= 0x01; // PSWE = 1 PSCTL |= 0x04; // set SFLE RSTSRC = 0x02; // enable VDDMON as reset source *pwrite = b1; // write the byte PSCTL &= ~0x04; // clear SFLE PSCTL &= ~0x01; // PSWE = 0 FLSCL &= ~0x01; // disable FLASH writes/erases SFRPAGE = ps; // restore SFRPAGE EA = EA_SAVE; // restore interrupts } //----------------------------------------------------------------------------- unsigned char FLASH_ByteRead (byte addr) {byte ps = SFRPAGE; // preserve SFRPAGE bit EA_SAVE = EA; // preserve EA char code * data pread; // FLASH read pointer byte b; EA = 0; // disable interrupts pread=addr; SFRPAGE = LEGACY_PAGE; PSCTL |= 0x04; // set SFLE b = *pread; // read the byte PSCTL &= ~0x04; // clear SFLE SFRPAGE = ps; // restore SFRPAGE EA = EA_SAVE; // restore interrupts return b; } //----------------------------------------------------------------------------- void FLASH_PageErase (byte addr) {char SFRPAGE_SAVE = SFRPAGE; // preserve SFRPAGE bit EA_SAVE = EA; // preserve EA char xdata * data pwrite; // FLASH write pointer EA = 0; // disable interrupts SFRPAGE = LEGACY_PAGE; pwrite=addr; FLSCL |= 0x01; // enable FLASH writes/erases PSCTL |= 0x03; // PSWE = 1; PSEE = 1 PSCTL |= 0x04; // set SFLE RSTSRC = 0x02; // enable VDDMON as reset source *pwrite = 0; // initiate page erase PSCTL &= ~0x04; // clear SFLE PSCTL &= ~0x03; // PSWE = 0; PSEE = 0 FLSCL &= ~0x01; // disable FLASH writes/erases SFRPAGE = SFRPAGE_SAVE; // restore SFRPAGE EA = EA_SAVE; // restore interrupts } //-----------------------------------------------------------------------------
Далее в основной программе описать константы (например. константы в 16 бит): #define Config_Add 0x80 //Start config.array #define w_RxCTL 0x00 //Config_RxCTL #define w_TestCTL 0x02 //Config_TestCTL
Потом записываем из какого-то буфера Ri[...] во Flash (с предварительным стиранием): FLASH_PageErase(Config_Add); FLASH_ByteWrite((Config_Add+w_RxCTL+1), Ri[1]);//msb FLASH_ByteWrite((Config_Add+w_RxCTL), Ri[2]); FLASH_ByteWrite((Config_Add+w_TestCTL+1),Ri[3]);//msb FLASH_ByteWrite((Config_Add+w_TestCTL), Ri[4]);
А теперь считываем из Flash константы в 16 бит (): a=FLASH_ByteRead(Config_Add+w_RxCTL+1);w=a<<8; a=FLASH_ByteRead(Config_Add+w_RxCTL);w+=a; ............... a=FLASH_ByteRead(Config_Add+w_TestCTL+1);w=a<<8; a=FLASH_ByteRead(Config_Add+w_TestCTL); w+=a;
Примеры взяты кусками из программы... В общем, удачи!
|