@@ -52,14 +52,14 @@ ap3_EEPROM::ap3_EEPROM()
52
52
// affecting other bytes in this flash word
53
53
void ap3_EEPROM::write (uint16_t eepromLocation, uint8_t dataToWrite)
54
54
{
55
- uint32_t flashLocation = FLASH_EEPROM_START + eepromLocation;
55
+ uint32_t flashLocation = AP3_FLASH_EEPROM_START + eepromLocation;
56
56
writeWordToFlash (flashLocation, (uint32_t )dataToWrite | 0xFFFFFF00 );
57
57
}
58
58
59
59
// Read a byte from a given location in "EEPROM"
60
60
uint8_t ap3_EEPROM::read (uint16_t eepromLocation)
61
61
{
62
- uint32_t flashLocation = FLASH_EEPROM_START + eepromLocation;
62
+ uint32_t flashLocation = AP3_FLASH_EEPROM_START + eepromLocation;
63
63
return (*(uint8_t *)flashLocation);
64
64
}
65
65
@@ -70,39 +70,39 @@ uint8_t ap3_EEPROM::read(uint16_t eepromLocation)
70
70
71
71
void ap3_EEPROM::get (uint16_t eepromLocation, uint8_t &dataToGet)
72
72
{
73
- dataToGet = *(uint8_t *)(FLASH_EEPROM_START + eepromLocation);
73
+ dataToGet = *(uint8_t *)(AP3_FLASH_EEPROM_START + eepromLocation);
74
74
}
75
75
void ap3_EEPROM::get (uint16_t eepromLocation, uint16_t &dataToGet)
76
76
{
77
- dataToGet = *(uint16_t *)(FLASH_EEPROM_START + eepromLocation);
77
+ dataToGet = *(uint16_t *)(AP3_FLASH_EEPROM_START + eepromLocation);
78
78
}
79
79
void ap3_EEPROM::get (uint16_t eepromLocation, int16_t &dataToGet)
80
80
{
81
- dataToGet = *(int16_t *)(FLASH_EEPROM_START + eepromLocation);
81
+ dataToGet = *(int16_t *)(AP3_FLASH_EEPROM_START + eepromLocation);
82
82
}
83
83
void ap3_EEPROM::get (uint16_t eepromLocation, int &dataToGet)
84
84
{
85
- dataToGet = *(int *)(FLASH_EEPROM_START + eepromLocation);
85
+ dataToGet = *(int *)(AP3_FLASH_EEPROM_START + eepromLocation);
86
86
}
87
87
void ap3_EEPROM::get (uint16_t eepromLocation, unsigned int &dataToGet)
88
88
{
89
- dataToGet = *(unsigned int *)(FLASH_EEPROM_START + eepromLocation);
89
+ dataToGet = *(unsigned int *)(AP3_FLASH_EEPROM_START + eepromLocation);
90
90
}
91
91
void ap3_EEPROM::get (uint16_t eepromLocation, int32_t &dataToGet)
92
92
{
93
- dataToGet = *(int32_t *)(FLASH_EEPROM_START + eepromLocation);
93
+ dataToGet = *(int32_t *)(AP3_FLASH_EEPROM_START + eepromLocation);
94
94
}
95
95
void ap3_EEPROM::get (uint16_t eepromLocation, uint32_t &dataToGet)
96
96
{
97
- dataToGet = *(uint32_t *)(FLASH_EEPROM_START + eepromLocation);
97
+ dataToGet = *(uint32_t *)(AP3_FLASH_EEPROM_START + eepromLocation);
98
98
}
99
99
void ap3_EEPROM::get (uint16_t eepromLocation, float &dataToGet)
100
100
{
101
101
union {
102
102
float f;
103
103
uint32_t b;
104
104
} temp;
105
- temp.b = *(uint32_t *)(FLASH_EEPROM_START + eepromLocation);
105
+ temp.b = *(uint32_t *)(AP3_FLASH_EEPROM_START + eepromLocation);
106
106
107
107
dataToGet = temp.f ;
108
108
}
@@ -113,8 +113,8 @@ void ap3_EEPROM::get(uint16_t eepromLocation, double &dataToGet)
113
113
double lf;
114
114
uint32_t b[2 ];
115
115
} temp;
116
- temp.b [1 ] = *(uint32_t *)(FLASH_EEPROM_START + eepromLocation); // LSB;
117
- temp.b [0 ] = *(uint32_t *)(FLASH_EEPROM_START + eepromLocation + 4 ) << 32 ; // MSB;
116
+ temp.b [1 ] = *(uint32_t *)(AP3_FLASH_EEPROM_START + eepromLocation); // LSB;
117
+ temp.b [0 ] = *(uint32_t *)(AP3_FLASH_EEPROM_START + eepromLocation + 4 ) << 32 ; // MSB;
118
118
dataToGet = temp.lf ;
119
119
}
120
120
@@ -125,31 +125,31 @@ void ap3_EEPROM::get(uint16_t eepromLocation, double &dataToGet)
125
125
126
126
void ap3_EEPROM::put (uint16_t eepromLocation, uint8_t dataToWrite)
127
127
{
128
- writeWordToFlash ((FLASH_EEPROM_START + eepromLocation), (uint32_t )dataToWrite | 0xFFFFFF00 );
128
+ writeWordToFlash ((AP3_FLASH_EEPROM_START + eepromLocation), (uint32_t )dataToWrite | 0xFFFFFF00 );
129
129
}
130
130
void ap3_EEPROM::put (uint16_t eepromLocation, uint16_t dataToWrite)
131
131
{
132
- writeWordToFlash ((FLASH_EEPROM_START + eepromLocation), (uint32_t )dataToWrite | 0xFFFF0000 );
132
+ writeWordToFlash ((AP3_FLASH_EEPROM_START + eepromLocation), (uint32_t )dataToWrite | 0xFFFF0000 );
133
133
}
134
134
void ap3_EEPROM::put (uint16_t eepromLocation, int16_t dataToWrite)
135
135
{
136
- writeWordToFlash ((FLASH_EEPROM_START + eepromLocation), (uint32_t )dataToWrite | 0xFFFF0000 );
136
+ writeWordToFlash ((AP3_FLASH_EEPROM_START + eepromLocation), (uint32_t )dataToWrite | 0xFFFF0000 );
137
137
}
138
138
void ap3_EEPROM::put (uint16_t eepromLocation, int dataToWrite) // ints are 32 bit on M4F
139
139
{
140
- writeWordToFlash ((FLASH_EEPROM_START + eepromLocation), (uint32_t )dataToWrite);
140
+ writeWordToFlash ((AP3_FLASH_EEPROM_START + eepromLocation), (uint32_t )dataToWrite);
141
141
}
142
142
void ap3_EEPROM::put (uint16_t eepromLocation, unsigned int dataToWrite) // ints are 32 bit on M4F
143
143
{
144
- writeWordToFlash ((FLASH_EEPROM_START + eepromLocation), (uint32_t )dataToWrite);
144
+ writeWordToFlash ((AP3_FLASH_EEPROM_START + eepromLocation), (uint32_t )dataToWrite);
145
145
}
146
146
void ap3_EEPROM::put (uint16_t eepromLocation, int32_t dataToWrite)
147
147
{
148
- writeWordToFlash ((FLASH_EEPROM_START + eepromLocation), (int32_t )dataToWrite);
148
+ writeWordToFlash ((AP3_FLASH_EEPROM_START + eepromLocation), (int32_t )dataToWrite);
149
149
}
150
150
void ap3_EEPROM::put (uint16_t eepromLocation, uint32_t dataToWrite)
151
151
{
152
- writeWordToFlash ((FLASH_EEPROM_START + eepromLocation), (uint32_t )dataToWrite);
152
+ writeWordToFlash ((AP3_FLASH_EEPROM_START + eepromLocation), (uint32_t )dataToWrite);
153
153
}
154
154
void ap3_EEPROM::put (uint16_t eepromLocation, float dataToWrite)
155
155
{
@@ -159,7 +159,7 @@ void ap3_EEPROM::put(uint16_t eepromLocation, float dataToWrite)
159
159
} temp;
160
160
temp.f = dataToWrite;
161
161
162
- writeWordToFlash ((FLASH_EEPROM_START + eepromLocation), (uint32_t )temp.b );
162
+ writeWordToFlash ((AP3_FLASH_EEPROM_START + eepromLocation), (uint32_t )temp.b );
163
163
}
164
164
165
165
void ap3_EEPROM::put (uint16_t eepromLocation, double dataToWrite) // 64 bits
@@ -170,8 +170,8 @@ void ap3_EEPROM::put(uint16_t eepromLocation, double dataToWrite) //64 bits
170
170
} temp;
171
171
temp.lf = dataToWrite;
172
172
173
- writeWordToFlash ((FLASH_EEPROM_START + eepromLocation), (uint32_t )temp.b [1 ]); // LSB
174
- writeWordToFlash ((FLASH_EEPROM_START + eepromLocation + 4 ), (uint32_t )temp.b [0 ]); // MSB
173
+ writeWordToFlash ((AP3_FLASH_EEPROM_START + eepromLocation), (uint32_t )temp.b [1 ]); // LSB
174
+ writeWordToFlash ((AP3_FLASH_EEPROM_START + eepromLocation + 4 ), (uint32_t )temp.b [0 ]); // MSB
175
175
}
176
176
177
177
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
@@ -217,12 +217,17 @@ void ap3_EEPROM::update(uint16_t eepromLocation, double dataToWrite) //64 bits
217
217
218
218
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
219
219
220
+ uint16_t ap3_EEPROM::length ()
221
+ {
222
+ return (AP3_FLASH_EEPROM_SIZE);
223
+ }
224
+
220
225
// Erase 8k page encapsulating the EEPROM section
221
226
void ap3_EEPROM::erase ()
222
227
{
223
228
am_hal_flash_page_erase (AM_HAL_FLASH_PROGRAM_KEY,
224
- AM_HAL_FLASH_ADDR2INST (FLASH_EEPROM_START ),
225
- AM_HAL_FLASH_ADDR2PAGE (FLASH_EEPROM_START ));
229
+ AM_HAL_FLASH_ADDR2INST (AP3_FLASH_EEPROM_START ),
230
+ AM_HAL_FLASH_ADDR2PAGE (AP3_FLASH_EEPROM_START ));
226
231
}
227
232
228
233
// This is the main helper function
@@ -238,11 +243,11 @@ void ap3_EEPROM::erase()
238
243
void ap3_EEPROM::writeWordToFlash (uint32_t flashLocation, uint32_t dataToWrite)
239
244
{
240
245
// Error check
241
- if (flashLocation >= FLASH_EEPROM_START + FLASH_EEPROM_SIZE )
246
+ if (flashLocation >= AP3_FLASH_EEPROM_START + AP3_FLASH_EEPROM_SIZE )
242
247
{
243
248
return ;
244
249
}
245
- if (flashLocation < FLASH_EEPROM_START )
250
+ if (flashLocation < AP3_FLASH_EEPROM_START )
246
251
{
247
252
return ;
248
253
}
@@ -254,11 +259,11 @@ void ap3_EEPROM::writeWordToFlash(uint32_t flashLocation, uint32_t dataToWrite)
254
259
}
255
260
256
261
// First we have to read the contents of current "EEPROM" to SRAM
257
- uint32_t tempContents[FLASH_EEPROM_SIZE / 4 ];
262
+ uint32_t tempContents[AP3_FLASH_EEPROM_SIZE / 4 ];
258
263
uint16_t spot = 0 ;
259
- for (uint16_t x = 0 ; x < FLASH_EEPROM_SIZE ; x += 4 )
264
+ for (uint16_t x = 0 ; x < AP3_FLASH_EEPROM_SIZE ; x += 4 )
260
265
{
261
- tempContents[spot++] = *(uint32_t *)(FLASH_EEPROM_START + x);
266
+ tempContents[spot++] = *(uint32_t *)(AP3_FLASH_EEPROM_START + x);
262
267
}
263
268
264
269
// Then we erase an 8K page
@@ -268,52 +273,37 @@ void ap3_EEPROM::writeWordToFlash(uint32_t flashLocation, uint32_t dataToWrite)
268
273
269
274
// Zero out this word(s)
270
275
uint8_t byteOffset = (flashLocation % 4 );
271
- uint16_t wordLocation = (flashLocation - FLASH_EEPROM_START) / 4 ;
272
- if (byteOffset == 0 )
273
- {
274
- // Easy - reset this word to 1s
275
- tempContents[wordLocation] = 0xFFFFFFFF ;
276
- }
277
- else
278
- {
279
- // Reset the upper bytes of the first word to 1s
280
- tempContents[wordLocation] |= 0xFFFFFFFF << (byteOffset * 8 );
281
-
282
- // Reset the lower bytes of the second word to 1s
283
- tempContents[wordLocation + 1 ] |= 0xFFFFFFFF >> ((4 - byteOffset) * 8 );
284
- }
285
-
286
- // Then we write the contents of the array back
287
- am_hal_flash_program_main (AM_HAL_FLASH_PROGRAM_KEY,
288
- tempContents,
289
- (uint32_t *)FLASH_EEPROM_START,
290
- FLASH_EEPROM_SIZE);
276
+ uint16_t wordLocation = (flashLocation - AP3_FLASH_EEPROM_START) / 4 ;
291
277
278
+ // Mask in the new data into the array
292
279
if (byteOffset == 0 )
293
280
{
294
281
// Easy - update this word with new word
295
- am_hal_flash_reprogram_ui32 (AM_HAL_FLASH_PROGRAM_KEY,
296
- dataToWrite,
297
- (uint32_t *)flashLocation);
282
+ tempContents[wordLocation] = dataToWrite;
298
283
}
299
284
else
300
285
{
301
- // Update the upper bytes of this word with new data
286
+ // Clear the upper bytes of the first word to 0s
287
+ tempContents[wordLocation] &= ~(0xFFFFFFFF << (byteOffset * 8 ));
288
+
289
+ // Clear the lower bytes of the second word to 0s
290
+ tempContents[wordLocation + 1 ] &= ~(0xFFFFFFFF >> ((4 - byteOffset) * 8 ));
291
+
292
+ // OR in upper bytes of this word with new data
302
293
uint32_t dataToWriteFirstWord = dataToWrite << (byteOffset * 8 );
303
- dataToWriteFirstWord |= 0xFFFFFFFF >> ((4 - byteOffset) * 8 );
304
294
305
- // Update the lower bytes of the following word with new data
295
+ // OR in the lower bytes of the following word with new data
306
296
uint32_t dataToWriteSecondWord = dataToWrite >> ((4 - byteOffset) * 8 );
307
- dataToWriteSecondWord |= 0xFFFFFFFF << (byteOffset * 8 );
308
297
309
- am_hal_flash_reprogram_ui32 (AM_HAL_FLASH_PROGRAM_KEY,
310
- dataToWriteFirstWord,
311
- (uint32_t *)(flashLocation - byteOffset));
312
-
313
- am_hal_flash_reprogram_ui32 (AM_HAL_FLASH_PROGRAM_KEY,
314
- dataToWriteSecondWord,
315
- (uint32_t *)(flashLocation + (4 - byteOffset)));
298
+ tempContents[wordLocation] |= dataToWriteFirstWord;
299
+ tempContents[wordLocation + 1 ] |= dataToWriteSecondWord;
316
300
}
301
+
302
+ // Then we write the contents of the array back
303
+ am_hal_flash_program_main (AM_HAL_FLASH_PROGRAM_KEY,
304
+ tempContents,
305
+ (uint32_t *)AP3_FLASH_EEPROM_START,
306
+ AP3_FLASH_EEPROM_SIZE);
317
307
}
318
308
319
309
ap3_EEPROM EEPROM;
0 commit comments