36 #if (defined(__PIC24F__) || defined(__PIC24E__)|| defined(__dsPIC33E__))
37 #warning For all PIC24F and some PIC24E/dsPIC33E family members, the DATA_FLASH_PAGE is set to the second to last flash page instead of the last page,
38 #warning as the last flash page in the 24F family contains the configuration bits.
42 #if defined(__PIC24HJ64GP502__) || defined(__PIC24FJ64GA002__)
43 #define LAST_IMPLEMENTED_PMEM 0x00ABFF
44 #elif defined(__PIC24HJ32GP202__) || defined(__PIC24FJ32GA002__) || defined(__dsPIC33FJ32GP202__)
45 #define LAST_IMPLEMENTED_PMEM 0x0057FF
46 #elif defined(__dsPIC33FJ128GP802__)
47 #define LAST_IMPLEMENTED_PMEM 0x0157FF
48 #elif defined(__PIC24EP64GP202__) //PIC24E test
49 #define LAST_IMPLEMENTED_PMEM 0x00AFFF
51 #error "Define LAST_IMPLEMENTED_PMEM for your processor!
56 #if (defined(__PIC24F__) || defined(__PIC24E__)|| defined(__dsPIC33E__))
57 #define DATA_FLASH_PAGE (((LAST_IMPLEMENTED_PMEM/FLASH_PAGESIZE)*FLASH_PAGESIZE)-FLASH_PAGESIZE) //2nd to last page of flash
59 #if (defined(__PIC24H__)|| defined(__dsPIC33F__))
60 #define DATA_FLASH_PAGE ((LAST_IMPLEMENTED_PMEM/FLASH_PAGESIZE)*FLASH_PAGESIZE) //last page of flash
65 #define RECORD_SIZE 15 //arbitrarily chosen
66 #define NUM_RECORDS 8 //arbitrarily chosen
67 #define FREE_STATUS 0xA5 //arbitrarily chosen, different from USED_STATUS
68 #define USED_STATUS 0x5A //arbitrarily chosen, different from FREE_STATUS
72 char data[RECORD_SIZE];
75 #define NUM_ROWS (((NUM_RECORDS*sizeof(REC))/FLASH_ROWBYTES) + 1)
76 #define FLASH_DATA_SIZE (NUM_ROWS*FLASH_ROWBYTES)
78 typedef union _UFDATA {
79 REC records[NUM_RECORDS];
80 char fill[FLASH_DATA_SIZE];
83 UFDATA fdata __attribute__ ((aligned(4)));
85 void doFormat(UFDATA* p_ufdata) {
87 for (u16_i = 0; u16_i < NUM_RECORDS; u16_i++) {
88 p_ufdata->records[u16_i].status = FREE_STATUS;
92 void doCommit(UFDATA* p_ufdata) {
94 u_memaddr.u32 = DATA_FLASH_PAGE;
98 void doRead(UFDATA* p_ufdata) {
100 u_memaddr.u32 = DATA_FLASH_PAGE;
104 void doDelete(
uint16_t u16_recnum) {
105 fdata.records[u16_recnum].status = FREE_STATUS;
108 void doPrint(UFDATA* p_ufdata) {
110 for (u16_i = 0; u16_i < NUM_RECORDS; u16_i++) {
111 printf(
"%d: %s, Data: %s\n",
112 u16_i, (p_ufdata->records[u16_i].status == FREE_STATUS ?
"Free" :
"Used"),
113 (p_ufdata->records[u16_i].status == FREE_STATUS ?
"n/a" : p_ufdata->records[u16_i].data));
117 void doInsert(UFDATA* p_ufdata,
char* sz_1) {
119 for (u16_i = 0; u16_i < NUM_RECORDS; u16_i++) {
120 if (p_ufdata->records[u16_i].status == FREE_STATUS) {
123 p_ufdata->records[u16_i].data[u16_j] = *sz_1;
127 p_ufdata->records[u16_i].data[u16_j] = *sz_1;
128 p_ufdata->records[u16_i].status = USED_STATUS;
135 printf(
"1 Format data\n");
136 printf(
"2 Enter one record\n");
137 printf(
"3 Delete a record\n");
138 printf(
"4 Commit data\n");
139 printf(
"5 Read and print all records\n");
140 printf(
" Enter number (1-5): ");
146 char data[RECORD_SIZE];
155 printf(
"Enter string+\\n (14 chars max): ");
157 doInsert(&fdata, data);
160 printf(
"Enter record number+\\n (0 to 15, decimal): ");
162 sscanf(data,
"%d", (
int *) &u16_recnum);
163 doDelete(u16_recnum);