Testing FlashIAP library with MBED OS 6 and sleep functions

Files at this revision

API Documentation at this revision

Comitter:
mmdonatti
Date:
Tue Aug 11 17:07:42 2020 +0000
Parent:
1:1fbedf72d2a6
Commit message:
circular buffer implemented, using Flash pages and sectors

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Tue Aug 11 01:21:40 2020 +0000
+++ b/main.cpp	Tue Aug 11 17:07:42 2020 +0000
@@ -16,11 +16,63 @@
 
 #include "mbed.h"
 
-// Blinking rate in milliseconds
+#define FLASH_DEBUG
+
+#ifdef FLASH_DEBUG
+#define FLASH_PRINTF(fmt, ...)          pc.printf("FLASH: " fmt "\r\n", ##__VA_ARGS__)
+#else
+#define FLASH_PRINTF(fmt, ...)          __NOP()
+#endif //Config enabled DEBUG
+
+// Time definitions
 #define SLEEP_DELAY         10
 #define HEARTBEAT_DELAY     1
 
-#define FLASH_ADDR          0xa000
+//LPC1768 has two sector sizes (4kB and 32kB)
+#define SIZE_4KB                  0x1000
+#define SIZE_32KB                 0x8000
+
+// 4kB Sectors
+#define BLOCK_0x00000_0x00FFF     0x00000
+#define BLOCK_0x01000_0x01FFF     0x01000
+#define BLOCK_0x02000_0x02FFF     0x02000
+#define BLOCK_0x03000_0x03FFF     0x03000
+#define BLOCK_0x04000_0x04FFF     0x04000
+#define BLOCK_0x05000_0x05FFF     0x05000
+#define BLOCK_0x06000_0x06FFF     0x06000
+#define BLOCK_0x07000_0x07FFF     0x07000
+#define BLOCK_0x08000_0x08FFF     0x08000
+#define BLOCK_0x09000_0x09FFF     0x09000
+#define BLOCK_0x0A000_0x0AFFF     0x0A000
+#define BLOCK_0x0B000_0x0BFFF     0x0B000
+#define BLOCK_0x0C000_0x0CFFF     0x0C000
+#define BLOCK_0x0D000_0x0DFFF     0x0D000
+#define BLOCK_0x0E000_0x0EFFF     0x0E000
+#define BLOCK_0x0F000_0x0FFFF     0x0F000
+
+//32kB Sectors
+#define BLOCK_0x10000_0x17FFF     0x10000
+#define BLOCK_0x18000_0x1FFFF     0x18000
+#define BLOCK_0x20000_0x27FFF     0x20000
+#define BLOCK_0x28000_0x2FFFF     0x28000
+#define BLOCK_0x30000_0x37FFF     0x30000
+#define BLOCK_0x38000_0x3FFFF     0x38000
+#define BLOCK_0x40000_0x47FFF     0x40000
+#define BLOCK_0x48000_0x4FFFF     0x48000
+#define BLOCK_0x50000_0x57FFF     0x50000
+#define BLOCK_0x58000_0x5FFFF     0x58000
+#define BLOCK_0x60000_0x67FFF     0x60000
+#define BLOCK_0x68000_0x6FFFF     0x68000
+#define BLOCK_0x70000_0x77FFF     0x70000
+#define BLOCK_0x78000_0x7FFFF     0x78000
+
+//Application Definitions
+#define DATA_LENGTH     1           //in bytes
+#define USED_BLOCKS     10          //number of used blocks
+#define BLOCK_SIZE      SIZE_32KB   //block size
+#define FIRST_BLOCK     BLOCK_0x10000_0x17FFF
+#define FLAG            1
+#define DEFAULT_DATA    'e'    
 
 Serial pc(USBTX, USBRX,115200);
 
@@ -32,16 +84,22 @@
 char buffer[30];
 
 char last_value;
-FlashIAP flash;
-uint32_t page_size,sector_size,flash_size;
-uint32_t addr;
-
-int ret;
 
 void message_completed();
 // Heart beat function 
 void beat();
 
