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

222 lines
6.2 KiB
Plaintext

; --------------------------------------------------------------------------------
; @Title: Flash declaration for STM32G0 internal flash
; @Description:
; Script arguments:
; DO stm32g0xx [PREPAREONLY] [CPU=<cpu>]
; PREPAREONLY only declares flash but does not execute flash programming
; CPU=<cpu> selects CPU derivative <cpu>
; 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 &parameters
ENTRY %LINE &parameters
PRIVATE &param_prepareonly &param_cpu &param_dualport &param_finish
&parameters=STRing.UPpeR("&parameters")
&param_prepareonly=(STRing.SCAN("&parameters","PREPAREONLY",0)!=-1)
&param_cpu=STRing.SCANAndExtract("&parameters","CPU=","")
&param_dualport=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"DUALPORT=","1")
&param_finish=(STRing.SCAN("&parameters","FINISH",0)!=-1)
; --------------------------------------------------------------------------------
; Initialize and start the debugger
IF !SYStem.Up()
(
SYStem.RESet
IF "&param_cpu"!=""
SYStem.CPU &param_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 &param_finish
(
GOSUB finishProgramming
ENDDO
)
; --------------------------------------------------------------------------------
; 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
GOSUB finishProgramming
; Reset device
SYStem.Down
SYStem.Up
)
ENDDO
; --------------------------------------------------------------------------------
; SUBROUTINES
; --------------------------------------------------------------------------------
; Flash declaration depending on selected CPU
FlashDeclaration:
(
PARAMETERS &param_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 "&param_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
)