diff --git a/ChangeLog b/ChangeLog index ba5b5237d..1d524b516 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,7 @@ Merge fs_kill and file_kill to ensure that files always die before the filesystem Add `E.unmountSD()` to allow SD cards to be removed once they have been used Stop String.split("") adding an empty elementy to the array + Tidy up linker script, allow F401 to use 3x16kB pages for storing program data 1v69 : Fix 1v67's regression of digitalPulse when doing lots of pulses Add configurable OneWire search command (for finding DS18B20s with alarm set) diff --git a/boards/STM32F401CDISCOVERY.py b/boards/STM32F401CDISCOVERY.py index 6142f587d..6111e7cad 100644 --- a/boards/STM32F401CDISCOVERY.py +++ b/boards/STM32F401CDISCOVERY.py @@ -15,11 +15,11 @@ import pinutils; info = { - 'name' : "STM32F401 Discovery", - 'link' : [ "http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1848/PF259098" ], - 'default_console' : "EV_SERIAL2", - 'variables' : 2650, - 'binary_name' : 'espruino_%v_stm32f401Cdiscovery.bin', + 'name' : "STM32F401C Discovery", + 'link' : [ "http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1848/PF259098" ], + 'default_console' : "EV_SERIAL2", + 'variables' : 3040, + 'binary_name' : 'espruino_%v_stm32f401cdiscovery.bin', }; chip = { 'part' : "STM32F401VCT6", @@ -33,6 +33,14 @@ chip = { 'i2c' : 3, 'adc' : 1, 'dac' : 0, + 'saved_code' : { + 'address' : 0x08004000, + 'page_size' : 16384, # size of pages + 'page_number' : 1, # number of page we start at (0 based) + 'pages' : 3, # number of pages we're using + 'flash_available' : 256 # binary will have a hole in it, so we just want to test against full size + }, + 'place_text_section' : 0x08010000, # note flash_available above }; # left-right, or top-bottom order board = { diff --git a/scripts/build_linker.py b/scripts/build_linker.py index c32c7fd65..53e284537 100644 --- a/scripts/build_linker.py +++ b/scripts/build_linker.py @@ -126,16 +126,19 @@ SECTIONS /* Then code, then constants */ .text : { +""") + +if "place_text_section" in board.chip: + codeOut(""" /* In the .py file we were told to place text here (to skip out what was before) */ + . = ALIGN("""+hex(board.chip["place_text_section"]-FLASH_BASE)+"""); /* hacky! really want it absolute */ +"""); + +codeOut(""" . = ALIGN(4); *(.text) *(.text*) *(.rodata) *(.rodata*) - *(.glue_7) - *(.glue_7t) - - KEEP (*(.init)) - KEEP (*(.fini)) . = ALIGN(4); _etext = .; @@ -169,10 +172,8 @@ SECTIONS . = ALIGN(4); _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; } >RAM - PROVIDE ( end = _ebss ); PROVIDE ( _end = _ebss ); /* Remove stuff we don't want */ diff --git a/scripts/build_platform_config.py b/scripts/build_platform_config.py index 8dbf43505..86e2ef7e5 100755 --- a/scripts/build_platform_config.py +++ b/scripts/build_platform_config.py @@ -76,21 +76,35 @@ if not LINUX: var_cache_size = var_size*variables flash_needed = var_cache_size + 4 # for magic number flash_page_size = 1024 # just a guess + flash_saved_code_sector = "" if board.chip["family"]=="STM32F1": flash_page_size = 1024 if "subfamily" in board.chip and board.chip["subfamily"]=="MD" else 2048 - if board.chip["family"]=="STM32F2": flash_page_size = 128*1024 + if board.chip["family"]=="STM32F2": + flash_page_size = 128*1024 + flash_saved_code_sector = 11 if board.chip["family"]=="STM32F3": flash_page_size = 2*1024 - if board.chip["family"]=="STM32F4": flash_page_size = 128*1024 + if board.chip["family"]=="STM32F4": + flash_page_size = 128*1024 + flash_saved_code_sector = 11 # F4 has different page sizes in different places - flash_pages = (flash_needed+flash_page_size-1)/flash_page_size + flash_saved_code_pages = (flash_needed+flash_page_size-1)/flash_page_size total_flash = board.chip["flash"]*1024 - flash_available_for_code = total_flash - (flash_pages*flash_page_size) - if has_bootloader: flash_available_for_code -= common.get_bootloader_size() + + if "saved_code" in board.chip: + flash_saved_code_start = board.chip["saved_code"]["address"] + flash_page_size = board.chip["saved_code"]["page_size"] + flash_saved_code_sector = board.chip["saved_code"]["page_number"] + flash_saved_code_pages = board.chip["saved_code"]["pages"] + flash_available_for_code = board.chip["saved_code"]["flash_available"]*1024 + else: + flash_saved_code_start = "(FLASH_START + FLASH_TOTAL - FLASH_SAVED_CODE_LENGTH)" + flash_available_for_code = total_flash - (flash_saved_code_pages*flash_page_size) + if has_bootloader: flash_available_for_code -= common.get_bootloader_size() print "Variables = "+str(variables) print "JsVar size = "+str(var_size) print "VarCache size = "+str(var_cache_size) print "Flash page size = "+str(flash_page_size) - print "Flash pages = "+str(flash_pages) + print "Flash pages = "+str(flash_saved_code_pages) print "Total flash = "+str(total_flash) print "Flash available for code = "+str(flash_available_for_code) @@ -222,12 +236,13 @@ else: codeOut("#define JSVAR_CACHE_SIZE "+str(variables)+" // Number of JavaScript variables in RAM") codeOut("#define FLASH_AVAILABLE_FOR_CODE "+str(flash_available_for_code)) codeOut("#define FLASH_PAGE_SIZE "+str(flash_page_size)) - codeOut("#define FLASH_SAVED_CODE_PAGES "+str(flash_pages)) + codeOut("#define FLASH_SAVED_CODE_PAGES "+str(flash_saved_code_pages)) codeOut("#define FLASH_START "+hex(0x08000000)) + if flash_saved_code_sector!="": codeOut("#define FLASH_SAVED_CODE_SECTOR "+str(flash_saved_code_sector)) if has_bootloader: codeOut("#define BOOTLOADER_SIZE "+str(common.get_bootloader_size())) codeOut("") codeOut("#define FLASH_SAVED_CODE_LENGTH (FLASH_PAGE_SIZE*FLASH_SAVED_CODE_PAGES)") - codeOut("#define FLASH_SAVED_CODE_START (FLASH_START + FLASH_TOTAL - FLASH_SAVED_CODE_LENGTH)") + codeOut("#define FLASH_SAVED_CODE_START "+str(flash_saved_code_start)) codeOut("#define FLASH_MAGIC_LOCATION (FLASH_SAVED_CODE_START + FLASH_SAVED_CODE_LENGTH - 4)") codeOut("#define FLASH_MAGIC 0xDEADBEEF") codeOut(""); diff --git a/targets/stm32/jshardware.c b/targets/stm32/jshardware.c index 734c8fa9d..33b7e7824 100644 --- a/targets/stm32/jshardware.c +++ b/targets/stm32/jshardware.c @@ -2249,7 +2249,10 @@ void jshSaveToFlash() { jsiConsolePrint("Erasing Flash..."); #if defined(STM32F2) || defined(STM32F4) - FLASH_EraseSector(FLASH_Sector_11, VoltageRange_3); + for (i=0;i