+FlashIAP flash;
+uint32_t page_size,sector_size,flash_size;
+uint32_t addr,active_addr;
+char erased_byte;
+int ret,active_block;
+
+void init_flash();
+void get_flash_data(char* buffer);
+void save_flash_data(char* buffer);
+char flash_buffer[DATA_LENGTH+1];
+
 int main() {
     heartbeat.attach(&beat,HEARTBEAT_DELAY); //Attaching the address of the function beat() and the interval HEATTBEAT_DELAY
     idx_buffer=0;
@@ -49,35 +107,9 @@
     //Testing if Flash IAP will break after sleep 
     ThisThread::sleep_for(SLEEP_DELAY);
     
-    flash.init();
-    
-    flash_size = flash.get_flash_size();
-    pc.printf("flash size: 0x%.8x\r\n",flash_size);
-    
-    addr = flash.get_flash_start();
-    pc.printf("flash start: 0x%.8x\r\n",addr);
-    
-    page_size = flash.get_page_size();
-    pc.printf("Get Page Size: 0x%.8x\r\n",page_size);
-    
-    pc.printf("\r\n\n");
-    pc.printf("--------------------Flash Memory Mapping--------------------\r\n");
-    pc.printf("Start Address\tSector Size\r\n");
-    do{
-        sector_size = flash.get_sector_size(addr);
-        pc.printf("0x%.8x\t0x%.8x\r\n",addr,sector_size);
-        addr = addr + sector_size;
-        
-    }while(addr < flash_size);
-    
-    pc.printf("------------------------------------------------------------");
-    pc.printf("\r\n\n");
-    
-    sector_size = flash.get_sector_size(FLASH_ADDR);
-    pc.printf("Get Sector Size at 0x%.8x: 0x%.8x\r\n",FLASH_ADDR,sector_size);
-    
-    ret = flash.read(&last_value,FLASH_ADDR,1);
-    pc.printf("Returned %d  - Reading last value using Flash IAP: %c\r\n",ret,last_value);
+    init_flash();
+    get_flash_data(&last_value);    
+    FLASH_PRINTF("Reading last value using Flash IAP: %c",last_value);
     
     while(1) {
         if(pc.readable())
@@ -94,17 +126,127 @@
     }
 }
 
