¿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 p>
uchar Byte_Read(uint addr)
{ p>
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; p>
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
IAP_Disable();
} p>