EmbeddedRelated.com
Forums
The 2026 Embedded Online Conference

LPC1788 IAP Problem

Started by Lazar92 May 23, 2015
I'm working on LPC1788, trying to use In Application Programming, and in
one project where I implemented this code:

#define IAP_BASE1 0x00030000 
#define IAP_BASE2 0x00038000 
#define IAP_BASE3 0x00040000

int main(void) {

BYTE podatak1, podatak2, podatak3;
DWORD *pointer_podatak1, *pointer_podatak2, *pointer_podatak3;
uart0();

NVIC_DisableIRQ(TIMER0_IRQn); 
NVIC_DisableIRQ(TIMER1_IRQn);
NVIC_DisableIRQ(UART0_IRQn);

podatak1 = 0x33;
podatak2 = 0x63;
podatak3 = 0x84;

iap_copy_to_flash(&podatak1, IAP_BASE1, 1);
delay_1_ms();
iap_copy_to_flash(&podatak2, IAP_BASE2, 1);
delay_1_ms();
iap_copy_to_flash(&podatak3, IAP_BASE3, 1);
delay_1_ms();

pointer_podatak1 = (DWORD*) IAP_BASE1;
pointer_podatak2 = (DWORD*) IAP_BASE2;
pointer_podatak3 = (DWORD*) IAP_BASE3;

LPC_UART0->THR = *pointer_podatak1;
delay_1_ms();
LPC_UART0->THR = *pointer_podatak2;
delay_1_ms();
LPC_UART0->THR = *pointer_podatak3;
delay_1_ms();

while(1)
{
}

}

It works perfectly, but when I try to utilize it in my main project, I've
got nothing written on flash memory locations I indicated. Here is the
code in my main project to read and write from flash:

#define OFFSET_ADDRESS 0x00030000 
#define OFFSET_VERSION 0x00038000
#define OFFSET_SERIAL 0x00040000

void write_to_flash (void) { 
BYTE i;
DWORD *pointer_podatak1, *pointer_podatak2, *pointer_podatak3;

iap_copy_to_flash(&display_address, OFFSET_ADDRESS, 1);
delay_1_ms();

iap_copy_to_flash(&version, OFFSET_VERSION, 1);
delay_1_ms();

for (i=0;i<8;i++) {

iap_copy_to_flash(&serial_no, OFFSET_SERIAL+i, 1);
delay_1_ms();

} 
}

void read_from_flash (void) {

BYTE i;
DWORD *pok_add, *pok_ver, *pok_serial_no;

pok_add = (DWORD*)OFFSET_ADDRESS;
display_address = *pok_add;
delay_1_ms();
if ((display_address > MAX_OUTDOOR_DISPLAY_ADDRESS) || (display_address <
MIN_OUTDOOR_DISPLAY_ADDRESS)) display_address = UNI_ADDRESS;

pok_ver = (DWORD*)OFFSET_VERSION;
version = *pok_ver;
delay_1_ms();
if (version > MAX_FW_VERSION) version = 0;

for (i=0;i<8;i++) {
pok_serial_no = (DWORD*)OFFSET_SERIAL;
serial_no = *pok_serial_no++;
delay_1_ms();
}
for (i=0;i<8;i++) if (serial_no > 9) serial_no = 0;

}

display_address, version and serial_no[] are global variables which are
forwarded to these two functions write_to_flash and read_from_flash.
Anyone knows maybe what can cause the problem, even if the correct and
working code is implemented in main project?



---------------------------------------
Posted through http://www.EmbeddedRelated.com
On Saturday, May 23, 2015 at 1:07:17 PM UTC-4, Lazar92 wrote:
> I'm working on LPC1788, trying to use In Application Programming, and in > one project where I implemented this code: > > #define IAP_BASE1 0x00030000 > #define IAP_BASE2 0x00038000 > #define IAP_BASE3 0x00040000 > > int main(void) { > > BYTE podatak1, podatak2, podatak3; > DWORD *pointer_podatak1, *pointer_podatak2, *pointer_podatak3; > uart0(); > > NVIC_DisableIRQ(TIMER0_IRQn); > NVIC_DisableIRQ(TIMER1_IRQn); > NVIC_DisableIRQ(UART0_IRQn); > > podatak1 = 0x33; > podatak2 = 0x63; > podatak3 = 0x84; > > iap_copy_to_flash(&podatak1, IAP_BASE1, 1); > delay_1_ms(); > iap_copy_to_flash(&podatak2, IAP_BASE2, 1); > delay_1_ms(); > iap_copy_to_flash(&podatak3, IAP_BASE3, 1); > delay_1_ms(); > > pointer_podatak1 = (DWORD*) IAP_BASE1; > pointer_podatak2 = (DWORD*) IAP_BASE2; > pointer_podatak3 = (DWORD*) IAP_BASE3; > > LPC_UART0->THR = *pointer_podatak1; > delay_1_ms(); > LPC_UART0->THR = *pointer_podatak2; > delay_1_ms(); > LPC_UART0->THR = *pointer_podatak3; > delay_1_ms(); > > while(1) > { > } > > } > > It works perfectly, but when I try to utilize it in my main project, I've > got nothing written on flash memory locations I indicated. Here is the > code in my main project to read and write from flash: > > #define OFFSET_ADDRESS 0x00030000 > #define OFFSET_VERSION 0x00038000 > #define OFFSET_SERIAL 0x00040000 > > void write_to_flash (void) { > BYTE i; > DWORD *pointer_podatak1, *pointer_podatak2, *pointer_podatak3; > > iap_copy_to_flash(&display_address, OFFSET_ADDRESS, 1); > delay_1_ms(); > > iap_copy_to_flash(&version, OFFSET_VERSION, 1); > delay_1_ms(); > > for (i=0;i<8;i++) { > > iap_copy_to_flash(&serial_no, OFFSET_SERIAL+i, 1); > delay_1_ms(); > > } > } > > void read_from_flash (void) { > > BYTE i; > DWORD *pok_add, *pok_ver, *pok_serial_no; > > pok_add = (DWORD*)OFFSET_ADDRESS; > display_address = *pok_add; > delay_1_ms(); > if ((display_address > MAX_OUTDOOR_DISPLAY_ADDRESS) || (display_address < > MIN_OUTDOOR_DISPLAY_ADDRESS)) display_address = UNI_ADDRESS; > > pok_ver = (DWORD*)OFFSET_VERSION; > version = *pok_ver; > delay_1_ms(); > if (version > MAX_FW_VERSION) version = 0; > > for (i=0;i<8;i++) { > pok_serial_no = (DWORD*)OFFSET_SERIAL; > serial_no = *pok_serial_no++; > delay_1_ms(); > } > for (i=0;i<8;i++) if (serial_no > 9) serial_no = 0; > > } > > display_address, version and serial_no[] are global variables which are > forwarded to these two functions write_to_flash and read_from_flash. > Anyone knows maybe what can cause the problem, even if the correct and > working code is implemented in main project? > > > > --------------------------------------- > Posted through http://www.EmbeddedRelated.com
I've not used this particular part, however: - you say "works perfectly", but you do not check the return codes from write operation? - did you previously "prepare" and "erase" the sectors? See page 896 in the manual you linked... Hope that helps! Best Regards, Dave
The 2026 Embedded Online Conference