; -------------------------------------------------------------------------------- ; @Title: Example Script for programming of ST STM32F4xx internal flash ; ; @Description: ; ; Script arguments: ; ; DO stm32f4xx [PREPAREONLY] [CPU=] [DUALPORT=0|1] ; ; PREPAREONLY only declares flash but does not execute flash programming ; ; CPU= selects CPU derivative ; ; 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 ¶meters ENTRY %LINE ¶meters PRIVATE ¶m_prepareonly ¶m_cpu ¶m_dualport ¶m_prepareonly=(STRing.SCAN(STRing.UPpeR("¶meters"),"PREPAREONLY",0)!=-1) ¶m_cpu=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"CPU=","") ¶m_dualport=0 IF VERSION.BUILD.BASE()>=43441. ¶m_dualport=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"DUALPORT=","0") ; -------------------------------------------------------------------------------- ; CPU setup IF SYStem.MODE()<5 ( SYStem.RESet IF "¶m_cpu"!="" SYStem.CPU ¶m_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 "¶m_dualport" ; Flash script ends here if called with parameter PREPAREONLY IF ¶m_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 ¶m_dualport PARAMETERS ¶m_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 ¶m_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 )