CODE
#define PSEE 1 // PSEE: Program Store Erase Enable
#define PSWE 0 // PSWE: Program Store Write Enable
#define FLASH_UNLOCK_CODE_1 0xA5
#define FLASH_UNLOCK_CODE_2 0xF1
void flash_write_byte(uint16 ptr, uint8 byte)
{
bit EA_save=1;
uint8 xdata * data pwrite;
volatile uint8 i;
volatile uint8 j;
{
EA_save = EA;
DISABLE_INTERRUPT();
VDM0CN = (1<<VDMEN); // enable VDD monitor
RSTSRC = (1<<PORSF); // enable VDD monitor as a reset source
// Unlock flash for modify
//
PSCTL |= (1<<PSWE); // бит PSWE=1;
PSCTL &=~ (1<<PSEE); // бит PSEE=0;
FLKEY = FLASH_UNLOCK_CODE_1;
FLKEY = FLASH_UNLOCK_CODE_2;
VDM0CN = (1<<VDMEN); // enable VDD monitor
RSTSRC = (1<<PORSF); // enable VDD monitor as a reset source
pwrite = (uint8 xdata*) ptr;
*pwrite = byte;
// Lock flash for modify
PSCTL &= (~ (1<<PSWE)); //бит PSWE=0;
for (i = 0; i < 0xff; i++)
{
for (j = 0; j < 10; j++)
{
}
}
//возвращаем состояние контроллера прерываний на момент до запрещения прерываний
EA = EA_save;
}
}
Используется так:
CODE
#define SKEY_ADRESS (0x0C00)// Указатель на серийный номер S-KEY
#define SKEY_LENGTH_BYTE 32 // длина серийного номера в байтах
uint8 xdata skey_buffer[SET_SKEY_PACKET_LENGTH_BYTE + 1];
uint8 i;
// Перезапись из временного буфера в ПЗУ
for (i = 0; i < SKEY_LENGTH_BYTE + 1; i++)
{
flash_write_byte(SKEY_ADRESS + i, skey_buffer[i]);
}
Среда разработки Keil.
Что программист делает не так? Сравнил с документацией, вроде все удовлетворяет требованиям.
Спасибо.