Files
2025-10-14 09:52:32 +09:00

405 lines
11 KiB
Plaintext

; --------------------------------------------------------------------------------
; @Title: Example Script for programming of ST STM32F4xx internal flash
;
; @Description:
;
; Script arguments:
;
; DO stm32f4xx [PREPAREONLY] [CPU=<cpu>] [DUALPORT=0|1]
;
; PREPAREONLY only declares flash but does not execute flash programming
;
; CPU=<cpu> selects CPU derivative <cpu>
;
; DUALPORT default value is 0 (disabled). If DualPort mode is enabled
; flash algorithm stays running until flash programming is
; finished. Data is tranferred via dual port memory access.
;
; Example:
;
; DO ~~/demo/arm/flash/stm32f4xx CPU=STM32F407ZG DUALPORT=1 PREPAREONLY
;
; List of STM32F4xx derivatives and their configuration:
;
; CPU-Type Flash size
; [kByte]
; -------------------------
; STM32F401CB 128.
; STM32F401CC 256.
; STM32F401CD 384
; STM32F401CE 512.
; STM32F401RB 128.
; STM32F401RC 256.
; STM32F401RD 128.
; STM32F401RE 512.
; STM32F401VB 128.
; STM32F401VC 256.
; STM32F401VD 384
; STM32F401VE 512.
; -------------------------
; STM32F405OE 512.
; STM32F405OG 1024.
; STM32F405RG 1024.
; STM32F405VG 1024.
; STM32F405ZG 1024.
; -------------------------
; STM32F407IE 512.
; STM32F407IG 1024.
; STM32F407VE 512.
; STM32F407VG 1024.
; STM32F407ZE 512.
; STM32F407ZG 1024.
; -------------------------
; STM32F410C8 64.
; STM32F410CB 128.
; STM32F410R8 64.
; STM32F410RB 128.
; STM32F410T8 64.
; STM32F410TB 128.
; -------------------------
; STM32F411CC 256.
; STM32F411CE 512.
; STM32F411RC 256.
; STM32F411RE 512.
; STM32F411VC 256.
; STM32F411VE 512.
; -------------------------
; STM32F412CE 512.
; STM32F412CG 1204.
; STM32F412RE 512.
; STM32F412RG 1204.
; STM32F412VE 512.
; STM32F412VG 1204.
; STM32F412ZE 512.
; STM32F412ZG 1204.
; -------------------------
; STM32F413CG 1024.
; STM32F413CH 1536.
; STM32F413MG 1024.
; STM32F413MH 1536.
; STM32F413RG 1024.
; STM32F413RH 1536.
; STM32F413VG 1024.
; STM32F413VH 1536.
; STM32F413ZG 1024.
; STM32F413ZH 1536.
; -------------------------
; STM32F415OG 1024.
; STM32F415RG 1024.
; STM32F415VG 1024.
; STM32F415ZG 1024.
; -------------------------
; STM32F417IE 512.
; STM32F417IG 1024.
; STM32F417VE 512.
; STM32F417VG 1024.
; STM32F417ZE 512.
; STM32F417ZG 1024.
; -------------------------
; STM32F423CH 1536.
; STM32F423MH 1536.
; STM32F423RH 1536.
; STM32F423VH 1536.
; STM32F423ZH 1536.
; -------------------------
; STM32F427AG 1024.
; STM32F427AI 2048.
; STM32F427IG 1024.
; STM32F427II 2048.
; STM32F427VG 1024.
; STM32F427VI 2048.
; STM32F427ZG 1024.
; STM32F427ZI 2048.
; -------------------------
; STM32F429AG 1024.
; STM32F429AI 2048.
; STM32F429BE 512.
; STM32F429BG 1024.
; STM32F429BI 2048.
; STM32F429IE 512.
; STM32F429IG 1024.
; STM32F429II 2048.
; STM32F429NE 512.
; STM32F429NG 1024.
; STM32F429NI 2048.
; STM32F429VE 512.
; STM32F429VG 1024.
; STM32F429VI 2048.
; STM32F429ZE 512.
; STM32F429ZG 1024.
; STM32F429ZI 2048.
; -------------------------
; STM32F437AI 2048.
; STM32F437IG 1024.
; STM32F437II 2048.
; STM32F437VG 1024.
; STM32F437VI 2048.
; STM32F437ZG 1024.
; STM32F437ZI 2048.
; -------------------------
; STM32F439AI 2048
; STM32F439BG 1024.
; STM32F439BI 2048.
; STM32F439IG 1024.
; STM32F439II 2048.
; STM32F439NG 1024.
; STM32F439NI 2048.
; STM32F439VG 1024.
; STM32F439VI 2048.
; STM32F439ZG 1024.
; STM32F439ZI 2048.
; -------------------------
; STM32F446MC 256.
; STM32F446ME 512.
; STM32F446RC 256.
; STM32F446RE 512.
; STM32F446VC 256.
; STM32F446VE 512.
; STM32F446ZC 256.
; STM32F446ZE 512.
; -------------------------
; STM32F469AE 512.
; STM32F469AG 1024.
; STM32F469AI 2048.
; STM32F469BE 512.
; STM32F469BG 1024.
; STM32F469BI 2048.
; STM32F469IE 512.
; STM32F469IG 1024.
; STM32F469II 2048.
; STM32F469NE 512.
; STM32F469NG 1024.
; STM32F469NI 2048.
; STM32F469VE 512.
; STM32F469VG 1024.
; STM32F469VI 2048.
; STM32F469ZE 512.
; STM32F469ZG 1024.
; STM32F469ZI 2048.
; -------------------------
; STM32F479AG 1024.
; STM32F479AI 2048.
; STM32F479BG 1024.
; STM32F479BI 2048.
; STM32F479IG 1024.
; STM32F479II 2048.
; STM32F479NG 1024.
; STM32F479NI 2048.
; STM32F479VG 1024.
; STM32F479VI 2048.
; STM32F479ZG 1024.
; STM32F479ZI 2048.
;
; Flash base address is 0x08000000
; SRAM base address is 0x20000000
;
; @Author: WRD
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
; @Chip: STM32F4*
; --------------------------------------------------------------------------------
; $Rev: 12977 $
; $Id: stm32f4xx.cmm 12977 2024-01-24 14:11:37Z amerkle $
PRIVATE &parameters
ENTRY %LINE &parameters
PRIVATE &param_prepareonly &param_cpu &param_dualport
&param_prepareonly=(STRing.SCAN(STRing.UPpeR("&parameters"),"PREPAREONLY",0)!=-1)
&param_cpu=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"CPU=","")
&param_dualport=0
IF VERSION.BUILD.BASE()>=43441.
&param_dualport=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"DUALPORT=","0")
; --------------------------------------------------------------------------------
; CPU setup
IF SYStem.MODE()<5
(
SYStem.RESet
IF "&param_cpu"!=""
SYStem.CPU &param_cpu
IF !CPUIS(STM32F4*)
(
IF VERSION.BUILD()>=37389.
SYStem.CPU STM32F4*
ELSE
SYStem.CPU STM32F405ZG
)
IF CABLE.TWOWIRE()
SYStem.CONFIG.DEBUGPORTTYPE SWD
SYStem.Up
)
; --------------------------------------------------------------------------------
; Flash declaration
FLASH.RESet
GOSUB FlashDeclaration "&param_dualport"
; Flash script ends here if called with parameter PREPAREONLY
IF &param_prepareonly
ENDDO PREPAREDONE
; --------------------------------------------------------------------------------
; Flash programming example
DIALOG.YESNO "Program flash memory?"
PRIVATE &progflash
ENTRY &progflash
IF &progflash
(
FLASH.ReProgram.ALL /Erase
Data.LOAD.auto *
FLASH.ReProgram.off
; Reset device
SYStem.Down
SYStem.Up
)
ENDDO
; --------------------------------------------------------------------------------
; Flash declaration depending on selected CPU
FlashDeclaration:
(
PRIVATE &param_dualport
PARAMETERS &param_dualport
PRIVATE &Bank0Size &Bank1Size &FlashDriver &DB1M
&Bank1Size=0
IF CPUIS("STM32F4???8")
(
&Bank0Size=0x10000
&FlashDriver="stm32f400.bin"
)
ELSE IF CPUIS("STM32F4???B")
(
&Bank0Size=0x20000
&FlashDriver="stm32f400.bin"
)
ELSE IF CPUIS("STM32F4???C")
(
&Bank0Size=0x40000
&FlashDriver="stm32f400.bin"
)
ELSE IF CPUIS("STM32F4???D")
(
&Bank0Size=0x60000
&FlashDriver="stm32f400.bin"
)
ELSE IF CPUIS("STM32F4???E")
(
&Bank0Size=0x80000
&FlashDriver="stm32f400.bin"
)
ELSE IF CPUIS("STM32F40??G")||CPUIS("STM32F41??G")
(
&Bank0Size=0x100000
&FlashDriver="stm32f400.bin"
)
ELSE IF CPUIS("STM32F42??G")||CPUIS("STM32F43??G")||CPUIS("STM32F46??G")||CPUIS("STM32F47??G")
(
&DB1M=(Data.Word(SD:0x1FFFC008)&0x4000)==0x4000
IF &DB1M==TRUE()
(
&Bank0Size=0x80000
&Bank1Size=0x80000
)
ELSE
(
&Bank0Size=0x100000
)
&FlashDriver="stm32f420.bin"
)
ELSE IF CPUIS("STM32F4???H")
(
&Bank0Size=0x180000
&FlashDriver="stm32f400.bin"
)
ELSE IF CPUIS("STM32F4???I")
(
&Bank0Size=0x100000
&Bank1Size=0x100000
&FlashDriver="stm32f420.bin"
)
ELSE
(
PRINT %ERROR "FLASH size of CPU type is unknown"
ENDDO
)
IF &Bank0Size>=0x20000
(
FLASH.Create 1. 0x08000000--0x08003FFF TARGET Byte 0.
FLASH.Create 1. 0x08004000--0x08007FFF TARGET Byte 1.
FLASH.Create 1. 0x08008000--0x0800BFFF TARGET Byte 2.
FLASH.Create 1. 0x0800C000--0x0800FFFF TARGET Byte 3.
FLASH.Create 1. 0x08010000--0x0801FFFF TARGET Byte 4.
)
IF &Bank0Size>=0x40000
(
FLASH.Create 1. 0x08020000--0x0803FFFF TARGET Byte 5.
)
IF &Bank0Size>=0x80000
(
FLASH.Create 1. 0x08040000--0x0805FFFF TARGET Byte 6.
FLASH.Create 1. 0x08060000--0x0807FFFF TARGET Byte 7.
)
IF &Bank0Size>=0x100000
(
FLASH.Create 1. 0x08080000--0x0809FFFF TARGET Byte 8.
FLASH.Create 1. 0x080A0000--0x080BFFFF TARGET Byte 9.
FLASH.Create 1. 0x080C0000--0x080DFFFF TARGET Byte 10.
FLASH.Create 1. 0x080E0000--0x080FFFFF TARGET Byte 11.
)
IF &Bank0Size>=0x180000
(
; 1.5MB devices are single flash bank devices. So they cannot overlap with a bank1 declaration.
FLASH.Create 1. 0x08100000--0x0811FFFF TARGET Byte 12.
FLASH.Create 1. 0x08120000--0x0813FFFF TARGET Byte 13.
FLASH.Create 1. 0x08140000--0x0815FFFF TARGET Byte 14.
FLASH.Create 1. 0x08160000--0x0817FFFF TARGET Byte 15.
)
IF &Bank1Size>=0x80000
(
IF (&Bank0Size==0x80000)&&(&Bank1Size==0x80000)
(
FLASH.Create 1. 0x08080000--0x0808FFFF 0x4000 TARGET Byte 12. /AutoInc ; sector 12..15
FLASH.Create 1. 0x08090000--0x0809FFFF 0x10000 TARGET Byte 16.
FLASH.Create 1. 0x080A0000--0x080FFFFF 0x20000 TARGET Byte 17. /AutoInc ; sector 17..19
)
ELSE
(
FLASH.Create 1. 0x08100000--0x0810FFFF 0x4000 TARGET Byte 12. /AutoInc ; sector 12..15
FLASH.Create 1. 0x08110000--0x0811FFFF 0x10000 TARGET Byte 16.
FLASH.Create 1. 0x08120000--0x0817FFFF 0x20000 TARGET Byte 17. /AutoInc ; sector 17..19
)
)
IF &Bank1Size>=0x100000
(
FLASH.Create 1. 0x08180000--0x081FFFFF 0x20000 TARGET Byte 20. /AutoInc ; sector 20..23
)
; For Main Flash memory boot mode flash memory is aliased to address 0x0
; Because SYSCFG_MEMRMP:MEM_MODE[1:0] is not indicating active memory remap
; we are comparing flash reset vector against reset vector at alias address
SILENT.Data.ComPare 0x0--0x7 0x08000000
IF !FOUND()
FLASH.CreateALIAS 0x00000000--0x001FFFFF 0x08000000
IF &param_dualport==0
FLASH.TARGET 0x20000000 0x20001000 0x4000 ~~/demo/arm/flash/byte/&FlashDriver
ELSE
FLASH.TARGET 0x20000000 EAHB:0x20001000 0x4000 ~~/demo/arm/flash/byte/&FlashDriver /DualPort
RETURN
)