; -------------------------------------------------------------------------------- ; @Title: Flash declaration for STM32G0 internal flash ; @Description: ; Script arguments: ; DO stm32g0xx [PREPAREONLY] [CPU=] ; PREPAREONLY only declares flash but does not execute flash programming ; CPU= selects CPU derivative ; FINISH checks and update the boot configuration after flash ; programming ; Example: ; DO ~~/demo/arm/flash/stm32g0xx PREPAREONLY ; ; List of STM32G0 derivatives and their configuration: ; CPU-Type Flash RamSize* ; [KByte] [KByte] ; -------------------------------------------------------------------------------- ; STM32G030x6 32 8 (x=J,F,K,C) ; STM32G050x6 32 18 (x=F,K,C) ; STM32G030x8 64 8 (x=K,C) ; STM32G050x8 64 18 (x=K,C) ; STM32G070xB 128 36 (x=K,C,R) ; STM32G0B0xE 512** 144 (x=K,C,R,V) ; ; STM32G031x4 16 8 (x=J,F,G,K,C) ; STM32G031x6 32 8 (x=J,F,G,K,C) ; STM32G041x6 ; STM32G051x6 32 18 (x=F,G,K,C) ; STM32G061x6 ; STM32G031x8 64 8 (x=Y,F,G,K,C) ; STM32G041x8 ; STM32G051x8 64 18 (x=F,G,K,C) ; STM32G061x8 ; STM32G071x8 64 36 (x=G,K,C,R) ; STM32G071xB 128 36 (x=E,G,K,C,R) ; STM32G081xB ; STM32G0B1xB 128 144 (x=K,C,R,M,V) ; STM32G0B1xC 256** 144 (x=K,C,R,M,V) ; STM32G0C1xC ; STM32G0B1xE 512** 144 (x=K,C,R,M,V) ; STM32G0C1xE ; ; * - size with parity disabled; uses 1 KB per 8 KB to enable ; ** - dual bank ; ; -------------------------------------------------------------------------------- ; Flash base address is 0x08000000 ; RAM base address is 0x20000000 ; ; @Chip: STM32G0* ; @Author: PHI ; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only ; -------------------------------------------------------------------------------- ; $Rev: 10888 $ ; $Id: stm32g0xx.cmm 10888 2022-05-05 13:56:28Z bwright $ PRIVATE ¶meters ENTRY %LINE ¶meters PRIVATE ¶m_prepareonly ¶m_cpu ¶m_dualport ¶m_finish ¶meters=STRing.UPpeR("¶meters") ¶m_prepareonly=(STRing.SCAN("¶meters","PREPAREONLY",0)!=-1) ¶m_cpu=STRing.SCANAndExtract("¶meters","CPU=","") ¶m_dualport=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"DUALPORT=","1") ¶m_finish=(STRing.SCAN("¶meters","FINISH",0)!=-1) ; -------------------------------------------------------------------------------- ; Initialize and start the debugger IF !SYStem.Up() ( SYStem.RESet IF "¶m_cpu"!="" SYStem.CPU ¶m_cpu IF !CPUIS(STM32G0*) SYStem.CPU STM32G0* SYStem.CONFIG DEBUGPORTTYPE SWD SYStem.Up ) ELSE ( IF !CPUIS(STM32G0*) ( PRINT %ERROR "Please select STM32G0 CPU derivative" ENDDO ) ) ; -------------------------------------------------------------------------------- ; checks and update the boot configuration after flash programming IF ¶m_finish ( GOSUB finishProgramming ENDDO ) ; -------------------------------------------------------------------------------- ; 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 GOSUB finishProgramming ; Reset device SYStem.Down SYStem.Up ) ENDDO ; -------------------------------------------------------------------------------- ; SUBROUTINES ; -------------------------------------------------------------------------------- ; Flash declaration depending on selected CPU FlashDeclaration: ( PARAMETERS ¶m_dualport PRIVATE &FlashDriver &FlashSize &DualBank &FlashBinary &DualBank=FALSE() ; For devices with >128 KB flash, set using option script. &FlashBinary="~~/demo/arm/flash/byte/stm32g0" IF CPUIS(STM32G0???4*) ( &FlashSize=0x4000 ) ELSE IF CPUIS(STM32G0???6*) ( &FlashSize=0x8000 ) ELSE IF CPUIS(STM32G0???8*) ( &FlashSize=0x10000 ) ELSE IF CPUIS(STM32G0???B*) ( &FlashSize=0x20000 ) ELSE IF CPUIS(STM32G0???C*) ( &FlashSize=0x40000 &DualBank=TRUE() &DualBank=(Data.Long(AD:0x1FFF7800)&(1<<21.))==(1<<21.) ; OPTR.DUAL_BANK IF &DualBank &FlashBinary="~~/demo/arm/flash/byte/stm32g0c" ) ELSE IF CPUIS(STM32G0???E*) ( &FlashSize=0x80000 &DualBank=TRUE() &DualBank=(Data.Long(AD:0x1FFF7800)&(1<<21.))==(1<<21.) ; OPTR.DUAL_BANK IF &DualBank &FlashBinary="~~/demo/arm/flash/byte/stm32g0e" ) ELSE ( PRINT %ERROR "FLASH size of CPU type is unknown" ENDDO ) FLASH.Create 1. 0x08000000++(&FlashSize-0x1) 0x800 TARGET Quad Data.ComPare 0x0--0xf 0x08000000 IF !FOUND() FLASH.CreateALIAS 0x00000000++(&FlashSize-1) 0x08000000 IF "¶m_dualport"=="0" FLASH.TARGET 0x20000000 0x20000800 0x1000 &FlashBinary ELSE FLASH.TARGET 0x20000000 EAHB:0x20000800 0x1000 &FlashBinary /DualPort RETURN ) finishProgramming: ( PRIVATE &flash_cr ; In case of programming main flash, but memory at 0x0 isn't mapped to it a ; OBL_LAUNCH is executed to force next boot from flash (programming empty flash) ; Because SYSCFG_CFGR1:MEM_MODE[1:0] is not indicating active memory remap ; we are comparing flash reset vector against reset vector at address 0 Data.ComPare 0x0--0xf 0x08000000 IF FOUND() ( &flash_cr=Data.Long(D:0x40022014) IF ((&flash_cr&0x80000000)==0x80000000) ( ; Unlock FLASH_CR lock Data.Set D:0x40022008 %Long 0x45670123 Data.Set D:0x40022008 %Long 0xCDEF89AB ) IF ((&flash_cr&0x40000000)==0x40000000) ( ; Unlock options lock Data.Set D:0x4002200C %Long 0x08192A3B Data.Set D:0x4002200C %Long 0x4C5D6E7F ) ON ERROR CONTinue Data.Set D:0x40022014 %Long &flash_cr|(1.<<27.) WAIT 0.05s ) RETURN )