Estou querendo escrever nos últimos setores da flash de um Lpc2368 (setor 26 ou 27) - no Keil uVision3
Tentei fazer com a ajuda do exemplo "C:\Keil\ARM\Flash\LPC_IAP2_512". Ele não acusa erro ao compilar, mas quando executa o comando 51 + complementos ele tb não grava
Consegui o seguinte exemplo tb:
#include <LPC214x.h>
typedef void (*IAP)(unsigned int [],unsigned int []);
IAP iap_bypointer;
void iap_byfunction (unsigned *cmd,unsigned *rslt,unsigned entry);
unsigned command[5];
unsigned result[5];
char Ram_Arry[] = "Hello World";
char *Ram_Pointer;
unsigned char const dado __at 0x0000A000 ;
//unsigned char const dado __at 0x0000A000 = 0xFF; //tambem fuciona na versao ARM
unsigned char const *ler_da_flash;
unsigned char teste;
void main (void) __arm //Compile this in ARM instruction set
//Tem que garantir que 'e ARM por causa do valor do valor do ponteiro IAP
{
unsigned char index;
unsigned int Valor_ID_micro,Valor_Retorno;
unsigned char temp;
iap_bypointer = (IAP) 0x7FFFFFF1; //set IAP entry address in function pointer
//este valor so pode ser usado no modo ARM
Ram_Pointer = 0x40000100; //Set pointer to RAM
//Qualque valor alto da RAM
//obs. cuidado para nao estrapolar, garamtir + 32bytes usado delo micro pg.306 do 214x
temp = dado;
*Ram_Pointer = ++temp; //incrementa o contador
Ram_Pointer++;
for (index = 0; index<0x0B; index++) //Copy data to be written to flash into the RAM
{
*Ram_Pointer = Ram_Arry[index];
Ram_Pointer++;
}
command[0] = 0x36; //command code for "Read part ID"
iap_byfunction(command,result,0x7FFFFFF0); //Call IAP functions by function method
Valor_ID_micro = result[1];
//micro dec hex
//LPC2141 196353 0x0002 FF01
//LPC2142 196369 0x0002 FF11
//LPC2144 196370 0x0002 FF12
//LPC2146 196387 0x0002 FF23
//LPC2148 196389 0x0002 FF25
command[0] = 50; //Prepare sector five for a write operayion
command[1] = 8; //Start Sector Number - ver pg. 296 do 214x
command[2] = 8; //Start Sector Number - 0X0000 5000 - 0X0000 5FFF
iap_bypointer(command,result);
Valor_Retorno = result[0];
command[0] = 52; //erase sector five
command[1] = 8; //Start Sector Number
command[2] = 8; //Start Sector Number
command[3] = 12000; //Cclk == 12Mhz Pll is disabled in startup code
iap_bypointer(command,result);
Valor_Retorno = result[0];
command[0] = 50; //Prepare sector five for a write operayion
command[1] = 8;
command[2] = 8;
iap_bypointer(command,result);
Valor_Retorno = result[0];
command[0] = 51; //write 512 bytes from address 0x40000100
command[1] = 0x0000A000; //to 0x0000A000 in flash memory, start address
command[2] = 0x40000100; //start RAM adrress
command[3] = 512; //quantos bytes 256 | 512 | 1024 | 4096
command[4] = 12000; // see erase comment above
iap_byfunction(command,result,0x7FFFFFF0);
Valor_Retorno = result[0];
IODIR1 = 0x00FF0000; // set all ports to output
IOCLR1 = ~(dado << 16); //clear output pins
IOSET1 = (dado << 16); //set output pins
//verifica se foi gravado corretamente
ler_da_flash = 0x0000A001;
for (index = 0; index<0x0B; index++) //Verifica Gravacao
{
teste = *ler_da_flash;
ler_da_flash++;
}
//fim da verificacao
while(1) {}
}
void iap_byfunction (unsigned *cmd,unsigned *rslt,unsigned entry) __thumb //compile this in Thumb instruction set
{
__asm { mov r15,r2; } //move entry address into PC
}
Apesar de ser para o LPC214x o princípio é o mesmo.
O que eu gostaria de saber é o seguinte:
1 - Por que quando uso as macros __thumb ou __asm o compilador que espera um "{" antes do __thumb?
2 - O compilador diz que o registrador R15 é desconhecido em: __asm { mov r15,r2; } //move entry address into PC. O que devo fazer para utilizar essas macros?
3 - Pq hora é utilizada iap_bypointer, e hora é utilizado iap_byfunction(command,result,0x7FFFFFF0); ? Qual a diferença entre eles?
4 - Alguem poderia fornecer algum exemplo que funcione?