12
12
STM32_READ = b'\x11 '
13
13
STM32_GO = b'\x21 '
14
14
STM32_WRITE = b'\x31 '
15
- STM32_ERASE = b'\x43 '
15
+ STM32_ERASE = b'\x44 ' # 0x44 is Extended Erase for bootloader v3.0 and higher. 0x43 is standard (1-byte address) erase
16
16
17
17
STM32_ADDRESS = bytes .fromhex ('08000000' ) # [b'\x08',b'\x00',b'\x00',b'\x00']
18
18
@@ -150,6 +150,15 @@ def _STM32_writeMode() -> bytes:
150
150
return _STM32_waitForAnswer ()
151
151
152
152
153
+ def _STM32_eraseMode () -> bytes :
154
+ """
155
+ Enters erase memory mode. Blocking
156
+ :return: returns ACK or NACK
157
+ """
158
+ STM32_sendCommand (STM32_ERASE )
159
+ return _STM32_waitForAnswer ()
160
+
161
+
153
162
def _STM32_sendAddress (address : bytes ) -> bytes :
154
163
"""
155
164
Sends the start address of read/write operations. Blocking
@@ -214,7 +223,7 @@ def _STM32_flashPage(data: bytearray) -> bytes:
214
223
checksum = 0xff # starting checksum = page length
215
224
216
225
for d in data :
217
- uart .write (d )
226
+ uart .write (bytes ([ d ]) )
218
227
checksum = checksum ^ d
219
228
220
229
uart .write (bytes ([checksum ]))
@@ -238,3 +247,74 @@ def STM32_readMEM(pages: int):
238
247
print (page .hex ())
239
248
240
249
_incrementAddress (readAddress )
250
+
251
+
252
+ def STM32_writeMEM (file_path : str ):
253
+
254
+ with open (file_path , 'rb' ) as f :
255
+
256
+ while True :
257
+ data = bytearray (f .read (256 ))
258
+ read_bytes = len (data )
259
+ if read_bytes == 0 :
260
+ break
261
+ data .extend (bytearray ([255 ]* (256 - read_bytes ))) # 0xFF padding
262
+
263
+ _STM32_writeMode ()
264
+ _STM32_sendAddress (writeAddress )
265
+
266
+ _STM32_flashPage (data )
267
+ print ("\n Wrote\n " )
268
+ print (data .hex ())
269
+ print ("\n in\n " )
270
+ print (writeAddress .hex ())
271
+ _incrementAddress (writeAddress )
272
+ sleep_ms (100 )
273
+
274
+
275
+ def _STM32_standardEraseMEM (pages : int , page_list : list = None ):
276
+ """
277
+ Standard Erase (0x43) flash mem pages according to AN3155
278
+ :param pages: number of pages to be erased
279
+ :param page_list: page codes to be erased
280
+ :return:
281
+ """
282
+ pass
283
+
284
+
285
+ def _STM32_extendedEraseMEM (pages : int , page_list : list = None ):
286
+ """
287
+ Extended Erase (0x44) flash mem pages according to AN3155
288
+ :param pages: number of pages to be erased
289
+ :param page_list: page codes to be erased
290
+ :return:
291
+ """
292
+
293
+ if _STM32_eraseMode () == STM32_NACK :
294
+ print ("COULD NOT ENTER ERASE MODE" )
295
+ return
296
+
297
+ if pages == 0xFFFF :
298
+ # Mass erase
299
+ uart .write (b'\xFF ' )
300
+ uart .write (b'\xFF ' )
301
+ uart .write (b'\x00 ' )
302
+ else :
303
+ print ("Not yet implemented erase" )
304
+
305
+ if _STM32_waitForAnswer () != STM32_ACK :
306
+ print ("ERASE OPERATION ABORTED" )
307
+
308
+
309
+ def STM32_eraseMEM (pages : int , page_list : list = None ):
310
+ """
311
+ Erases flash mem pages according to AN3155
312
+ :param pages: number of pages to be erased
313
+ :param page_list: page codes to be erased
314
+ :return:
315
+ """
316
+
317
+ if STM32_ERASE == b'\x43 ' :
318
+ _STM32_standardEraseMEM (pages , page_list )
319
+ elif STM32_ERASE == b'\x44 ' :
320
+ _STM32_extendedEraseMEM (pages , page_list )
0 commit comments