Files
Gen4_R-Car_Trace32/2_Trunk/demo/arm/flash/stm32u5-optionbyte.cmm
2025-10-14 09:52:32 +09:00

1688 lines
57 KiB
Plaintext

; --------------------------------------------------------------------------------
; @Title: ST STM32U5 Flash Dialog to program Option Bytes.
;
; @Description:
; Script arguments:
;
; DO ~~/demo/arm/flash/stm32u5-optionbyte
;
; Opens the STM32U5 option byte programming dialog.
;
; DO ~~/demo/arm/flash/stm32u5-optionbyte
; [RDP_LEV=0|0.5|1] [BOR_LEV=0..4]
; [NRST_STDBY=0|1] [NRST_STOP=0|1] [NRST_SHDW=0|1] [SRAM134_RST=0|1]
; [IWDG_SW=0|1] [IWDG_STOP=0|1] [IWDG_STDBY=0|1] [WWDG_SW=0|1]
; [SWAP_BANK=0|1] [BKPRAM_ECC=0|1]
; [SRAM2_ECC=0|1] [SRAM3_ECC=0|1] [SRAM2_RST=0|1] [NSWBOOT0=0|1]
; [NBOOT0=0|1] [PA15PUPEN=0|1] [TZEN=0|1] [VDDIO2_HSLV=0|1]
; [IO_VDD_HSLV=0|1]
; [NSBOOTADD0R=<val>] [NSBOOTADD1R=<val>] [SECBOOTADD0R=<val>]
; [SECWM1R1=<val>] [SECWM1R2=<val>] [SECWM2R1=<val>] [SECWM2R2=<val>]
; [WRP1AR=<val>] [WRP1BR=<val>] [WRP2AR=<val>] [WRP2BR=<val>]
; [SECBB1R1=<val>] [SECBB1R2=<val>] [SECBB1R3=<val>] [SECBB1R4=<val>]
; [SECBB2R1=<val>] [SECBB2R2=<val>] [SECBB2R3=<val>] [SECBB2R4=<val>]
; [SECHDPCR=<val>] [PRIVCFGR=<val>]
; [RELOAD_OPTIONBYTES]
;
; Program the STM32U5 option bytes according to the following parameters:
;
; RDP_LEV=0|0.5|1 is programming read protection option byte
; 0 : Level 0 memories read protection active
; 0.5: Level 0.5 read protection not active,
; only non-secure debug access is possible
; 1 : Level 1, memories read protection active
; Note : the script doens't support programming Level 2, because with it no
; further debugging would be possible !
;
; BOR_LEV=0..4: BOR reset level
; 0: BOR Level 0: Reset level threshold is around 1.7 V
; 1: BOR Level 1: Reset level threshold is around 2.0 V
; 2: BOR Level 2: Reset level threshold is around 2.2 V
; 3: BOR Level 3: Reset level threshold is around 2.5 V
; 4: BOR Level 4: Reset level threshold is around 2.8 V
;
; NRST_STOP=0|1 is programming nRST_STOP bit of user option byte
; 0: Reset generated when entering Stop mode
; 1: No reset generated.
;
; NRST_STDBY=0|1 is programming nRST_STDBY bit of user option byte
; 0: Reset generated when entering Standby mode
; 1: No reset generated
;
; NRST_SHDW=0|1 is programming nRST_SHDW bit of user option byte
; 0: Reset generated when entering the Shutdown mode
; 1: No reset generated when entering the Shutdown mode
;
; SRAM134_RST=0|1 is programming SRAM134_RST bit of user option byte
; 0: SRAM1, SRAM3 and SRAM4 erased when a system reset occurs
; 1: SRAM1, SRAM3 and SRAM4 not erased when a system reset occurs
;
; IWDG_SW=0|1 is programming IWDG_SW bit of user option byte
; 0: Hardware independant watchdog
; 1: Software independant watchdog
;
; IWDG_STOP=0|1 is programming IWDG_STOP bit of user option byte
; 0: Independent watchdog counter is frozen in Stop mode
; 1: Independent watchdog counter is running in Stop mode
;
; IWDG_STDBY=0|1 is programming IWDG_STDBY bit of user option byte
; 0: Independent watchdog counter is frozen in Standby mode
; 1: Independent watchdog counter is running in Standby mode
;
; WWDG_SW=0|1 is programming WWDG_SW bit of user option byte
; 0: Hardware window watchdog
; 1: Software window watchdog
;
; SWAP_BANK=0|1: Swap banks
; 0: Bank 1 and bank 2 address are not swapped
; 1: Bank 1 and bank 2 address are swapped
;
; BKPRAM_ECC: Backup RAM ECC check disable
; 0: Backup RAM ECC check enabled
; 1: Backup RAM ECC check disabled
;
; SRAM2_ECC: SRAM2 ECC check disable
; 0: SRAM2 ECC check enabled
; 1: SRAM2 ECC check disabled
;
; SRAM3_ECC: SRAM3 ECC check disable
; 0: SRAM2 ECC check enabled
; 1: SRAM2 ECC check disabled
;
; SRAM2_RST: SRAM2 erase when system reset
; 0: SRAM2 erased when a system reset occurs
; 1: SRAM2 not erased when a system reset occurs
;
; NBOOT0: nBOOT0 option bit
; 0: nBOOT0 = 0
; 1: nBOOT0 = 1
;
; NSWBOOT0:: Software BOOT0
; 0: BOOT0 taken from the option bit nBOOT0
; 1: BOOT0 taken from PH3/BOOT0 pin
;
; PA15PUPEN: PA15 pull-up enable
; 0: USB power delivery dead-battery enabled/TDI pull-up deactivated
; 1: USB power delivery dead-battery disabled/TDI pull-up activated
;
; IO_VDD_HSLV: High-speed IO at low VDD voltage configuration bit
; 0: High-speed IO at low VDD voltage feature disabled
; 1: High-speed IO at low VDD voltage feature enabled
;
; VDDIO2_HSLV: High-speed IO at low VDDIO2 voltage configuration bit
; 0: High-speed IO at low VDDIO2 voltage feature disabled
; 1: High-speed IO at low VDDIO2 voltage feature enabled
;
; NSBOOTADD0R=<val> NSBOOTADD0R register
; NSBOOTADD1R=<val> NSBOOTADD1R register
; SECBOOTADD0R=<val> SECBOOTADD0R register
; SECWM1R1=<val> SECWM1R1 register
; SECWM1R2=<val> SECWM1R2 register
; SECWM2R1=<val> SECWM2R1 register
; SECWM2R2=<val> SECWM2R2 register
; WRP1AR=<val> WRP1AR register
; WRP1BR=<val> WRP1BR register
; WRP2AR=<val> WRP2AR register
; WRP2BR=<val> WRP2BR register
; SECBB1R1=<val> SECBB1R1 register
; SECBB1R2=<val> SECBB1R2 register
; SECBB1R3=<val> SECBB1R3 register
; SECBB1R4=<val> SECBB1R4 register
; SECBB2R1=<val> SECBB2R1 register
; SECBB2R2=<val> SECBB2R2 register
; SECBB2R3=<val> SECBB2R3 register
; SECBB2R4=<val> SECBB2R4 register
; PRIV1BBR1=<val> PRIV1BBR1 register
; PRIV1BBR2=<val> PRIV1BBR2 register
; PRIV1BBR3=<val> PRIV1BBR3 register
; PRIV1BBR4=<val> PRIV1BBR4 register
; PRIV2BBR1=<val> PRIV2BBR1 register
; PRIV2BBR2=<val> PRIV2BBR2 register
; PRIV2BBR3=<val> PRIV2BBR3 register
; PRIV2BBR4=<val> PRIV2BBR4 register
; SECHDPCR=<val> SECHDPCR register
; PRIVCFGR=<val> PRIVCFGR register
; Note: for clearing protection set xx_START=0xFF and xx_END=0x0
;
; RELOAD_OPTIONBYTES Activate Flash Settings by execution of an OBL_LAUNCH
;
; Calling the script without argument starts the Option Byte programming
; dialog window.
;
; @Author: PHI
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Rev: 12746 $
; $Id: stm32u5-optionbyte.cmm 12746 2023-11-17 09:17:02Z mschaeffner $
LOCAL &parameters
ENTRY %LINE &parameters
; LOCAL macros used as script global macros
LOCAL &Script
LOCAL &FlashRegBase &FlashAdressStart
LOCAL &OPTR &TZenabled
LOCAL &NSBOOTADD0R &NSBOOTADD1R &SECBOOTADD0R &SECHDPCR &PRIVCFGR
LOCAL &SECWM1R1 &SECWM1R2 &SECWM2R1 &SECWM2R2
LOCAL &WRP1AR &WRP1BR &WRP2AR &WRP2BR
LOCAL &SECBB1R1 &SECBB1R2 &SECBB1R3 &SECBB1R4
LOCAL &SECBB2R1 &SECBB2R2 &SECBB2R3 &SECBB2R4
LOCAL &PRIV1BBR1 &PRIV1BBR2 &PRIV1BBR3 &PRIV1BBR4
LOCAL &PRIV2BBR1 &PRIV2BBR2 &PRIV2BBR3 &PRIV2BBR4
&Script=OS.PPF()
; Use secured register mapping to program also registers, which can only be accessed secure
&FlashRegBase="D:0x40022000"
IF ((Data.Long(D:0x40022000+0x40)&0x80000000)==0x80000000)
(
&TZenabled=TRUE()
)
ELSE
(
&TZenabled=FALSE()
)
&FlashAdressStart="0x08000000"
; Checking CPU selection
IF !CPUIS(STM32U*)
(
SYStem.RESet
SYStem.CPU STM32U*
)
IF !(CPUIS(STM32U*))
(
PRINT %ERROR "CPU not supported by this script"
ENDDO
)
IF SYStem.MODE()<5
(
SYStem.Option.ResBreak OFF
SYStem.Up
)
; Parse script arguments
IF "&parameters"==""
(
; Look for any opened STM32U5 dialog windows and close them
IF DIALOG.EXIST("COMB_BORLEV")
DIALOG.END
GOSUB OptionByteDialog
)
ELSE
(
PRIVATE &param_RDP_LEV &param_BOR_LEV
PRIVATE &param_nRST_STOP &param_nRST_STDBY &param_nRST_SHDW &param_SRAM134_RST
PRIVATE &param_IWDG_SW &param_IWDG_STOP &param_IWDG_STDBY &param_WWDG_SW &param_SWAP_BANK
PRIVATE &param_BKPRAM_ECC &param_TZEN &param_IO_VDD_HSLV &param_IO_VDDIO2_HSLV
PRIVATE &param_PA15PUPEN &param_SRAM2_ECC &param_SRAM3_ECC &param_SRAM2_RST &param_nSWBOOT0 &param_nBOOT0
PRIVATE &param_NSBOOTADD0R &param_NSBOOTADD1R &param_SECBOOTADD0R
PRIVATE &param_SECWM1R1 &param_SECWM1R2 &param_SECWM2R1 &param_SECWM2R2
PRIVATE &param_WRP1AR &param_WRP2AR &param_WRP1BR &param_WRP2BR &param_SECHDPCR &param_PRIVCFGR
PRIVATE &param_SECBB1R1 &param_SECBB1R2 &param_SECBB1R3 &param_SECBB1R4
PRIVATE &param_SECBB2R1 &param_SECBB2R2 &param_SECBB2R3 &param_SECBB2R4
PRIVATE &param_reloadOptionBytes &programFlash
&programFlash=FALSE()
&param_RDP_LEV=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"RDP_LEV=","")
&param_BOR_LEV=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"BOR_LEV=","")
&param_nRST_STOP=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"NRST_STOP=","")
&param_nRST_STDBY=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"NRST_STDBY=","")
&param_nRST_SHDW=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"NRST_SHDW=","")
&param_SRAM134_RST=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SRAM134_RST=","")
&param_IWDG_SW=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"IWDG_SW=","")
&param_IWDG_STOP=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"IWDG_STOP=","")
&param_IWDG_STDBY=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"IWDG_STDBY=","")
&param_WWDG_SW=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"WWDG_SW=","")
&param_SWAP_BANK=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SWAP_BANK=","")
&param_BKPRAM_ECC=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"BKPRAM_ECC=","")
&param_PA15PUPEN=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"PA15PUPEN=","")
&param_SRAM2_ECC=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SRAM2_ECC=","")
&param_SRAM3_ECC=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SRAM3_ECC=","")
&param_SRAM2_RST=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SRAM2_RST=","")
&param_nSWBOOT0=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"NSWBOOT0=","")
&param_nBOOT0=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"NBOOT0=","")
&param_IO_VDD_HSLV=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"IO_VDD_HSLV=","")
&param_IO_VDDIO2_HSLV=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"IO_VDDIO2_HSLV=","")
&param_TZEN=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"TZEN=","")
&param_NSBOOTADD0R=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"NSBOOTADD0R=","")
&param_NSBOOTADD1R=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"NSBOOTADD1R=","")
&param_SECBOOTADD0R=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SECBOOTADD0R=","")
&param_SECWM1R1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SECWM1R1=","")
&param_SECWM1R2=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SECWM1R2=","")
&param_SECWM2R1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SECWM2R1=","")
&param_SECWM2R2=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SECWM2R2=","")
&param_WRP1AR=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"WRP1AR=","")
&param_WRP2AR=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"WRP2AR=","")
&param_WRP1BR=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"WRP1BR=","")
&param_WRP2BR=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"WRP2BR=","")
&param_SECHDPCR=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SECHDPCR=","")
&param_PRIVCFGR=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"PRIVCFGR=","")
&param_SECBB1R1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SECBB1R1=","")
&param_SECBB1R2=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SECBB1R2=","")
&param_SECBB1R3=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SECBB1R3=","")
&param_SECBB1R4=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SECBB1R4=","")
&param_SECBB2R1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SECBB2R1=","")
&param_SECBB2R2=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SECBB2R2=","")
&param_SECBB2R3=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SECBB2R3=","")
&param_SECBB2R4=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SECBB2R4=","")
&param_PRIV1BBR1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"PRIV1BBR1=","")
&param_PRIV1BBR2=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"PRIV1BBR2=","")
&param_PRIV1BBR3=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"PRIV1BBR3=","")
&param_PRIV1BBR4=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"PRIV1BBR4=","")
&param_PRIV2BBR1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"PRIV2BBR1=","")
&param_PRIV2BBR2=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"PRIV2BBR2=","")
&param_PRIV2BBR3=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"PRIV2BBR3=","")
&param_PRIV2BBR4=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"PRIV2BBR4=","")
&param_reloadOptionBytes=(STRing.SCAN(STRing.UPpeR("&parameters"),"RELOAD_OPTIONBYTES",0)!=-1)
GOSUB ReadOptionBytes
IF "&param_RDP_LEV"!=""
(
IF "&param_RDP_LEV"=="1"
&OPTR=&OPTR&~0xFF
ELSE IF "&param_RDP_LEV"=="0"
&OPTR=(&OPTR&~0xFF)|0xAA
ELSE IF "&param_RDP_LEV"=="0.5"
&OPTR=(&OPTR&~0xFF)|0x55
&programFlash=TRUE()
)
IF "&param_BOR_LEV"!=""
(
&OPTR=&OPTR&~0x700
IF "&param_BOR_LEV"=="4"
&OPTR=&OPTR|0x400
ELSE IF "&param_BOR_LEV"=="3"
&OPTR=&OPTR|0x300
ELSE IF "&param_BOR_LEV"=="2"
&OPTR=&OPTR|0x200
ELSE IF "&param_BOR_LEV"=="1"
&OPTR=&OPTR|0x100
&programFlash=TRUE()
)
IF "&param_nRST_STOP"!=""
(
IF "&param_nRST_STOP"=="1"
&OPTR=&OPTR|0x1000
ELSE IF "&param_nRST_STOP"=="0"
&OPTR=&OPTR&~0x1000
&programFlash=TRUE()
)
IF "&param_nRST_STDBY"!=""
(
IF "&param_nRST_STDBY"=="1"
&OPTR=&OPTR|0x2000
ELSE IF "&param_nRST_STDBY"=="0"
&OPTR=&OPTR&~0x2000
&programFlash=TRUE()
)
IF "&param_nRST_SHDW"!=""
(
IF "&param_nRST_SHDW"=="1"
&OPTR=&OPTR|0x4000
ELSE IF "&param_nRST_SHDW"=="0"
&OPTR=&OPTR&~0x4000
&programFlash=TRUE()
)
IF "&param_SRAM134_RST"!=""
(
IF "&param_SRAM134_RST"=="1"
&OPTR=&OPTR|0x8000
ELSE IF "&param_SRAM134_RST"=="0"
&OPTR=&OPTR&~0x8000
&programFlash=TRUE()
)
IF "&param_IWDG_SW"!=""
(
IF "&param_IWDG_SW"=="1"
&OPTR=&OPTR|0x10000
ELSE IF "&param_IWDG_SW"=="0"
&OPTR=&OPTR&~0x10000
&programFlash=TRUE()
)
IF "&param_IWDG_STOP"!=""
(
IF "&param_IWDG_STOP"=="1"
&OPTR=&OPTR|0x20000
ELSE IF "&param_IWDG_STOP"=="0"
&OPTR=&OPTR&~0x20000
&programFlash=TRUE()
)
IF "&param_IWDG_STDBY"!=""
(
IF "&param_IWDG_STDBY"=="1"
&OPTR=&OPTR|0x40000
ELSE IF "&param_IWDG_STDBY"=="0"
&OPTR=&OPTR&~0x40000
&programFlash=TRUE()
)
IF "&param_WWDG_SW"!=""
(
IF "&param_WWDG_SW"=="1"
&OPTR=&OPTR|0x80000
ELSE IF "&param_WWDG_SW"=="0"
&OPTR=&OPTR&~0x80000
&programFlash=TRUE()
)
IF "&param_SWAP_BANK"!=""
(
IF "&param_SWAP_BANK"=="1"
&OPTR=&OPTR|0x100000
ELSE IF "&param_SWAP_BANK"=="0"
&OPTR=&OPTR&~0x100000
&programFlash=TRUE()
)
IF "&param_BKPRAM_ECC"!=""
(
IF "&param_BKPRAM_ECC"=="1"
&OPTR=&OPTR|0x400000
ELSE IF "&param_BKPRAM_ECC"=="0"
&OPTR=&OPTR&~0x400000
&programFlash=TRUE()
)
IF "&param_PA15PUPEN"!=""
(
IF "&param_PA15PUPEN"=="1"
&OPTR=&OPTR|0x10000000
ELSE IF "&param_PA15PUPEN"=="0"
&OPTR=&OPTR&~0x10000000
&programFlash=TRUE()
)
IF "&param_SRAM2_ECC"!=""
(
IF "&param_SRAM2_ECC"=="1"
&OPTR=&OPTR|0x1000000
ELSE IF "&param_SRAM2_ECC"=="0"
&OPTR=&OPTR&~0x1000000
&programFlash=TRUE()
)
IF "&param_SRAM3_ECC"!=""
(
IF "&param_SRAM3_ECC"=="1"
&OPTR=&OPTR|0x800000
ELSE IF "&param_SRAM3_ECC"=="0"
&OPTR=&OPTR&~0x800000
&programFlash=TRUE()
)
IF "&param_SRAM2_RST"!=""
(
IF "&param_SRAM2_RST"=="1"
&OPTR=&OPTR|0x2000000
ELSE IF "&param_SRAM2_RST"=="0"
&OPTR=&OPTR&~0x2000000
&programFlash=TRUE()
)
IF "&param_nSWBOOT0"!=""
(
IF "&param_nSWBOOT0"=="1"
&OPTR=&OPTR|0x4000000
ELSE IF "&param_nSWBOOT0"=="0"
&OPTR=&OPTR&~0x4000000
&programFlash=TRUE()
)
IF "&param_nBOOT0"!=""
(
IF "&param_nBOOT0"=="1"
&OPTR=&OPTR|0x8000000
ELSE IF "&param_nBOOT0"=="0"
&OPTR=&OPTR&~0x8000000
&programFlash=TRUE()
)
IF "&param_IO_VDD_HSLV"!=""
(
IF "&param_IO_VDD_HSLV"=="1"
&OPTR=&OPTR|0x20000000
ELSE IF "&param_IO_VDD_HSLV"=="0"
&OPTR=&OPTR&~0x20000000
&programFlash=TRUE()
)
IF "&param_IO_VDDIO2_HSLV"!=""
(
IF "&param_IO_VDDIO2_HSLV"=="1"
&OPTR=&OPTR|0x40000000
ELSE IF "&param_IO_VDDIO2_HSLV"=="0"
&OPTR=&OPTR&~0x40000000
&programFlash=TRUE()
)
IF "&param_PA15PUPEN"!=""
(
IF "&param_PA15PUPEN"=="1"
&OPTR=&OPTR|0x10000000
ELSE IF "&param_PA15PUPEN"=="0"
&OPTR=&OPTR&~0x10000000
&programFlash=TRUE()
)
IF "&param_TZEN"!=""
(
IF "&param_TZEN"=="1"
&OPTR=&OPTR|0x80000000
ELSE IF "&param_TZEN"=="0"
&OPTR=&OPTR&~0x80000000
&programFlash=TRUE()
)
IF ("&param_NSBOOTADD0R"!="")
(
&NSBOOTADD0R=&param_NSBOOTADD0R
&programFlash=TRUE()
)
IF ("&param_NSBOOTADD1R"!="")
(
&NSBOOTADD1R=&param_NSBOOTADD1R
&programFlash=TRUE()
)
IF ("&param_SECBOOTADD0R"!="")
(
&SECBOOTADD0R=&param_SECBOOTADD0R
&programFlash=TRUE()
)
IF ("&param_SECWM1R1"!="")
(
&SECWM1R1=&param_SECWM1R1
&programFlash=TRUE()
)
IF ("&param_SECWM1R2"!="")
(
&SECWM1R2=&param_SECWM1R2
&programFlash=TRUE()
)
IF ("&param_SECWM2R1"!="")
(
&SECWM2R1=&param_SECWM2R1
&programFlash=TRUE()
)
IF ("&param_SECWM2R2"!="")
(
&SECWM2R2=&param_SECWM2R2
&programFlash=TRUE()
)
IF ("&param_WRP1AR"!="")
(
&WRP1AR=&param_WRP1AR
&programFlash=TRUE()
)
IF ("&param_WRP1BR"!="")
(
&WRP1BR=&param_WRP1BR
&programFlash=TRUE()
)
IF ("&param_WRP2AR"!="")
(
&WRP2AR=&param_WRP2AR
&programFlash=TRUE()
)
IF ("&param_WRP2BR"!="")
(
&WRP2BR=&param_WRP2BR
&programFlash=TRUE()
)
IF ("&param_SECBB1R1"!="")
(
&SECBB1R1=&param_SECBB1R1
&programFlash=TRUE()
)
IF ("&param_SECBB1R2"!="")
(
&SECBB1R2=&param_SECBB1R2
&programFlash=TRUE()
)
IF ("&param_SECBB1R3"!="")
(
&SECBB1R3=&param_SECBB1R3
&programFlash=TRUE()
)
IF ("&param_SECBB1R4"!="")
(
&SECBB1R4=&param_SECBB1R4
&programFlash=TRUE()
)
IF ("&param_SECBB2R1"!="")
(
&SECBB2R1=&param_SECBB2R1
&programFlash=TRUE()
)
IF ("&param_SECBB2R2"!="")
(
&SECBB2R2=&param_SECBB2R2
&programFlash=TRUE()
)
IF ("&param_SECBB2R3"!="")
(
&SECBB2R3=&param_SECBB2R3
&programFlash=TRUE()
)
IF ("&param_SECBB2R4"!="")
(
&SECBB2R4=&param_SECBB2R4
&programFlash=TRUE()
)
IF ("&param_PRIV1BBR1"!="")
(
&PRIV1BBR1=&param_PRIV1BBR1
&programFlash=TRUE()
)
IF ("&param_PRIV1BBR2"!="")
(
&PRIV1BBR2=&param_PRIV1BBR2
&programFlash=TRUE()
)
IF ("&param_PRIV1BBR3"!="")
(
&PRIV1BBR3=&param_PRIV1BBR3
&programFlash=TRUE()
)
IF ("&param_PRIV1BBR4"!="")
(
&PRIV1BBR4=&param_PRIV1BBR4
&programFlash=TRUE()
)
IF ("&param_PRIV2BBR1"!="")
(
&PRIV2BBR1=&param_PRIV2BBR1
&programFlash=TRUE()
)
IF ("&param_PRIV2BBR2"!="")
(
&PRIV2BBR2=&param_PRIV2BBR2
&programFlash=TRUE()
)
IF ("&param_PRIV2BBR3"!="")
(
&PRIV2BBR3=&param_PRIV2BBR3
&programFlash=TRUE()
)
IF ("&param_PRIV2BBR4"!="")
(
&PRIV2BBR4=&param_PRIV2BBR4
&programFlash=TRUE()
)
IF ("&param_SECHDPCR"!="")
(
&SECHDPCR=&param_SECHDPCR
&programFlash=TRUE()
)
IF ("&param_PRIVCFGR"!="")
(
&PRIVCFGR=&param_PRIVCFGR
&programFlash=TRUE()
)
; Special script calls from dialog to refresh the dialog or activate option bytes.
IF (STRing.SCAN(STRing.UPpeR("&parameters"),"REFRESH",0)!=-1)
(
GOSUB UpdateWindowFromFlashContents
)
ELSE IF (STRing.SCAN(STRing.UPpeR("&parameters"),"RELOAD_OPTIONBYTES",0)!=-1)
(
GOSUB ActivateFlashSettings
)
; Program option bytes into flash
ELSE IF &programFlash
(
GOSUB ProgramOptionBytes
)
ELSE
(
)
)
ENDDO
; --------------------------------------------------------------------------------
; NVM bit programming dialog window
OptionByteDialog:
; Creating the main dialog.
WinPOS 10. 1. 74. 38.
DIALOG.view
(&
HEADER SYStem.CPU()+" option bytes"
POS 1. 0. 72. 16.
BOX "User option bytes"
POS 3. 1. 20. 1.
TEXT "Read protection Level:"
POS 20. 1. 25. 1.
COMB_RDP: COMBOBOX "Level 0:No read protection,Level 0.5:only non-secure debug access,Level 1:Read protection" ""
POS 3. 2. 20. 1.
TEXT "BOR reset level:"
POS 20. 2. 25. 1.
COMB_BORLEV: COMBOBOX "Level 0:threshold around 1.7 V,Level 1:threshold around 2.0 V,Level 2:threshold around 2.2 V,Level 3:threshold around 2.5 V,Level 4:threshold around 2.8 V" ""
POS 3. 4. 30. 1.
CHK_RST_STOP: CHECKBOX "Reset when entering Stop mode" ""
POS 3. 5. 30. 1.
CHK_RST_STDBY: CHECKBOX "Reset when entering Standby mode" ""
POS 34. 4. 35. 1.
CHK_RST_SHDW: CHECKBOX "Reset when entering Shutdown mode" ""
POS 34. 5. 35. 1.
CHK_SRAM134_RST:CHECKBOX "SSRAM1/3 and 4 erased upon system reset" ""
POS 3. 6. 25. 1.
CHSB_IWDG.HW: CHOOSEBOX "Hardware independant watchdog" ""
CHSB_IWDG.SW: CHOOSEBOX "Software independant watchdog" ""
POS 34. 6. 30. 1.
CHSB_WWDG.HW: CHOOSEBOX "Hardware window watchdog" ""
CHSB_WWDG.SW: CHOOSEBOX "Software window watchdog" ""
POS 3. 8. 29. 1.
CHK_IWDG_STOP: CHECKBOX "Watchdog counter freeze in Stop mode" ""
POS 34. 8. 33. 1.
CHK_IWDG_STDBY: CHECKBOX "Watchdog counter freeze in Standby mode" ""
POS 3. 9. 24. 1.
CHK_SWAP_BANK: CHECKBOX "Swap Banks" ""
POS 34. 9. 31. 1.
CHK_BKPRAM_ECC_DIS: CHECKBOX "Backup RAM ECC check disabled" ""
POS 3. 10. 25. 1.
CHK_SRAM2_ECC_CHECK_DIS: CHECKBOX "SRAM2 ECC check disabled" ""
POS 3. 11. 30. 1.
CHK_SRAM3_ECC_CHECK_DIS: CHECKBOX "SRAM3 ECC check disabled" ""
POS 34. 10. 30. 1.
CHK_RAM_ERASE: CHECKBOX "SRAM2 Erase when system reset" ""
POS 3. 12. 15. 1.
CHK_NBOOT0: CHECKBOX "nBOOT0" ""
POS 34. 12. 15. 1.
CHK_NSWBOOT0: CHECKBOX "nSWBOOT0" ""
POS 3. 13. 20. 1.
CHK_PA15PUPEN: CHECKBOX "PA15 pull-up enable" ""
POS 34. 13. 30. 1.
CHK_TZEN: CHECKBOX "Global TrustZone security enabled" ""
POS 3. 14. 28. 1.
CHK_IO_VDD_HSLV: CHECKBOX "High-speed IO at low VDD voltage feature enabled" ""
POS 34. 14. 30. 1.
CHK_IO_VDDIO2_HSLV:CHECKBOX "High-speed IO at low VDDIO2 voltage feature enabled" ""
POS 1. 16. 72. 20.
BOX "Registers for protected zones"
POS 3. 17. 12. 1.
TEXT "NSBOOTADD0R"
POS 15. 17. 11. 1.
NSBOOTADD0R: EDIT "" ""
POS 28. 17. 12. 1.
TEXT "NSBOOTADD1R"
POS 41. 17. 11. 1.
NSBOOTADD1R: EDIT "" ""
POS 3. 18. 12. 1.
TEXT "SECBOOTADD0"
POS 15. 18. 11. 1.
SECBOOTADD0: EDIT "" ""
POS 28. 18. 24. 1.
CHK_BOOT_LOCK: CHECKBOX "Boot lock" ""
POS 3. 19. 12. 1.
TEXT "SECWM1R1"
POS 15. 19. 6. 1.
TEXT "1. Page"
POS 21. 19. 6. 1.
SECWM1R1_START_PAGE:EDIT "" ""
POS 28. 19. 8. 1.
TEXT "Last Page"
POS 37. 19. 6. 1.
SECWM1R1_END_PAGE:EDIT "" ""
POS 3. 20. 12. 1.
TEXT "SECWM1R2"
POS 15. 20. 6. 1.
TEXT "1. Page"
POS 21. 20. 6. 1.
SECWM1R2_START_PAGE:EDIT "" ""
POS 28. 20. 8. 1.
TEXT "Last Page"
POS 37. 20. 6. 1.
SECWM1R2_END_PAGE:EDIT "" ""
POS 44. 20. 11. 1.
CHK_HDP1EN: CHECKBOX "HDP1 area enabled" ""
POS 55. 20. 13. 1.
CHK_PCROP1EN: CHECKBOX "PCROP1 area enabled" ""
POS 3. 21. 12. 1.
TEXT "SECWM2R1"
POS 15. 21. 6. 1.
TEXT "1. Page"
POS 21. 21. 6. 1.
SECWM2R1_START_PAGE:EDIT "" ""
POS 28. 21. 8. 1.
TEXT "Last Page"
POS 37. 21. 6. 1.
SECWM2R1_END_PAGE:EDIT "" ""
POS 3. 22. 12. 1.
TEXT "SECWM2R2"
POS 15. 22. 6. 1.
TEXT "1. Page"
POS 21. 22. 6. 1.
SECWM2R2_START_PAGE:EDIT "" ""
POS 28. 22. 8. 1.
TEXT "Last Page"
POS 37. 22. 6. 1.
SECWM2R2_END_PAGE:EDIT "" ""
POS 44. 22. 11. 1.
CHK_HDP2EN: CHECKBOX "HDP2 area enabled" ""
POS 55. 22. 13. 1.
CHK_PCROP2EN: CHECKBOX "PCROP2 area enabled" ""
POS 3. 23. 12. 1.
TEXT "WRP1AR"
POS 15. 23. 6. 1.
TEXT "1. Page"
POS 21. 23. 6. 1.
WRP1AR_START_PAGE:EDIT "" ""
POS 28. 23. 8. 1.
TEXT "Last Page"
POS 37. 23. 6. 1.
WRP1AR_END_PAGE:EDIT "" ""
POS 50. 23. 11. 1.
CHK_WRP1A_UNLOCK:CHECKBOX "Pages unlocked" ""
POS 3. 24. 12. 1.
TEXT "WRP1BR"
POS 15. 24. 6. 1.
TEXT "1. Page"
POS 21. 24. 6. 1.
WRP1BR_START_PAGE:EDIT "" ""
POS 28. 24. 8. 1.
TEXT "Last Page"
POS 37. 24. 6. 1.
WRP1BR_END_PAGE:EDIT "" ""
POS 50. 24. 11. 1.
CHK_WRP1B_UNLOCK:CHECKBOX "Pages unlocked" ""
POS 3. 25. 12. 1.
TEXT "WRP2AR"
POS 15. 25. 6. 1.
TEXT "1. Page"
POS 21. 25. 6. 1.
WRP2AR_START_PAGE:EDIT "" ""
POS 28. 25. 8. 1.
TEXT "Last Page"
POS 37. 25. 6. 1.
WRP2AR_END_PAGE:EDIT "" ""
POS 50. 25. 12. 1.
CHK_WRP2A_UNLOCK:CHECKBOX "Pages unlocked" ""
POS 3. 26. 12. 1.
TEXT "WRP2BR"
POS 15. 26. 6. 1.
TEXT "1. Page"
POS 21. 26. 6. 1.
WRP2BR_START_PAGE:EDIT "" ""
POS 28. 26. 8. 1.
TEXT "Last Page"
POS 37. 26. 6. 1.
WRP2BR_END_PAGE:EDIT "" ""
POS 50. 26. 11. 1.
CHK_WRP2B_UNLOCK:CHECKBOX "Pages unlocked" ""
POS 3. 27. 11. 1.
TEXT "SECBB1R1"
POS 15. 27. 11. 1.
SECBB1R1: EDIT "" ""
POS 3. 28. 11. 1.
TEXT "SECBB1R2"
POS 15. 28. 11. 1.
SECBB1R2: EDIT "" ""
POS 3. 29. 11. 1.
TEXT "SECBB1R3"
POS 15. 29. 11. 1.
SECBB1R3: EDIT "" ""
POS 3. 30. 11. 1.
TEXT "SECBB1R4"
POS 15. 30. 11. 1.
SECBB1R4: EDIT "" ""
POS 3. 31. 11. 1.
TEXT "SECBB2R1"
POS 15. 31. 11. 1.
SECBB2R1: EDIT "" ""
POS 3. 32. 11. 1.
TEXT "SECBB2R2"
POS 15. 32. 11. 1.
SECBB2R2: EDIT "" ""
POS 3. 33. 11. 1.
TEXT "SECBB2R3"
POS 15. 33. 11. 1.
SECBB2R3: EDIT "" ""
POS 3. 34. 11. 1.
TEXT "SECBB2R4"
POS 15. 34. 11. 1.
SECBB2R4: EDIT "" ""
POS 28. 27. 9. 1.
TEXT "PRIV1BBR1"
POS 37. 27. 11. 1.
PRIV1BBR1: EDIT "" ""
POS 28. 28. 9. 1.
TEXT "PRIV1BBR2"
POS 37. 28. 11. 1.
PRIV1BBR2: EDIT "" ""
POS 28. 29. 9. 1.
TEXT "PRIV1BBR3"
POS 37. 29. 11. 1.
PRIV1BBR3: EDIT "" ""
POS 28. 30. 9. 1.
TEXT "PRIV1BBR4"
POS 37. 30. 11. 1.
PRIV1BBR4: EDIT "" ""
POS 28. 31. 9. 1.
TEXT "PRIV2BBR1"
POS 37. 31. 11. 1.
PRIV2BBR1: EDIT "" ""
POS 28. 32. 9. 1.
TEXT "PRIV2BBR2"
POS 37. 32. 11. 1.
PRIV2BBR2: EDIT "" ""
POS 28. 33. 9. 1.
TEXT "PRIV2BBR3"
POS 37. 33. 11. 1.
PRIV2BBR3: EDIT "" ""
POS 28. 34. 9. 1.
TEXT "PRIV2BBR4"
POS 37. 34. 11. 1.
PRIV2BBR4: EDIT "" ""
POS 50. 27. 17. 1.
CHK_HDP1_ACCDIS:CHECKBOX "Access to HDP1 area denied" ""
POS 50. 28. 17. 1.
CHK_HDP2_ACCDIS:CHECKBOX "Access to HDP2 area denied" ""
POS 50. 29. 22. 1.
CHK_NSPRIV: CHECKBOX "Privileged non-secure Flash register access" ""
POS 50. 30. 17. 1.
CHK_SPRIV: CHECKBOX "Privileged secure Flash register access" ""
POS 1. 36. 12. 1.5
BUTTON "Program option bytes"
(
PRIVATE &value &value2
LOCAL &progRDP_LEV &progBOR_LEV &progRST_STOP &progRST_STDBY &progRST_SHDW &progSRAM134_RST
LOCAL &progIWDG_SW &progIWDG_STOP &progIWDG_STDBY &progWWDG_SW
LOCAL &param_SWAP_BANK &progBKPRAM_ECC &progTZEN &SRAM2_ECC &SRAM3_ECC
LOCAL &progSRAM2_RST &progNSWBOOT0 &progNBOOT0 &progPA15PUPEN &progIO_VDD_HSLV &progIO_VDDIO2_HSLV
LOCAL &progNSBOOTADD0R &progNSBOOTADD1R &progSECBOOTADD0R
LOCAL &progSECWM1R1 &progSECWM1R2 &progSECWM2R1 &progSECWM2R2
LOCAL &progWRP1AR &progWRP1BR &progWRP2AR &progWRP2BR
LOCAL &progSECBB1R1 &progSECBB1R2 &progSECBB1R3 &progSECBB1R4
LOCAL &progSECBB2R1 &progSECBB2R2 &progSECBB2R3 &progSECBB2R4
LOCAL &progPRIV1BBR1 &progPRIV1BBR2 &progPRIV1BBR3 &progPRIV1BBR4
LOCAL &progPRIV2BBR1 &progPRIV2BBR2 &progPRIV2BBR3 &progPRIV2BBR4
LOCAL &progSECHDPCR &progPRIVCFGR
IF DIALOG.STRING("COMB_RDP")=="Level 0:No read protection"
&progRDP_LEV="RDP_LEV=0"
ELSE IF DIALOG.STRING("COMB_RDP")=="Level 0.5:only non-secure debug access"
&progRDP_LEV="RDP_LEV=0.5"
ELSE
&progRDP_LEV="RDP_LEV=1"
IF DIALOG.STRING("COMB_BORLEV")=="Level 4:threshold around 2.8 V"
&progBOR_LEV="BOR_LEV=4"
ELSE IF DIALOG.STRING("COMB_BORLEV")=="Level 3:threshold around 2.5 V"
&progBOR_LEV="BOR_LEV=3"
ELSE IF DIALOG.STRING("COMB_BORLEV")=="Level 2:threshold around 2.2 V"
&progBOR_LEV="BOR_LEV=2"
ELSE IF DIALOG.STRING("COMB_BORLEV")=="Level 1:threshold around 2.0 V"
&progBOR_LEV="BOR_LEV=1"
ELSE
&progBOR_LEV="BOR_LEV=0"
IF DIALOG.BOOLEAN("CHK_RST_STOP")
&progRST_STOP="NRST_STOP=0"
ELSE
&progRST_STOP="NRST_STOP=1"
IF DIALOG.BOOLEAN("CHK_RST_STDBY")
&progRST_STDBY="NRST_STDBY=0"
ELSE
&progRST_STDBY="NRST_STDBY=1"
IF DIALOG.BOOLEAN("CHK_RST_SHDW")
&progRST_SHDW="NRST_SHDW=0"
ELSE
&progRST_SHDW="NRST_SHDW=1"
IF DIALOG.BOOLEAN("CHK_SRAM134_RST")
&progSRAM134_RST="CHK_SRAM134_RST=1"
ELSE
&progSRAM134_RST="CHK_SRAM134_RST=0"
IF DIALOG.BOOLEAN("CHSB_IWDG.SW")
&progIWDG_SW="IWDG_SW=1"
ELSE
&progIWDG_SW="IWDG_SW=0"
IF DIALOG.BOOLEAN("CHK_IWDG_STOP")
&progIWDG_STOP="IWDG_STOP=0"
ELSE
&progIWDG_STOP="IWDG_STOP=1"
IF DIALOG.BOOLEAN("CHK_IWDG_STDBY")
&progIWDG_STDBY="IWDG_STDBY=0"
ELSE
&progIWDG_STDBY="IWDG_STDBY=1"
IF DIALOG.BOOLEAN("CHSB_WWDG.SW")
&progWWDG_SW="WWDG_SW=1"
ELSE
&progWWDG_SW="WWDG_SW=0"
IF DIALOG.BOOLEAN("CHK_SWAP_BANK")
&progSWAP_BANK="SWAP_BANK=1"
ELSE
&progSWAP_BANK="SWAP_BANK=0"
IF DIALOG.BOOLEAN("CHK_BKPRAM_ECC_DIS")
&progBKPRAM_ECC="BKPRAM_ECC=1"
ELSE
&progBKPRAM_ECC="BKPRAM_ECC=0"
IF DIALOG.BOOLEAN("CHK_SRAM2_ECC_CHECK_DIS")
&SRAM2_ECC="SRAM2_ECC=1"
ELSE
&SRAM2_ECC="SRAM2_ECC=0"
IF DIALOG.BOOLEAN("CHK_SRAM3_ECC_CHECK_DIS")
&SRAM3_ECC="SRAM3_ECC=1"
ELSE
&SRAM3_ECC="SRAM3_ECC=0"
IF DIALOG.BOOLEAN("CHK_RAM_ERASE")
&progSRAM2_RST="SRAM2_RST=0"
ELSE
&progSRAM2_RST="SRAM2_RST=1"
IF DIALOG.BOOLEAN("CHK_NSWBOOT0")
&progNSWBOOT0="NSWBOOT0=1"
ELSE
&progNSWBOOT0="NSWBOOT0=0"
IF DIALOG.BOOLEAN("CHK_NBOOT0")
&progNBOOT0="NBOOT0=1"
ELSE
&progNBOOT0="NBOOT0=0"
IF DIALOG.BOOLEAN("CHK_PA15PUPEN")
&progPA15PUPEN="PA15PUPEN=1"
ELSE
&progPA15PUPEN="PA15PUPEN=0"
IF DIALOG.BOOLEAN("CHK_IO_VDD_HSLV")
&progIO_VDD_HSLV="IO_VDD_HSLV=1"
ELSE
&progIO_VDD_HSLV="IO_VDD_HSLV=0"
IF DIALOG.BOOLEAN("CHK_IO_VDDIO2_HSLV")
&progIO_VDDIO2_HSLV="IO_VDDIO2_HSLV=1"
ELSE
&progIO_VDDIO2_HSLV="IO_VDDIO2_HSLV=0"
IF DIALOG.BOOLEAN("CHK_TZEN")
(
IF (&TZenabled==FALSE())
(
DIALOG.YESNO "Enable Trust Zone ?"
ENTRY &enableTZEN
IF !(&enableTZEN)
ENDDO
)
&progTZEN="TZEN=1"
)
ELSE
&progTZEN="TZEN=0"
&value=DIALOG.STRing(NSBOOTADD0R)
&progNSBOOTADD0R="NSBOOTADD0R=&value&0xFFFFFF80"
&value=DIALOG.STRing(NSBOOTADD1R)
&progNSBOOTADD1R="NSBOOTADD1R=&value&0xFFFFFF80"
&value=DIALOG.STRing(SECBOOTADD0)
&value=&value&0xFFFFFF80
&value=&value|0x7C //reserved values are Ones and mustn't be modified ! Special rule for secbootaddr programming
&progSECBOOTADD0R="SECBOOTADD0R=&value"
IF DIALOG.BOOLEAN("CHK_BOOT_LOCK")
&progSECBOOTADD0R=progSECBOOTADD0R|0x1
&value=DIALOG.STRing(SECWM1R1_START_PAGE)
&value="0x"+FORMAT.HEX(8.,&value)
&value2=DIALOG.STRing(SECWM1R1_END_PAGE)
&value2="0x"+FORMAT.HEX(4.,&value2)
&value=&value|(&value2<<16.)
&value=&value|0xFF80FF80 //reserved values are Ones and mustn't be modified ! Special rule for watermark register programming
&progSECWM1R1="SECWM1R1=&value"
&value=DIALOG.STRing(SECWM1R2_START_PAGE)
&value="0x"+FORMAT.HEX(8.,&value)
&value2=DIALOG.STRing(SECWM1R2_END_PAGE)
&value2="0x"+FORMAT.HEX(4.,&value2)
&value=&value|(&value2<<16.)
IF DIALOG.BOOLEAN("CHK_HDP1EN")
&value=&value|0x80000000
ELSE
&value=&value&~0x80000000
IF DIALOG.BOOLEAN("CHK_PCROP1EN")
&value=&value|0x8000
ELSE
&value=&value&~0x8000
&value=&value|0x7F807F80
&progSECWM1R2="SECWM1R2=&value"
&value=DIALOG.STRing(SECWM2R1_START_PAGE)
&value="0x"+FORMAT.HEX(8.,&value)
&value2=DIALOG.STRing(SECWM2R1_END_PAGE)
&value2="0x"+FORMAT.HEX(4.,&value2)
&value=&value|(&value2<<16.)
&value=&value|0xFF80FF80
&progSECWM2R1="SECWM2R1=&value"
&value=DIALOG.STRing(SECWM2R2_START_PAGE)
&value="0x"+FORMAT.HEX(8.,&value)
&value2=DIALOG.STRing(SECWM2R2_END_PAGE)
&value2="0x"+FORMAT.HEX(4.,&value2)
&value=&value|(&value2<<16.)
IF DIALOG.BOOLEAN("CHK_HDP2EN")
&value=&value|0x80000000
ELSE
&value=&value&~0x80000000
IF DIALOG.BOOLEAN("CHK_PCROP2EN")
&value=&value|0x8000
ELSE
&value=&value&~0x8000
&value=&value|0x7F807F80
&progSECWM2R2="SECWM2R2=&value"
&value=DIALOG.STRing(WRP1AR_START_PAGE)
&value="0x"+FORMAT.HEX(8.,&value)
&value2=DIALOG.STRing(WRP1AR_END_PAGE)
&value2="0x"+FORMAT.HEX(4.,&value2)
&value=&value|(&value2<<16.)
IF DIALOG.BOOLEAN("CHK_WRP1A_UNLOCK")
&value=&value|0x80000000
ELSE
&value=&value&~0x80000000
&progWRP1AR="WRP1AR=&value"
&value=DIALOG.STRing(WRP1BR_START_PAGE)
&value="0x"+FORMAT.HEX(8.,&value)
&value2=DIALOG.STRing(WRP1BR_END_PAGE)
&value2="0x"+FORMAT.HEX(4.,&value2)
&value=&value|(&value2<<16.)
IF DIALOG.BOOLEAN("CHK_WRP1B_UNLOCK")
&value=&value|0x80000000
ELSE
&value=&value&~0x80000000
&progWRP1BR="WRP1BR=&value"
&value=DIALOG.STRing(WRP2AR_START_PAGE)
&value="0x"+FORMAT.HEX(8.,&value)
&value2=DIALOG.STRing(WRP2AR_END_PAGE)
&value2="0x"+FORMAT.HEX(4.,&value2)
&value=&value|(&value2<<16.)
IF DIALOG.BOOLEAN("CHK_WRP2A_UNLOCK")
&value=&value|0x80000000
ELSE
&value=&value&~0x80000000
&progWRP2AR="WRP2AR=&value"
&value=DIALOG.STRing(WRP2BR_START_PAGE)
&value="0x"+FORMAT.HEX(8.,&value)
&value2=DIALOG.STRing(WRP2BR_END_PAGE)
&value2="0x"+FORMAT.HEX(4.,&value2)
&value=&value|(&value2<<16.)
IF DIALOG.BOOLEAN("CHK_WRP2B_UNLOCK")
&value=&value|0x80000000
ELSE
&value=&value&~0x80000000
&progWRP2BR="WRP2BR=&value"
&value=DIALOG.STRing(SECBB1R1)
&progSECBB1R1="SECBB1R1=&value"
&value=DIALOG.STRing(SECBB1R2)
&progSECBB1R2="SECBB1R2=&value"
&value=DIALOG.STRing(SECBB1R3)
&progSECBB1R3="SECBB1R3=&value"
&value=DIALOG.STRing(SECBB1R4)
&progSECBB1R4="SECBB1R4=&value"
&value=DIALOG.STRing(SECBB2R1)
&progSECBB2R1="SECBB2R1=&value"
&value=DIALOG.STRing(SECBB1R2)
&progSECBB1R2="SECBB1R2=&value"
&value=DIALOG.STRing(SECBB2R2)
&progSECBB2R2="SECBB2R2=&value"
&value=DIALOG.STRing(SECBB2R3)
&progSECBB2R3="SECBB2R3=&value"
&value=DIALOG.STRing(SECBB2R4)
&progSECBB2R4="SECBB2R4=&value"
&value=DIALOG.STRing(PRIV1BBR1)
&progPRIV1BBR1="PRIV1BBR1=&value"
&value=DIALOG.STRing(PRIV1BBR2)
&progPRIV1BBR2="PRIV1BBR2=&value"
&value=DIALOG.STRing(PRIV1BBR3)
&progPRIV1BBR3="PRIV1BBR3=&value"
&value=DIALOG.STRing(PRIV1BBR4)
&progPRIV1BBR4="PRIV1BBR4=&value"
&value=DIALOG.STRing(PRIV2BBR1)
&progPRIV2BBR1="PRIV2BBR1=&value"
&value=DIALOG.STRing(PRIV2BBR2)
&progPRIV2BBR2="PRIV2BBR2=&value"
&value=DIALOG.STRing(PRIV2BBR3)
&progPRIV2BBR3="PRIV2BBR3=&value"
&value=DIALOG.STRing(PRIV2BBR4)
&progPRIV2BBR4="PRIV2BBR4=&value"
IF DIALOG.BOOLEAN("CHK_HDP1_ACCDIS")
&value=0x1
ELSE
&value=0x0
IF DIALOG.BOOLEAN("CHK_HDP2_ACCDIS")
&value=&value|0x2
ELSE
&value=&value&~0x2
&progSECHDPCR="SECHDPCR=&value"
IF DIALOG.BOOLEAN("CHK_SPRIV")
&value=0x1
ELSE
&value=0x0
IF DIALOG.BOOLEAN("CHK_NSPRIV")
&value=&value|0x2
ELSE
&value=&value&~0x2
&progPRIVCFGR="PRIVCFGR=&value"
DO "&Script" &progRDP_LEV &progBOR_LEV &progRST_STOP &progRST_STDBY &progRST_SHDW &progSRAM134_RST &progIWDG_SW &progIWDG_STOP &progIWDG_STDBY &progWWDG_SW &progSWAP_BANK &progBKPRAM_ECC &progPA15PUPEN &progTZEN &progIO_VDD_HSLV &progIO_VDDIO2_HSLV &SRAM2_ECC &SRAM3_ECC &progSRAM2_RST &progNSWBOOT0 &progNBOOT0 &progNSBOOTADD0R &progNSBOOTADD1R &progSECBOOTADD0R &progSECWM1R1 &progSECWM1R2 &progSECWM2R1 &progSECWM2R2 &progWRP1AR &progWRP1BR &progWRP2AR &progWRP2BR &progSECBB1R1 &progSECBB1R2 &progSECBB1R3 &progSECBB1R4 &progSECBB2R1 &progSECBB2R2 &progSECBB2R3 &progSECBB2R4 &progPRIV1BBR1 &progPRIV1BBR2 &progPRIV1BBR3 &progPRIV1BBR4 &progPRIV2BBR1 &progPRIV2BBR2 &progPRIV2BBR3 &progPRIV2BBR4 &progSECHDPCR &progPRIVCFGR &progSECHDPCR &progPRIVCFG
)
POS 21. 36. 15. 1.5
BUTTON "Reload option bytes"
(
DO "&Script" RELOAD_OPTIONBYTES
)
POS 43. 36. 10. 1.5
BUTTON "Refresh"
(
DO "&Script" REFRESH
)
POS 63. 36. 10. 1.5
BUTTON "Exit" "DIALOG.END"
CLOSE "DIALOG.END"
)
GOSUB UpdateWindowFromFlashContents
ENDDO
; --------------------------------------------------------------------------------
; Read out option bytes and set dialog entries
UpdateWindowFromFlashContents:
(
GOSUB ReadOptionBytes
; Get read protection
IF ((&OPTR&0xFF)==0xAA)
DIALOG.Set COMB_RDP "Level 0:No read protection"
ELSE IF ((&OPTR&0xFF)==0x55)
DIALOG.Set COMB_RDP "Level 0.5:only non-secure debug access"
ELSE
DIALOG.Set COMB_RDP "Level 1:Read protection"
IF ((&OPTR>>8.)&0x07)==0x0
DIALOG.Set COMB_BORLEV "Level 0:threshold around 1.7 V"
ELSE IF((&OPTR>>8.)&0x07)==0x1
DIALOG.Set COMB_BORLEV "Level 1:threshold around 2.0 V"
ELSE IF ((&OPTR>>8.)&0x07)==0x2
DIALOG.Set COMB_BORLEV "Level 2:threshold around 2.2 V"
ELSE IF ((&OPTR>>8.)&0x07)==0x3
DIALOG.Set COMB_BORLEV "Level 3:threshold around 2.5 V"
ELSE IF ((&OPTR>>8.)&0x07)==0x4
DIALOG.Set COMB_BORLEV "Level 4:threshold around 2.8 V"
IF ((&OPTR>>12.)&0x1)==0x1
DIALOG.Set CHK_RST_STOP "OFF"
ELSE
DIALOG.Set CHK_RST_STOP "ON"
IF ((&OPTR>>13.)&0x1)==0x1
DIALOG.Set CHK_RST_STDBY "OFF"
ELSE
DIALOG.Set CHK_RST_STDBY "ON"
IF ((&OPTR>>14.)&0x1)==0x1
DIALOG.Set CHK_RST_SHDW "OFF"
ELSE
DIALOG.Set CHK_RST_SHDW "ON"
IF ((&OPTR>>15.)&0x1)==0x1
DIALOG.Set CHK_SRAM134_RST "OFF"
ELSE
DIALOG.Set CHK_SRAM134_RST "ON"
IF ((&OPTR>>16.)&0x1)==0x1
DIALOG.Set CHSB_IWDG.SW
ELSE
DIALOG.Set CHSB_IWDG.HW
IF ((&OPTR>>17.)&0x1)==0x1
DIALOG.Set CHK_IWDG_STOP "OFF"
ELSE
DIALOG.Set CHK_IWDG_STOP "ON"
IF ((&OPTR>>18.)&0x1)==0x1
DIALOG.Set CHK_IWDG_STDBY "OFF"
ELSE
DIALOG.Set CHK_IWDG_STDBY "ON"
IF ((&OPTR>>19.)&0x1)==0x1
DIALOG.Set CHSB_WWDG.SW
ELSE
DIALOG.Set CHSB_WWDG.HW
IF ((&OPTR>>20.)&0x1)==0x1
DIALOG.Set CHK_SWAP_BANK "ON"
ELSE
DIALOG.Set CHK_SWAP_BANK "OFF"
IF ((&OPTR>>22.)&0x1)==0x1
DIALOG.Set CHK_BKPRAM_ECC_DIS "ON"
ELSE
DIALOG.Set CHK_BKPRAM_ECC_DIS "OFF"
IF ((&OPTR>>23.)&0x1)==0x1
DIALOG.Set CHK_SRAM3_ECC_CHECK_DIS "ON"
ELSE
DIALOG.Set CHK_SRAM3_ECC_CHECK_DIS "OFF"
IF ((&OPTR>>24.)&0x1)==0x1
DIALOG.Set CHK_SRAM2_ECC_CHECK_DIS "ON"
ELSE
DIALOG.Set CHK_SRAM2_ECC_CHECK_DIS "OFF"
IF ((&OPTR>>25.)&0x1)==0x1
DIALOG.Set CHK_RAM_ERASE "OFF"
ELSE
DIALOG.Set CHK_RAM_ERASE "ON"
IF ((&OPTR>>26.)&0x1)==0x1
DIALOG.Set CHK_NSWBOOT0 "ON"
ELSE
DIALOG.Set CHK_NSWBOOT0 "OFF"
IF ((&OPTR>>27.)&0x1)==0x1
DIALOG.Set CHK_NBOOT0 "ON"
ELSE
DIALOG.Set CHK_NBOOT0 "OFF"
IF ((&OPTR>>28.)&0x1)==0x1
DIALOG.Set CHK_PA15PUPEN "ON"
ELSE
DIALOG.Set CHK_PA15PUPEN "OFF"
IF ((&OPTR>>29.)&0x1)==0x1
DIALOG.Set CHK_IO_VDD_HSLV "ON"
ELSE
DIALOG.Set CHK_IO_VDD_HSLV "OFF"
IF ((&OPTR>>30.)&0x1)==0x1
DIALOG.Set CHK_IO_VDDIO2_HSLV "ON"
ELSE
DIALOG.Set CHK_IO_VDDIO2_HSLV "OFF"
IF ((&OPTR>>31.)&0x1)==0x1
DIALOG.Set CHK_TZEN "ON"
ELSE
DIALOG.Set CHK_TZEN "OFF"
PRIVATE &value
DIALOG.Set NSBOOTADD0R "&NSBOOTADD0R"
DIALOG.Set NSBOOTADD1R "&NSBOOTADD1R"
&value=&SECBOOTADD0R&~1
DIALOG.Set SECBOOTADD0 "&value"
IF (&SECBOOTADD0R&0x1)==0x1
DIALOG.Set CHK_BOOT_LOCK "ON"
ELSE
DIALOG.Set CHK_BOOT_LOCK "OFF"
&value=FORMAT.Decimal(3.,&SECWM1R1&0x7F)+"."
DIALOG.Set SECWM1R1_START_PAGE "&value"
&value=(&SECWM1R1>>16.)&0x7F
&value=FORMAT.Decimal(3.,&value)+"."
DIALOG.Set SECWM1R1_END_PAGE "&value"
&value=FORMAT.Decimal(3.,&SECWM1R2&0x7F)+"."
DIALOG.Set SECWM1R2_START_PAGE "&value"
&value=(&SECWM1R2>>16.)&0x7F
&value=FORMAT.Decimal(3.,&value)+"."
DIALOG.Set SECWM1R2_END_PAGE "&value"
IF (&SECWM1R2&0x80000000)==0x80000000
DIALOG.Set CHK_HDP1EN "ON"
ELSE
DIALOG.Set CHK_HDP1EN "OFF"
IF (&SECWM1R2&0x8000)==0x8000
DIALOG.Set CHK_PCROP1EN "ON"
ELSE
DIALOG.Set CHK_PCROP1EN "OFF"
&value=FORMAT.Decimal(3.,&SECWM2R1&0x7F)+"."
DIALOG.Set SECWM2R1_START_PAGE "&value"
&value=(&SECWM2R1>>16.)&0x7F
&value=FORMAT.Decimal(3.,&value)+"."
DIALOG.Set SECWM2R1_END_PAGE "&value"
&value=FORMAT.Decimal(3.,&SECWM2R2&0x7F)+"."
DIALOG.Set SECWM2R2_START_PAGE "&value"
&value=(&SECWM2R2>>16.)&0x7F
&value=FORMAT.Decimal(3.,&value)+"."
DIALOG.Set SECWM2R2_END_PAGE "&value"
IF (&SECWM2R2&0x80000000)==0x80000000
DIALOG.Set CHK_HDP2EN "ON"
ELSE
DIALOG.Set CHK_HDP2EN "OFF"
IF (&SECWM2R2&0x8000)==0x8000
DIALOG.Set CHK_PCROP2EN "ON"
ELSE
DIALOG.Set CHK_PCROP2EN "OFF"
&value=FORMAT.Decimal(3.,&WRP1AR&0x7F)+"."
DIALOG.Set WRP1AR_START_PAGE "&value"
&value=(&WRP1AR>>16.)&0x7F
&value=FORMAT.Decimal(3.,&value)+"."
DIALOG.Set WRP1AR_END_PAGE "&value"
IF (&WRP1AR&0x80000000)==0x80000000
DIALOG.Set CHK_WRP1A_UNLOCK "ON"
ELSE
DIALOG.Set CHK_WRP1A_UNLOCK "OFF"
&value=FORMAT.Decimal(3.,&WRP1BR&0x7F)+"."
DIALOG.Set WRP1BR_START_PAGE "&value"
&value=(&WRP1BR>>16.)&0x7F
&value=FORMAT.Decimal(3.,&value)+"."
DIALOG.Set WRP1BR_END_PAGE "&value"
IF (&WRP1BR&0x80000000)==0x80000000
DIALOG.Set CHK_WRP1B_UNLOCK "ON"
ELSE
DIALOG.Set CHK_WRP1B_UNLOCK "OFF"
&value=FORMAT.Decimal(3.,&WRP2AR&0x7F)+"."
DIALOG.Set WRP2AR_START_PAGE "&value"
&value=(&WRP2AR>>16.)&0x7F
&value=FORMAT.Decimal(3.,&value)+"."
DIALOG.Set WRP2AR_END_PAGE "&value"
IF (&WRP2AR&0x80000000)==0x80000000
DIALOG.Set CHK_WRP2A_UNLOCK "ON"
ELSE
DIALOG.Set CHK_WRP2A_UNLOCK "OFF"
&value=FORMAT.Decimal(3.,&WRP2BR&0x7F)+"."
DIALOG.Set WRP2BR_START_PAGE "&value"
&value=(&WRP2BR>>16.)&0x7F
&value=FORMAT.Decimal(3.,&value)+"."
DIALOG.Set WRP2BR_END_PAGE "&value"
IF (&WRP2BR&0x80000000)==0x80000000
DIALOG.Set CHK_WRP2B_UNLOCK "ON"
ELSE
DIALOG.Set CHK_WRP2B_UNLOCK "OFF"
IF (&SECHDPCR&0x1)==0x1
DIALOG.Set CHK_HDP1_ACCDIS "ON"
ELSE
DIALOG.Set CHK_HDP1_ACCDIS "OFF"
IF (&SECHDPCR&0x2)==0x2
DIALOG.Set CHK_HDP2_ACCDIS "ON"
ELSE
DIALOG.Set CHK_HDP2_ACCDIS "OFF"
IF (&PRIVCFGR&0x1)==0x1
DIALOG.Set CHK_SPRIV "ON"
ELSE
DIALOG.Set CHK_SPRIV "OFF"
IF (&PRIVCFGR&0x2)==0x2
DIALOG.Set CHK_NSPRIV "ON"
ELSE
DIALOG.Set CHK_NSPRIV "OFF"
DIALOG.Set SECBB1R1 "&SECBB1R1"
DIALOG.Set SECBB1R2 "&SECBB1R2"
DIALOG.Set SECBB1R3 "&SECBB1R3"
DIALOG.Set SECBB1R4 "&SECBB1R4"
DIALOG.Set SECBB2R1 "&SECBB2R1"
DIALOG.Set SECBB2R2 "&SECBB2R2"
DIALOG.Set SECBB2R3 "&SECBB2R3"
DIALOG.Set SECBB2R4 "&SECBB2R4"
DIALOG.Set PRIV1BBR1 "&PRIV1BBR1"
DIALOG.Set PRIV1BBR2 "&PRIV1BBR2"
DIALOG.Set PRIV1BBR3 "&PRIV1BBR3"
DIALOG.Set PRIV1BBR4 "&PRIV1BBR4"
DIALOG.Set PRIV2BBR1 "&PRIV2BBR1"
DIALOG.Set PRIV2BBR2 "&PRIV2BBR2"
DIALOG.Set PRIV2BBR3 "&PRIV2BBR3"
DIALOG.Set PRIV2BBR4 "&PRIV2BBR4"
IF ((Data.Long(&FlashRegBase+0x40)&0x80000000)!=0x80000000)
(
DIALOG.Disable SECBOOTADD0
DIALOG.Disable CHK_BOOT_LOCK
DIALOG.Disable SECWM1R1_START_PAGE
DIALOG.Disable SECWM1R1_END_PAGE
DIALOG.Disable SECWM1R2_START_PAGE
DIALOG.Disable SECWM1R2_END_PAGE
DIALOG.Disable CHK_HDP1EN
DIALOG.Disable CHK_PCROP1EN
DIALOG.Disable SECWM2R1_START_PAGE
DIALOG.Disable SECWM2R1_END_PAGE
DIALOG.Disable SECWM2R2_START_PAGE
DIALOG.Disable SECWM2R2_END_PAGE
DIALOG.Disable CHK_HDP2EN
DIALOG.Disable CHK_PCROP2EN
DIALOG.Disable SECBB1R1
DIALOG.Disable SECBB1R2
DIALOG.Disable SECBB1R3
DIALOG.Disable SECBB1R4
DIALOG.Disable SECBB2R1
DIALOG.Disable SECBB2R2
DIALOG.Disable SECBB2R3
DIALOG.Disable SECBB2R4
DIALOG.Disable CHK_HDP1_ACCDIS
DIALOG.Disable CHK_HDP2_ACCDIS
DIALOG.Disable CHK_SPRIV
)
ELSE
(
DIALOG.Enable SECBOOTADD0
DIALOG.Enable CHK_BOOT_LOCK
DIALOG.Enable SECWM1R1_START_PAGE
DIALOG.Enable SECWM1R1_END_PAGE
DIALOG.Enable SECWM1R2_START_PAGE
DIALOG.Enable SECWM1R2_END_PAGE
DIALOG.Enable CHK_HDP1EN
DIALOG.Enable CHK_PCROP1EN
DIALOG.Enable SECWM2R1_START_PAGE
DIALOG.Enable SECWM2R1_END_PAGE
DIALOG.Enable SECWM2R2_START_PAGE
DIALOG.Enable SECWM2R2_END_PAGE
DIALOG.Enable CHK_HDP2EN
DIALOG.Enable CHK_PCROP2EN
DIALOG.Enable SECBB1R1
DIALOG.Enable SECBB1R2
DIALOG.Enable SECBB1R3
DIALOG.Enable SECBB1R4
DIALOG.Enable SECBB2R1
DIALOG.Enable SECBB2R2
DIALOG.Enable SECBB2R3
DIALOG.Enable SECBB2R4
DIALOG.Enable CHK_HDP1_ACCDIS
DIALOG.Enable CHK_HDP2_ACCDIS
DIALOG.Enable CHK_SPRIV
)
RETURN
)
; --------------------------------------------------------------------------------
; Activate programmed flash settings by resetting device
ActivateFlashSettings:
(
PRIVATE &cr &optlocked
; Athorize flash programming
&cr=Data.Long(&FlashRegBase+0x28)
; Unlock the Flash Program Erase controller
IF ((&cr&0x80000000)==0x80000000)
(
Data.Set &FlashRegBase+0x08 %Long 0x45670123 // FLASH->KEYR = FLASH_KEY1;
Data.Set &FlashRegBase+0x08 %Long 0xCDEF89AB // FLASH->KEYR = FLASH_KEY2;
)
; Authorize option byte programming
IF ((&cr&0x40000000)==0x40000000)
(
Data.Set &FlashRegBase+0x10 %Long 0x08192A3B // FLASH->OPTKEYR = FLASH_KEY1;
Data.Set &FlashRegBase+0x10 %Long 0x4C5D6E7F // FLASH->OPTKEYR = FLASH_KEY2;
)
&optlocked=Data.Long(&FlashRegBase+0x28)&0x40000000 // locked = FLASH->OTPCR & OPT_LOCK
IF &optlocked==0x40000000
(
PRINT %ERROR "Cannot unlock option byte programming!"
RETURN
)
; Set OBL_LAUNCH to power down core (necessary for loading option bytes into Flash registers)
ON.ERROR CONTINUE
Data.Set &FlashRegBase+0x28 %Long &cr|(1.<<27.)
ON.ERROR
WAIT 0.1s
IF (SYStem.UP())
BREAK
ELSE
SYStem.UP
RETURN
)
; --------------------------------------------------------------------------------
; Read option byte values out of flash
ReadOptionBytes:
(
&OPTR=Data.Long(&FlashRegBase+0x40)
&NSBOOTADD0R=Data.Long(&FlashRegBase+0x44)
&NSBOOTADD1R=Data.Long(&FlashRegBase+0x48)
&SECBOOTADD0R=Data.Long(&FlashRegBase+0x4C)
&SECWM1R1=Data.Long(&FlashRegBase+0x50)
&SECWM1R2=Data.Long(&FlashRegBase+0x54)
&SECWM2R1=Data.Long(&FlashRegBase+0x60)
&SECWM2R2=Data.Long(&FlashRegBase+0x64)
&WRP1AR=Data.Long(&FlashRegBase+0x58)
&WRP1BR=Data.Long(&FlashRegBase+0x5C)
&WRP2AR=Data.Long(&FlashRegBase+0x68)
&WRP2BR=Data.Long(&FlashRegBase+0x6C)
&SECBB1R1=Data.Long(&FlashRegBase+0x80)
&SECBB1R2=Data.Long(&FlashRegBase+0x84)
&SECBB1R3=Data.Long(&FlashRegBase+0x88)
&SECBB1R4=Data.Long(&FlashRegBase+0x8C)
&SECBB2R1=Data.Long(&FlashRegBase+0xA0)
&SECBB2R2=Data.Long(&FlashRegBase+0xA4)
&SECBB2R3=Data.Long(&FlashRegBase+0xA8)
&SECBB2R4=Data.Long(&FlashRegBase+0xAC)
&PRIV1BBR1=Data.Long(&FlashRegBase+0xD0)
&PRIV1BBR2=Data.Long(&FlashRegBase+0xD4)
&PRIV1BBR3=Data.Long(&FlashRegBase+0xD8)
&PRIV1BBR4=Data.Long(&FlashRegBase+0xDC)
&PRIV2BBR1=Data.Long(&FlashRegBase+0xF0)
&PRIV2BBR2=Data.Long(&FlashRegBase+0xF4)
&PRIV2BBR3=Data.Long(&FlashRegBase+0xF8)
&PRIV2BBR4=Data.Long(&FlashRegBase+0xFC)
&SECHDPCR=Data.Long(&FlashRegBase+0xC0)
&PRIVCFGR=Data.Long(&FlashRegBase+0xC4)
RETURN
)
; --------------------------------------------------------------------------------
; Program option bytes
ProgramOptionBytes:
(
PRIVATE &cr
; Clear All pending flags in FLASH->SR
Data.Set &FlashRegBase+0x20 %Long 0x000020FB
; Wait for last operation to be completed
IF (Data.Long(&FlashRegBase+0x20)&0x00010000)==0x00010000
(
PRINT %ERROR "Flash memory interface busy, operation aborted"
RETURN
)
; Athorize flash programming
&cr=Data.Long(&FlashRegBase+0x28)
; Unlock the Flash Program Erase controller
IF ((&cr&0x80000000)==0x80000000)
(
Data.Set &FlashRegBase+0x08 %Long 0x45670123 // FLASH->KEYR = FLASH_KEY1;
Data.Set &FlashRegBase+0x08 %Long 0xCDEF89AB // FLASH->KEYR = FLASH_KEY2;
)
; Authorize option byte programming
IF ((&cr&0x40000000)==0x40000000)
(
Data.Set &FlashRegBase+0x10 %Long 0x08192A3B // FLASH->OPTKEYR = FLASH_KEY1;
Data.Set &FlashRegBase+0x10 %Long 0x4C5D6E7F // FLASH->OPTKEYR = FLASH_KEY2;
)
&optlocked=Data.Long(&FlashRegBase+0x28)&0x40000000 // locked = FLASH->OTPCR & OPT_LOCK
IF &optlocked==0x40000000
(
PRINT %ERROR "Cannot unlock option byte programming!"
RETURN
)
IF ((&OPTR&0xFF)==0xCC)
(
PRINT "Option byte programming aborted,because RDP_LEV=0xCC will disable further debugging"
PRINT "Disabling JTAG won't be reversible"
Data.Set &FlashRegBase+0x28 %Long &cr // restore FLASH_CR register
ENDDO
)
Data.Set &FlashRegBase+0x40 %Long &OPTR
Data.Set &FlashRegBase+0x44 %Long &NSBOOTADD0R
Data.Set &FlashRegBase+0x48 %Long &NSBOOTADD1R
Data.Set &FlashRegBase+0x4C %Long &SECBOOTADD0R
Data.Set &FlashRegBase+0x50 %Long &SECWM1R1
Data.Set &FlashRegBase+0x54 %Long &SECWM1R2
Data.Set &FlashRegBase+0x58 %Long &WRP1AR
Data.Set &FlashRegBase+0x5C %Long &WRP1BR
Data.Set &FlashRegBase+0x60 %Long &SECWM2R1
Data.Set &FlashRegBase+0x64 %Long &SECWM2R2
Data.Set &FlashRegBase+0x68 %Long &WRP2AR
Data.Set &FlashRegBase+0x6C %Long &WRP2BR
Data.Set &FlashRegBase+0x80 %Long &SECBB1R1
Data.Set &FlashRegBase+0x84 %Long &SECBB1R2
Data.Set &FlashRegBase+0x88 %Long &SECBB1R3
Data.Set &FlashRegBase+0x8C %Long &SECBB1R4
Data.Set &FlashRegBase+0xA0 %Long &SECBB2R1
Data.Set &FlashRegBase+0xA4 %Long &SECBB2R2
Data.Set &FlashRegBase+0xA8 %Long &SECBB2R3
Data.Set &FlashRegBase+0xAC %Long &SECBB2R4
Data.Set &FlashRegBase+0xD0 %Long &PRIV1BBR1
Data.Set &FlashRegBase+0xD4 %Long &PRIV1BBR2
Data.Set &FlashRegBase+0xD8 %Long &PRIV1BBR3
Data.Set &FlashRegBase+0xDC %Long &PRIV1BBR4
Data.Set &FlashRegBase+0xF0 %Long &PRIV2BBR1
Data.Set &FlashRegBase+0xF4 %Long &PRIV2BBR2
Data.Set &FlashRegBase+0xF8 %Long &PRIV2BBR3
Data.Set &FlashRegBase+0xFC %Long &PRIV2BBR4
Data.Set &FlashRegBase+0xC0 %Long &SECHDPCR
Data.Set &FlashRegBase+0xC4 %Long &PRIVCFGR
; Start option byte programming
Data.Set &FlashRegBase+0x28 %Long (&cr&~0xC0000000)|0x20000 // FLASH->CR = OPT_STRT;
; Wait for last operation to be completed */
WHILE (Data.Long(&FlashRegBase+0x20)&0x00010000)==0x00010000 // while ((FLASH->NSSR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY)
(
)
IF ((Data.Long(D:0x40022000+0x20)&0x2000)==0x2000)
PRINT "Error when programming option bytes ! Please check rules for modifying specific option bytes"
RETURN
)