Content originally posted in LPCWare by Lazar92 on Fri May 08 02:48:46 MST 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?