222 lines
6.2 KiB
Plaintext
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 ¶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
|
|
)
|