+void write_flash(char *buffer,int){
+    
+    
+}
+
+void init_flash(){
+    char aux;
+    
+    flash.init();
+    
+    FLASH_PRINTF("\r\n");
+    FLASH_PRINTF("--------------------Flash IAP Test - LPC1768 512kB--------------------");
+    flash_size = flash.get_flash_size();
+    FLASH_PRINTF("Flash Size: 0x%.8x",flash_size);
+    
+    addr = flash.get_flash_start();
+    FLASH_PRINTF("Flash Start: 0x%.8x",addr);
+    
+    page_size = flash.get_page_size();
+    FLASH_PRINTF("Page Size: 0x%.8x",page_size);
+    
+    FLASH_PRINTF("\r\n");
+    FLASH_PRINTF("--------------------Flash Memory Mapping--------------------");
+    FLASH_PRINTF("Start Address\tSector Size");
+    do{
+        sector_size = flash.get_sector_size(addr);
+        FLASH_PRINTF("0x%.8x\t0x%.8x",addr,sector_size);
+        addr = addr + sector_size;
+        
+    }while(addr < flash_size);
+    
+    FLASH_PRINTF("------------------------------------------------------------");
+    FLASH_PRINTF("\r\n");
+    
+    erased_byte = flash.get_erase_value();
+    FLASH_PRINTF("Erased Byte Value: 0x%.2X",erased_byte);
+}
+
+void get_flash_data(char* buffer){
+    char aux;
+    int i,j;
+    active_addr=0;
+    for(i=0;i<USED_BLOCKS && active_addr==0;i++){
+        ret = flash.read(&aux,FIRST_BLOCK+i*BLOCK_SIZE,1);
+        FLASH_PRINTF("Returned %d  - Reading 0x%0.8X: 0x%02X\t%c",ret,FIRST_BLOCK+i*BLOCK_SIZE,aux,aux);
+        if(aux==erased_byte)
+            FLASH_PRINTF("block %d is new",i);
+        else{
+           ret = flash.read(&aux,FIRST_BLOCK+(i+1)*BLOCK_SIZE-page_size,1); 
+           if(aux==erased_byte){
+              FLASH_PRINTF("block %d is not full",i);
+              active_block = i;
+              for(j=0;j<BLOCK_SIZE-page_size;j=j+page_size){
+                 ret = flash.read(&aux,FIRST_BLOCK+i*BLOCK_SIZE+j,1);
+                 FLASH_PRINTF("Read Address 0x%.8x: %.02X",FIRST_BLOCK+i*BLOCK_SIZE+j,aux);
+                 if(aux==FLAG){
+                    FLASH_PRINTF("Block %d Address: 0x%.8x is used",i,FIRST_BLOCK+i*BLOCK_SIZE+j);
+                 } 
+                 else{
+                    active_block = i;
+                    active_addr = FIRST_BLOCK+active_block*BLOCK_SIZE+j;
+                    ret = flash.read(buffer,active_addr-page_size+1,DATA_LENGTH);
+                    FLASH_PRINTF("Block %d Address: 0x%.8x Returned %d  - Reading last value using Flash IAP: 0x%02X\t%c",i,active_addr-page_size,ret,last_value,last_value);
+                    break;
+                }   
+              }
+           } 
+           else{
+              FLASH_PRINTF("block %d is full",i);
+            
+           } 
+        }
+    }
+    if(active_addr==0){
+        active_block = 0;
+        active_addr = FIRST_BLOCK+active_block*BLOCK_SIZE;
+        FLASH_PRINTF("All Blocks are new: using block %d at address 0x%.8x",active_block,active_addr);        
+    }  
+}
+
+void save_flash_data(char* buffer){
+    char aux;
+    int i;
+    aux = FLAG;
+    flash_buffer[0] = FLAG;
+    for(i=0;i<DATA_LENGTH;i++)
+        flash_buffer[i+1]=buffer[i];
+        
+    if(active_addr+page_size<FIRST_BLOCK+(active_block+1)*BLOCK_SIZE-1){ //If current block is not full
+        ret = flash.program(flash_buffer,active_addr,DATA_LENGTH+1); 
+        FLASH_PRINTF("Returned %d  - Saving Data to address 0x%0.8X",ret,active_addr+1); 
+        active_addr = active_addr+page_size;
+        FLASH_PRINTF("Saving new data to bank %d and address 0x%0.8X",active_block,active_addr);
+    }
+    else{ //If current block is full
+        FLASH_PRINTF("block %d is full",active_block);
+        int new_bank;
+        new_bank = (active_block+1)%USED_BLOCKS;                                    //Next Flash Bank
+        FLASH_PRINTF("erasing block %d",new_bank);
+        ret = flash.erase(FIRST_BLOCK+new_bank*BLOCK_SIZE,sector_size);             //Erase new bank    
+        ret = flash.program(flash_buffer,FIRST_BLOCK+new_bank*BLOCK_SIZE,DATA_LENGTH+1); 
+        FLASH_PRINTF("Saving new data to bank %d and address 0x%0.8X",new_bank,FIRST_BLOCK+new_bank*BLOCK_SIZE);
+        
+        FLASH_PRINTF("Programming old block %d as obsolete",active_block);
+        ret = flash.program(&aux,FIRST_BLOCK+(active_block+1)*BLOCK_SIZE-page_size,1); 
+        FLASH_PRINTF("Returned %d  - Saving Data to address 0x%0.8X: 0x%02X",ret,FIRST_BLOCK+(active_block+1)*BLOCK_SIZE-page_size,aux); 
+        active_addr = FIRST_BLOCK+new_bank*BLOCK_SIZE+page_size;  
+        active_block = new_bank; 
+    }  
+}
+
+
 void message_completed()
 {
     msg_completed = !msg_completed;
-    ret = flash.read(&last_value,FLASH_ADDR,1);
-    pc.printf("Returned %d  - Reading last value using Flash IAP: %c\r\n",ret,last_value);
-    ret = flash.erase(FLASH_ADDR,sector_size);
-    pc.printf("Erase returned %d\r\n",ret);
-    ret = flash.program(buffer,FLASH_ADDR,page_size);
-    pc.printf("Returned %d - Saving %c using flash IAP\r\n",ret,buffer[0]); 
-    flash.read(&last_value,FLASH_ADDR,1);
-    pc.printf("Returned %d  - Reading last value using Flash IAP: %c\r\n",ret,last_value);
+    ret = flash.read(&last_value,active_addr-page_size+1,DATA_LENGTH);
+    FLASH_PRINTF("Returned %d  - Reading last value using Flash IAP: 0x%02X\t%c",ret,last_value,last_value);
+    save_flash_data(buffer);
+    FLASH_PRINTF("Saving %c using flash IAP",buffer[0]); 
+    ret = flash.read(&last_value,active_addr-page_size+1,DATA_LENGTH);
+    FLASH_PRINTF("Returned %d  - Reading last value using Flash IAP: 0x%02X\t%c",ret,last_value,last_value);
 }
 
 void beat()