Red de conocimiento informático - Material del sitio web - ¿Cómo leer y escribir FLASH con un microcontrolador?

¿Cómo leer y escribir FLASH con un microcontrolador?

Eso es todo. Lo uso todo el tiempo.

Si no lo entiende, puede contactarme

#define CMD_IDLE 0

#define CMD_READ 1

#define CMD_PROGRAM 2

#define CMD_ERASE 3

#define ENABLE_IAP 0X82// SYSCLK<24M

#define IAP_ADDRESS 0X0000

void IAP_Disable()//Hacer MCU si está en estado seguro

{

//Apague la función IAP, borre los registros de funciones especiales relevantes y ponga la CPU en un estado seguro.

//Es se recomienda desactivar la función IAP después de completar una operación IAP continua. No es necesario desactivarla cada vez

IAP_CONTR = 0 //Desactivar la función IAP

IAP_CMD = 0; //Borrar el registro de comando para que no haya ningún comando en el registro de comando. Esta oración no es necesaria

IAP_TRIG = 0 //Borrar el registro de activación de comando para que no haya ningún comando. disparador, esta oración no es necesaria

IAP_ADDRH = 0x80; // 0x80

IAP_ADDRL = 0;

}

//Leer un byte, debe activar la función IAP antes de llamar, entrada: DPTR = dirección de byte, retorno: A = byte leído

uchar Byte_Read(uint addr)

{

IAP_CONTR=ENABLE_IAP; //Habilita la función IAP y configura el tiempo de espera de la operación Flash

IAP_CMD= CMD_READ //Comando de lectura de bytes IAP/ISP/EEPROM

IAP_ADDRL=addr; //Establece la dirección alta de 8 bits de la dirección de la unidad de destino

IAP_ADDRH=addr>>8 / /Establece la dirección inferior de 8 bits de la dirección de la unidad de destino

IAP_TRIG=0X5A;//Envíe 5Ah primero y luego envíe A5h al registro de activación ISP/IAP, esto debe hacerse cada vez

IAP_TRIG= 0XA5;//Después de enviar A5h, el El comando ISP/IAP se activa inmediatamente

_nop_();

IAP_Disable();//Cierre la función IAP y borre el registro de funciones especiales relacionadas, manteniendo la CPU en un estado seguro

return IAP_DATA;

}

//Programación de bytes, la función IAP debe estar activada antes de llamar, entrada: DPTR = palabra Dirección de sección, A= bytes de datos a programar

void Byte_Program(uint addr,uchar dat)

{

IAP_CONTR=ENABLE_IAP;//Abrir función IAP, establecer operación Flash en espera time

IAP_CMD=CMD_PROGRAM;//Comando de programación de bytes IAP/ISP/EEPROM

IAP_ADDRL=addr;//Establezca los 8 bits altos de la dirección de la unidad de destino Dirección

IAP_ADDRH=addr>>8; //Establece la dirección inferior de 8 bits de la dirección de la unidad de destino

IAP_DATA=dat; //Los datos a programar se envían primero al registro IAP_DATA

p>

IAP_TRIG=0X5A;//Envíe 5Ah primero, luego envíe A5h al registro de activación ISP/IAP, esto debe hacerse cada vez

IAP_TRIG=0XA

5; //Después de enviar A5h, el comando ISP/IAP se activa inmediatamente

_nop_();

IAP_Disable();//Cierre la función IAP y borre las funciones especiales relacionadas. para poner la CPU en un estado seguro,

}

void Sector_Erase(uint addr) //Borrar sector, entrada: DPTR = dirección del sector

{

IAP_CONTR=ENABLE_IAP;

IAP_CMD=CMD_ERASE;

IAP_ADDRL=addr;

IAP_ADDRH=addr>>8;

IAP_TRIG=0X5A;

IAP_TRIG=0XA5;

_nop_();

IAP_Disable();

}