479 lines
15 KiB
Plaintext
479 lines
15 KiB
Plaintext
; --------------------------------------------------------------------------------
|
|
; @Title: Example Script for programming of ST STM32F10x internal flash
|
|
;
|
|
; @Description:
|
|
; Script arguments:
|
|
;
|
|
; DO stm32f10x [PREPAREONLY] [CPU=<cpu>] [DUALPORT=0|1]
|
|
;
|
|
; PREPAREONLY only declares flash but does not execute flash programming
|
|
; example
|
|
;
|
|
; 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.
|
|
;
|
|
; List of STM32F10x derivatives and their configuration:
|
|
;
|
|
; CPU-Type Flash size SRAM size
|
|
; (kByte) (kByte)
|
|
; --------------------------------------------------------------------------------
|
|
; STM32F100C4 16. 4.
|
|
; STM32F100C6 32. 4.
|
|
; STM32F100C8 64. 8.
|
|
; STM32F100CB 128. 8.
|
|
; STM32F100R4 16. 4.
|
|
; STM32F100R6 32. 4.
|
|
; STM32F100R8 64. 8.
|
|
; STM32F100RB 128. 8.
|
|
; STM32F100RC 256. 24.
|
|
; STM32F100RD 384. 32.
|
|
; STM32F100RE 512. 32.
|
|
; STM32F100V8 64. 8.
|
|
; STM32F100VB 128. 8.
|
|
; STM32F100VC 256. 24.
|
|
; STM32F100VD 384. 32.
|
|
; STM32F100VE 512. 32.
|
|
; STM32F100ZC 256. 24.
|
|
; STM32F100ZD 384. 32.
|
|
; STM32F100ZE 512. 32.
|
|
; --------------------------------------------------------------------------------
|
|
; STM32F101C4 16. 4.
|
|
; STM32F101C6 32. 6.
|
|
; STM32F101C8 64. 10.
|
|
; STM32F101CB 128. 16.
|
|
; STM32F101R4 16. 4.
|
|
; STM32F101R6 32. 6.
|
|
; STM32F101R8 64. 10.
|
|
; STM32F101RB 128. 16.
|
|
; STM32F101RC 256. 32.
|
|
; STM32F101RD 384. 48.
|
|
; STM32F101RE 512. 48.
|
|
; STM32F101RF 768. 96.
|
|
; STM32F101RG 1024. 96.
|
|
; STM32F101T4 16. 4.
|
|
; STM32F101T6 32. 6.
|
|
; STM32F101T8 64. 10.
|
|
; STM32F101TB 128. 16.
|
|
; STM32F101V8 64. 10.
|
|
; STM32F101VB 128. 16.
|
|
; STM32F101VC 256. 32.
|
|
; STM32F101VD 384. 48.
|
|
; STM32F101VE 512. 48.
|
|
; STM32F101VF 768. 96.
|
|
; STM32F101VG 1024. 96.
|
|
; STM32F101ZC 256. 32.
|
|
; STM32F101ZD 384. 48.
|
|
; STM32F101ZE 512. 48.
|
|
; STM32F101ZF 768. 96.
|
|
; STM32F101ZG 1024. 96.
|
|
; --------------------------------------------------------------------------------
|
|
; STM32F102C4 16. 4.
|
|
; STM32F102C6 32. 6.
|
|
; STM32F102C8 64. 10.
|
|
; STM32F102CB 128. 16.
|
|
; STM32F102R4 16. 4.
|
|
; STM32F102R6 32. 6.
|
|
; STM32F102R8 64. 10.
|
|
; STM32F102RB 128. 16.
|
|
; --------------------------------------------------------------------------------
|
|
; STM32F103C4 16. 6.
|
|
; STM32F103C6 32. 10.
|
|
; STM32F103C8 64. 20.
|
|
; STM32F103CB 128. 20.
|
|
; STM32F103R4 16. 6.
|
|
; STM32F103R6 32. 10.
|
|
; STM32F103R8 64. 20.
|
|
; STM32F103RB 128. 20.
|
|
; STM32F103RC 256. 48.
|
|
; STM32F103RD 284. 64.
|
|
; STM32F103RE 512. 64.
|
|
; STM32F103RF 768. 96.
|
|
; STM32F103RG 1024. 96.
|
|
; STM32F103T4 16. 6.
|
|
; STM32F103T6 32. 10.
|
|
; STM32F103T8 64. 20.
|
|
; STM32F103TB 128. 20.
|
|
; STM32F103V8 64. 20.
|
|
; STM32F103VB 128. 20.
|
|
; STM32F103VC 256. 48.
|
|
; STM32F103VD 384. 64.
|
|
; STM32F103VE 512. 64.
|
|
; STM32F103VF 768. 96.
|
|
; STM32F103VG 1024. 96.
|
|
; STM32F103ZC 256. 48.
|
|
; STM32F103ZD 384. 64.
|
|
; STM32F103ZE 512. 64.
|
|
; STM32F103ZF 768. 96.
|
|
; STM32F103ZG 1024. 96.
|
|
; --------------------------------------------------------------------------------
|
|
; STM32F105R8 64. 20.
|
|
; STM32F105RB 128. 32.
|
|
; STM32F105RC 256. 64.
|
|
; STM32F105V8 64. 20.
|
|
; STM32F105VB 128. 32.
|
|
; STM32F105VC 256. 64.
|
|
; --------------------------------------------------------------------------------
|
|
; STM32F107RB 128. 48.
|
|
; STM32F107RC 256. 64.
|
|
; STM32F107VB 128. 48.
|
|
; STM32F107VC 256. 64.
|
|
;
|
|
; Flash base address is 0x08000000
|
|
; SRAM base address is 0x20000000
|
|
;
|
|
; For programming Option Bytes use stm32f10x-optionbyte.cmm
|
|
;
|
|
; @Author: WRD
|
|
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
|
|
; @Chip: STM32F10*
|
|
; --------------------------------------------------------------------------------
|
|
; $Rev: 10516 $
|
|
; $Id: stm32f10x.cmm 10516 2022-02-02 11:39:30Z bschroefel $
|
|
|
|
LOCAL ¶meters
|
|
ENTRY %LINE ¶meters
|
|
|
|
LOCAL ¶m_prepareonly
|
|
¶m_prepareonly=(STRing.SCAN(STRing.UPpeR("¶meters"),"PREPAREONLY",0)!=-1)
|
|
|
|
LOCAL ¶m_cpu
|
|
IF VERSION.BUILD()>=29755.
|
|
¶m_cpu=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"CPU=","")
|
|
ELSE
|
|
PRINT "Argument CPU= ignored because of too old software"
|
|
|
|
LOCAL ¶m_dualport
|
|
¶m_dualport=0
|
|
IF VERSION.BUILD.BASE()>=43441.
|
|
¶m_dualport=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"DUALPORT=","0")
|
|
|
|
; Optimize flash programming time by switching on PLL
|
|
LOCAL &optimize
|
|
&optimize=0
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; CPU setup
|
|
|
|
IF SYStem.MODE()<5
|
|
(
|
|
SYStem.RESet
|
|
|
|
IF "¶m_cpu"!=""
|
|
SYStem.CPU ¶m_cpu
|
|
IF !CPUIS(STM32F10*)
|
|
(
|
|
IF VERSION.BUILD()>=37389.
|
|
SYStem.CPU STM32F10*
|
|
ELSE
|
|
(
|
|
PRINT %ERROR "Please select STM32F10x CPU derivative"
|
|
ENDDO
|
|
)
|
|
)
|
|
|
|
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 Option Byte programming example
|
|
|
|
DIALOG.YESNO "Program option bytes"
|
|
LOCAL &progflash
|
|
ENTRY &progflash
|
|
IF &progflash
|
|
(
|
|
DO ~~~~/stm32f10x-optionbyte
|
|
)
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash programming example
|
|
|
|
DIALOG.YESNO "Program flash memory?"
|
|
ENTRY &progflash
|
|
|
|
IF &progflash
|
|
(
|
|
; Disable DMA clock
|
|
Data.Set D:0x40021014 %Long Data.Long(D:0x40021014)&0xFFFFFFFC
|
|
|
|
; Disable write protection if needed and reset device to activate changed
|
|
; option bytes
|
|
LOCAL &WRP
|
|
&WRP=Data.Long(D:0x40022020)
|
|
IF &WRP!=0xFFFFFFFF
|
|
DO ~~~~/stm32f10x-optionbyte WRP=0xFFFFFFFF RESETDEVICE
|
|
|
|
IF &optimize==1
|
|
GOSUB SetupPLL
|
|
|
|
; Update flash contents
|
|
FLASH.ReProgram.ALL /Erase
|
|
Data.LOAD.auto *
|
|
FLASH.ReProgram.off
|
|
|
|
; Restore write protection
|
|
IF &WRP!=0xFFFFFFFF
|
|
(
|
|
PRINT "Restoring write protection"
|
|
DO ~~~~/stm32f10x-optionbyte WRP=&WRP
|
|
)
|
|
|
|
; Reset device
|
|
SYStem.Down
|
|
SYStem.Up
|
|
)
|
|
|
|
ENDDO
|
|
|
|
|
|
; --------------------------------------------------------------------------------
|
|
; Setup PLL to optimize flash programming performance
|
|
|
|
SetupPLL:
|
|
|
|
; Switch to internal HSI clock
|
|
Data.Set SD:0x40021004 %Long 0yxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx00
|
|
|
|
; Turn PLL OFF
|
|
Data.Set SD:0x40021000 %Long 0yxxxxxxx0xxxxxxxxxxxxxxxxxxxxxxxx
|
|
|
|
; FLASH Latency 2 for > 48Mhz operation
|
|
Data.Set SD:0x40022000 %Long 0yxxxxxxxxxxxxxxxxxxxxxxxxxxx10010
|
|
|
|
; HSEBYP = NOT BYPASSED
|
|
; HSEON = ON
|
|
; => Turn On external oscillator
|
|
Data.Set SD:0x40021000 %Long 0yxxxxxxxxxxxxx0x1xxxxxxxxxxxxxxxx
|
|
|
|
; CPU Clock 64Mhz, APB==32Mhz, TIMxCLK == 64Mhz
|
|
; APB1 = HCLK/2 (==100 BIT 10-8 )
|
|
; APB2 = HCLK/2 (==100 BIT 13-11)
|
|
; PLLSRC = 1 from PREDIV1 (BIT 16)
|
|
; PLLXTPRE = 0 (BIT 17)
|
|
; PLLMUL = 8 (== 0110 BIT 18-21)
|
|
Data.Set SD:0x40021004 %Long 0yxxxxxxxxxx011001xx100100xxxxxxxx
|
|
|
|
; Turn PLL ON
|
|
Data.Set SD:0x40021000 %Long 0yxxxxxxx1xxxxxxxxxxxxxxxxxxxxxxxx
|
|
|
|
; Switch to PLL Clock
|
|
Data.Set SD:0x40021004 %Long 0yxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx10
|
|
|
|
RETURN
|
|
|
|
|
|
; --------------------------------------------------------------------------------
|
|
; Flash declaration depending on selected CPU
|
|
|
|
FlashDeclaration:
|
|
LOCAL &DualPort
|
|
ENTRY &DualPort
|
|
|
|
LOCAL &FlashSize &SectorSize
|
|
LOCAL &RAMSize
|
|
|
|
IF ((SYStem.CPU()=="STM32F100C4")||(SYStem.CPU()=="STM32F100R4")||(SYStem.CPU()=="STM32F101C4")||(SYStem.CPU()=="STM32F101R4")||(SYStem.CPU()=="STM32F101T4")||(SYStem.CPU()=="STM32F102C4")||(SYStem.CPU()=="STM32F102R4"))
|
|
(
|
|
&FlashSize=0x4000
|
|
&SectorSize=0x400
|
|
&RAMSize=0x1000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F103C4")||(SYStem.CPU()=="STM32F103R4")||(SYStem.CPU()=="STM32F103T4"))
|
|
(
|
|
&FlashSize=0x4000
|
|
&SectorSize=0x400
|
|
&RAMSize=0x1800
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F100C6")||(SYStem.CPU()=="STM32F100R6"))
|
|
(
|
|
&FlashSize=0x8000
|
|
&SectorSize=0x400
|
|
&RAMSize=0x1000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F101C6")||(SYStem.CPU()=="STM32F101R6")||(SYStem.CPU()=="STM32F101T6")||(SYStem.CPU()=="STM32F102C6")||(SYStem.CPU()=="STM32F102R6"))
|
|
(
|
|
&FlashSize=0x8000
|
|
&SectorSize=0x400
|
|
&RAMSize=0x1800
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F103C6")||(SYStem.CPU()=="STM32F103R6")||(SYStem.CPU()=="STM32F103T6"))
|
|
(
|
|
&FlashSize=0x8000
|
|
&SectorSize=0x400
|
|
&RAMSize=0x2800
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F100C8")||(SYStem.CPU()=="STM32F100R8")||(SYStem.CPU()=="STM32F100V8"))
|
|
(
|
|
&FlashSize=0x10000
|
|
&SectorSize=0x400
|
|
&RAMSize=0x2000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F101C8")||(SYStem.CPU()=="STM32F101R8")||(SYStem.CPU()=="STM32F101T8")||(SYStem.CPU()=="STM32F101V8")||(SYStem.CPU()=="STM32F102C8")||(SYStem.CPU()=="STM32F102R8"))
|
|
(
|
|
&FlashSize=0x10000
|
|
&SectorSize=0x400
|
|
&RAMSize=0x2800
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F103C8")||(SYStem.CPU()=="STM32F103R8")||(SYStem.CPU()=="STM32F103T8")||(SYStem.CPU()=="STM32F103V8"))
|
|
(
|
|
&FlashSize=0x10000
|
|
&SectorSize=0x400
|
|
&RAMSize=0x2800
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F105R8")||(SYStem.CPU()=="STM32F105V8"))
|
|
(
|
|
&FlashSize=0x10000
|
|
&SectorSize=0x800
|
|
&RAMSize=0x2800
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F100CB")||(SYStem.CPU()=="STM32F100RB")||(SYStem.CPU()=="STM32F100VB"))
|
|
(
|
|
&FlashSize=0x20000
|
|
&SectorSize=0x400
|
|
&RAMSize=0x2000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F101CB")||(SYStem.CPU()=="STM32F101RB")||(SYStem.CPU()=="STM32F101TB")||(SYStem.CPU()=="STM32F101VB")||(SYStem.CPU()=="STM32F102CB")||(SYStem.CPU()=="STM32F102RB"))
|
|
(
|
|
&FlashSize=0x20000
|
|
&SectorSize=0x400
|
|
&RAMSize=0x4000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F103CB")||(SYStem.CPU()=="STM32F103RB")||(SYStem.CPU()=="STM32F103TB")||(SYStem.CPU()=="STM32F103VB"))
|
|
(
|
|
&FlashSize=0x20000
|
|
&SectorSize=0x400
|
|
&RAMSize=0x5000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F105RB")||(SYStem.CPU()=="STM32F105VB")||(SYStem.CPU()=="STM32F107RB")||(SYStem.CPU()=="STM32F107VB"))
|
|
(
|
|
&FlashSize=0x20000
|
|
&SectorSize=0x800
|
|
&RAMSize=0x8000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F100RC")||(SYStem.CPU()=="STM32F100VC")||(SYStem.CPU()=="STM32F100ZC"))
|
|
(
|
|
&FlashSize=0x40000
|
|
&SectorSize=0x800
|
|
&RAMSize=0x6000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F101RC")||(SYStem.CPU()=="STM32F101VC")||(SYStem.CPU()=="STM32F101ZC"))
|
|
(
|
|
&FlashSize=0x40000
|
|
&SectorSize=0x800
|
|
&RAMSize=0x8000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F103RC")||(SYStem.CPU()=="STM32F103VC")||(SYStem.CPU()=="STM32F103ZC"))
|
|
(
|
|
&FlashSize=0x40000
|
|
&SectorSize=0x800
|
|
&RAMSize=0xc000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F105RC")||(SYStem.CPU()=="STM32F105VC")||(SYStem.CPU()=="STM32F107RC")||(SYStem.CPU()=="STM32F107VC"))
|
|
(
|
|
&FlashSize=0x40000
|
|
&SectorSize=0x800
|
|
&RAMSize=0x10000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F100RD")||(SYStem.CPU()=="STM32F100VD")||(SYStem.CPU()=="STM32F100ZD"))
|
|
(
|
|
&FlashSize=0x60000
|
|
&SectorSize=0x800
|
|
&RAMSize=0x8000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F101RD")||(SYStem.CPU()=="STM32F101VD")||(SYStem.CPU()=="STM32F101ZD"))
|
|
(
|
|
&FlashSize=0x60000
|
|
&SectorSize=0x800
|
|
&RAMSize=0xc000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F103RD")||(SYStem.CPU()=="STM32F103VD")||(SYStem.CPU()=="STM32F103ZD"))
|
|
(
|
|
&FlashSize=0x60000
|
|
&SectorSize=0x800
|
|
&RAMSize=0x10000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F100RE")||(SYStem.CPU()=="STM32F100VE")||(SYStem.CPU()=="STM32F100ZE"))
|
|
(
|
|
&FlashSize=0x80000
|
|
&SectorSize=0x800
|
|
&RAMSize=0x8000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F101RE")||(SYStem.CPU()=="STM32F101VE")||(SYStem.CPU()=="STM32F101ZE"))
|
|
(
|
|
&FlashSize=0x80000
|
|
&SectorSize=0x800
|
|
&RAMSize=0xc000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F103RE")||(SYStem.CPU()=="STM32F103VE")||(SYStem.CPU()=="STM32F103ZE"))
|
|
(
|
|
&FlashSize=0x80000
|
|
&SectorSize=0x800
|
|
&RAMSize=0x10000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F101RF")||(SYStem.CPU()=="STM32F101VF")||(SYStem.CPU()=="STM32F101ZF")||(SYStem.CPU()=="STM32F103RF")||(SYStem.CPU()=="STM32F103VF")||(SYStem.CPU()=="STM32F103ZF"))
|
|
(
|
|
&FlashSize=0xc0000
|
|
&SectorSize=0x800
|
|
&RAMSize=0x18000
|
|
)
|
|
ELSE IF ((SYStem.CPU()=="STM32F101RG")||(SYStem.CPU()=="STM32F101VG")||(SYStem.CPU()=="STM32F101ZG")||(SYStem.CPU()=="STM32F103RG")||(SYStem.CPU()=="STM32F103VG")||(SYStem.CPU()=="STM32F103ZG"))
|
|
(
|
|
&FlashSize=0x100000
|
|
&SectorSize=0x800
|
|
&RAMSize=0x18000
|
|
)
|
|
ELSE
|
|
(
|
|
PRINT %ERROR "FLASH size of CPU type is unknown"
|
|
ENDDO
|
|
)
|
|
|
|
FLASH.Create 1. 0x08000000++(&FlashSize-0x01) &SectorSize TARGET Word
|
|
; For Main Flash memory boot mode flash memory is aliased to address 0x0
|
|
FLASH.CreateALIAS 0x0++(&FlashSize-0x01) 0x08000000
|
|
|
|
LOCAL &access &option
|
|
IF &DualPort!=0
|
|
(
|
|
&access="EAHB"
|
|
&option="/DualPort"
|
|
)
|
|
ELSE
|
|
&access="D"
|
|
|
|
IF &FlashSize>0x80000
|
|
(
|
|
FLASH.TARGET 0x20000000 &access:0x20001000 &SectorSize ~~/demo/arm/flash/word/stm32f100xl.bin &option
|
|
)
|
|
ELSE IF &RAMSize>=0x1800
|
|
(
|
|
FLASH.TARGET 0x20000000 &access:0x20000800 &SectorSize ~~/demo/arm/flash/word/stm32f100.bin &option
|
|
)
|
|
ELSE IF &RAMSize>=0x1000
|
|
(
|
|
FLASH.TARGET 0x20000000 &access:0x20000800 0x400 ~~/demo/arm/flash/word/stm32f100.bin &option
|
|
)
|
|
ELSE
|
|
(
|
|
DIALOG.OK "Not enough memory for flash algorithm."
|
|
ENDDO
|
|
)
|
|
|
|
RETURN
|