Skip to content

Commit 676975b

Browse files
committed
feat: eraseMode, writeMEM, eraseMEM
fix: flash page error on byte write mod: STM32_ERASE extended erase mod: firmware_updater.py erase mem first
1 parent d3b9836 commit 676975b

File tree

2 files changed

+93
-31
lines changed

2 files changed

+93
-31
lines changed

firmware_updater.py

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,17 @@
1+
from sys import exit
12
from stm32_flash import *
23

3-
print('\nSTM32 FIRMWARE UPDATER')
4+
ans = STM32_startCommunication()
5+
if ans == STM32_NACK:
6+
print("Cannot etablish connection with STM32")
7+
exit(-1)
48

5-
STM32_startCommunication()
69
print('\nSTM32 FOUND')
710

8-
print('\nSTM32 GETTING ID')
9-
print(STM32_getID().hex())
11+
print('\nERASING MEM')
12+
STM32_eraseMEM(0xFFFF)
1013

11-
STM32_writeMode()
12-
print('\nSTM32 WRITE MODE')
13-
14-
"""
15-
file = open('Blink_fast.bin','rb')
16-
firmware = file.read()
17-
firmware_size_256 = len(firmware)/256
18-
firmware_size_256_last = len(firmware)%256
19-
print(firmware_size_256)
20-
print(firmware_size_256_last)
21-
"""
22-
23-
with open('Blink_fast.bin', 'rb') as file_t:
24-
blob_data = bytearray(file_t.read())
25-
print(blob_data)
26-
27-
"""
28-
29-
x=int.from_bytes(STM32_ADDRESS,'big')
30-
x=x+127
31-
new_address=x.to_bytes(4,'big')
32-
STM32_address(new_address)
33-
34-
STM32_waitOK()
35-
"""
14+
print("\nWRITING MEM")
15+
STM32_writeMEM("Blink_fast.bin")
16+
print("\nDONE")
17+
print("\nLower Boot0 and reset STM32")

stm32_flash.py

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
STM32_READ = b'\x11'
1313
STM32_GO = b'\x21'
1414
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
1616

1717
STM32_ADDRESS = bytes.fromhex('08000000') # [b'\x08',b'\x00',b'\x00',b'\x00']
1818

@@ -150,6 +150,15 @@ def _STM32_writeMode() -> bytes:
150150
return _STM32_waitForAnswer()
151151

152152

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+
153162
def _STM32_sendAddress(address: bytes) -> bytes:
154163
"""
155164
Sends the start address of read/write operations. Blocking
@@ -214,7 +223,7 @@ def _STM32_flashPage(data: bytearray) -> bytes:
214223
checksum = 0xff # starting checksum = page length
215224

216225
for d in data:
217-
uart.write(d)
226+
uart.write(bytes([d]))
218227
checksum = checksum ^ d
219228

220229
uart.write(bytes([checksum]))
@@ -238,3 +247,74 @@ def STM32_readMEM(pages: int):
238247
print(page.hex())
239248

240249
_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("\nWrote\n")
268+
print(data.hex())
269+
print("\nin\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

Comments
 (0)