; -------------------------------------------------------------------------------- ; @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=] [NSBOOTADD1R=] [SECBOOTADD0R=] ; [SECWM1R1=] [SECWM1R2=] [SECWM2R1=] [SECWM2R2=] ; [WRP1AR=] [WRP1BR=] [WRP2AR=] [WRP2BR=] ; [SECBB1R1=] [SECBB1R2=] [SECBB1R3=] [SECBB1R4=] ; [SECBB2R1=] [SECBB2R2=] [SECBB2R3=] [SECBB2R4=] ; [SECHDPCR=] [PRIVCFGR=] ; [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= NSBOOTADD0R register ; NSBOOTADD1R= NSBOOTADD1R register ; SECBOOTADD0R= SECBOOTADD0R register ; SECWM1R1= SECWM1R1 register ; SECWM1R2= SECWM1R2 register ; SECWM2R1= SECWM2R1 register ; SECWM2R2= SECWM2R2 register ; WRP1AR= WRP1AR register ; WRP1BR= WRP1BR register ; WRP2AR= WRP2AR register ; WRP2BR= WRP2BR register ; SECBB1R1= SECBB1R1 register ; SECBB1R2= SECBB1R2 register ; SECBB1R3= SECBB1R3 register ; SECBB1R4= SECBB1R4 register ; SECBB2R1= SECBB2R1 register ; SECBB2R2= SECBB2R2 register ; SECBB2R3= SECBB2R3 register ; SECBB2R4= SECBB2R4 register ; PRIV1BBR1= PRIV1BBR1 register ; PRIV1BBR2= PRIV1BBR2 register ; PRIV1BBR3= PRIV1BBR3 register ; PRIV1BBR4= PRIV1BBR4 register ; PRIV2BBR1= PRIV2BBR1 register ; PRIV2BBR2= PRIV2BBR2 register ; PRIV2BBR3= PRIV2BBR3 register ; PRIV2BBR4= PRIV2BBR4 register ; SECHDPCR= SECHDPCR register ; PRIVCFGR= 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 ¶meters ENTRY %LINE ¶meters ; 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 "¶meters"=="" ( ; Look for any opened STM32U5 dialog windows and close them IF DIALOG.EXIST("COMB_BORLEV") DIALOG.END GOSUB OptionByteDialog ) ELSE ( PRIVATE ¶m_RDP_LEV ¶m_BOR_LEV PRIVATE ¶m_nRST_STOP ¶m_nRST_STDBY ¶m_nRST_SHDW ¶m_SRAM134_RST PRIVATE ¶m_IWDG_SW ¶m_IWDG_STOP ¶m_IWDG_STDBY ¶m_WWDG_SW ¶m_SWAP_BANK PRIVATE ¶m_BKPRAM_ECC ¶m_TZEN ¶m_IO_VDD_HSLV ¶m_IO_VDDIO2_HSLV PRIVATE ¶m_PA15PUPEN ¶m_SRAM2_ECC ¶m_SRAM3_ECC ¶m_SRAM2_RST ¶m_nSWBOOT0 ¶m_nBOOT0 PRIVATE ¶m_NSBOOTADD0R ¶m_NSBOOTADD1R ¶m_SECBOOTADD0R PRIVATE ¶m_SECWM1R1 ¶m_SECWM1R2 ¶m_SECWM2R1 ¶m_SECWM2R2 PRIVATE ¶m_WRP1AR ¶m_WRP2AR ¶m_WRP1BR ¶m_WRP2BR ¶m_SECHDPCR ¶m_PRIVCFGR PRIVATE ¶m_SECBB1R1 ¶m_SECBB1R2 ¶m_SECBB1R3 ¶m_SECBB1R4 PRIVATE ¶m_SECBB2R1 ¶m_SECBB2R2 ¶m_SECBB2R3 ¶m_SECBB2R4 PRIVATE ¶m_reloadOptionBytes &programFlash &programFlash=FALSE() ¶m_RDP_LEV=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"RDP_LEV=","") ¶m_BOR_LEV=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"BOR_LEV=","") ¶m_nRST_STOP=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"NRST_STOP=","") ¶m_nRST_STDBY=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"NRST_STDBY=","") ¶m_nRST_SHDW=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"NRST_SHDW=","") ¶m_SRAM134_RST=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SRAM134_RST=","") ¶m_IWDG_SW=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"IWDG_SW=","") ¶m_IWDG_STOP=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"IWDG_STOP=","") ¶m_IWDG_STDBY=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"IWDG_STDBY=","") ¶m_WWDG_SW=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"WWDG_SW=","") ¶m_SWAP_BANK=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SWAP_BANK=","") ¶m_BKPRAM_ECC=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"BKPRAM_ECC=","") ¶m_PA15PUPEN=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"PA15PUPEN=","") ¶m_SRAM2_ECC=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SRAM2_ECC=","") ¶m_SRAM3_ECC=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SRAM3_ECC=","") ¶m_SRAM2_RST=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SRAM2_RST=","") ¶m_nSWBOOT0=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"NSWBOOT0=","") ¶m_nBOOT0=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"NBOOT0=","") ¶m_IO_VDD_HSLV=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"IO_VDD_HSLV=","") ¶m_IO_VDDIO2_HSLV=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"IO_VDDIO2_HSLV=","") ¶m_TZEN=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"TZEN=","") ¶m_NSBOOTADD0R=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"NSBOOTADD0R=","") ¶m_NSBOOTADD1R=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"NSBOOTADD1R=","") ¶m_SECBOOTADD0R=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SECBOOTADD0R=","") ¶m_SECWM1R1=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SECWM1R1=","") ¶m_SECWM1R2=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SECWM1R2=","") ¶m_SECWM2R1=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SECWM2R1=","") ¶m_SECWM2R2=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SECWM2R2=","") ¶m_WRP1AR=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"WRP1AR=","") ¶m_WRP2AR=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"WRP2AR=","") ¶m_WRP1BR=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"WRP1BR=","") ¶m_WRP2BR=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"WRP2BR=","") ¶m_SECHDPCR=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SECHDPCR=","") ¶m_PRIVCFGR=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"PRIVCFGR=","") ¶m_SECBB1R1=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SECBB1R1=","") ¶m_SECBB1R2=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SECBB1R2=","") ¶m_SECBB1R3=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SECBB1R3=","") ¶m_SECBB1R4=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SECBB1R4=","") ¶m_SECBB2R1=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SECBB2R1=","") ¶m_SECBB2R2=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SECBB2R2=","") ¶m_SECBB2R3=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SECBB2R3=","") ¶m_SECBB2R4=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"SECBB2R4=","") ¶m_PRIV1BBR1=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"PRIV1BBR1=","") ¶m_PRIV1BBR2=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"PRIV1BBR2=","") ¶m_PRIV1BBR3=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"PRIV1BBR3=","") ¶m_PRIV1BBR4=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"PRIV1BBR4=","") ¶m_PRIV2BBR1=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"PRIV2BBR1=","") ¶m_PRIV2BBR2=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"PRIV2BBR2=","") ¶m_PRIV2BBR3=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"PRIV2BBR3=","") ¶m_PRIV2BBR4=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"PRIV2BBR4=","") ¶m_reloadOptionBytes=(STRing.SCAN(STRing.UPpeR("¶meters"),"RELOAD_OPTIONBYTES",0)!=-1) GOSUB ReadOptionBytes IF "¶m_RDP_LEV"!="" ( IF "¶m_RDP_LEV"=="1" &OPTR=&OPTR&~0xFF ELSE IF "¶m_RDP_LEV"=="0" &OPTR=(&OPTR&~0xFF)|0xAA ELSE IF "¶m_RDP_LEV"=="0.5" &OPTR=(&OPTR&~0xFF)|0x55 &programFlash=TRUE() ) IF "¶m_BOR_LEV"!="" ( &OPTR=&OPTR&~0x700 IF "¶m_BOR_LEV"=="4" &OPTR=&OPTR|0x400 ELSE IF "¶m_BOR_LEV"=="3" &OPTR=&OPTR|0x300 ELSE IF "¶m_BOR_LEV"=="2" &OPTR=&OPTR|0x200 ELSE IF "¶m_BOR_LEV"=="1" &OPTR=&OPTR|0x100 &programFlash=TRUE() ) IF "¶m_nRST_STOP"!="" ( IF "¶m_nRST_STOP"=="1" &OPTR=&OPTR|0x1000 ELSE IF "¶m_nRST_STOP"=="0" &OPTR=&OPTR&~0x1000 &programFlash=TRUE() ) IF "¶m_nRST_STDBY"!="" ( IF "¶m_nRST_STDBY"=="1" &OPTR=&OPTR|0x2000 ELSE IF "¶m_nRST_STDBY"=="0" &OPTR=&OPTR&~0x2000 &programFlash=TRUE() ) IF "¶m_nRST_SHDW"!="" ( IF "¶m_nRST_SHDW"=="1" &OPTR=&OPTR|0x4000 ELSE IF "¶m_nRST_SHDW"=="0" &OPTR=&OPTR&~0x4000 &programFlash=TRUE() ) IF "¶m_SRAM134_RST"!="" ( IF "¶m_SRAM134_RST"=="1" &OPTR=&OPTR|0x8000 ELSE IF "¶m_SRAM134_RST"=="0" &OPTR=&OPTR&~0x8000 &programFlash=TRUE() ) IF "¶m_IWDG_SW"!="" ( IF "¶m_IWDG_SW"=="1" &OPTR=&OPTR|0x10000 ELSE IF "¶m_IWDG_SW"=="0" &OPTR=&OPTR&~0x10000 &programFlash=TRUE() ) IF "¶m_IWDG_STOP"!="" ( IF "¶m_IWDG_STOP"=="1" &OPTR=&OPTR|0x20000 ELSE IF "¶m_IWDG_STOP"=="0" &OPTR=&OPTR&~0x20000 &programFlash=TRUE() ) IF "¶m_IWDG_STDBY"!="" ( IF "¶m_IWDG_STDBY"=="1" &OPTR=&OPTR|0x40000 ELSE IF "¶m_IWDG_STDBY"=="0" &OPTR=&OPTR&~0x40000 &programFlash=TRUE() ) IF "¶m_WWDG_SW"!="" ( IF "¶m_WWDG_SW"=="1" &OPTR=&OPTR|0x80000 ELSE IF "¶m_WWDG_SW"=="0" &OPTR=&OPTR&~0x80000 &programFlash=TRUE() ) IF "¶m_SWAP_BANK"!="" ( IF "¶m_SWAP_BANK"=="1" &OPTR=&OPTR|0x100000 ELSE IF "¶m_SWAP_BANK"=="0" &OPTR=&OPTR&~0x100000 &programFlash=TRUE() ) IF "¶m_BKPRAM_ECC"!="" ( IF "¶m_BKPRAM_ECC"=="1" &OPTR=&OPTR|0x400000 ELSE IF "¶m_BKPRAM_ECC"=="0" &OPTR=&OPTR&~0x400000 &programFlash=TRUE() ) IF "¶m_PA15PUPEN"!="" ( IF "¶m_PA15PUPEN"=="1" &OPTR=&OPTR|0x10000000 ELSE IF "¶m_PA15PUPEN"=="0" &OPTR=&OPTR&~0x10000000 &programFlash=TRUE() ) IF "¶m_SRAM2_ECC"!="" ( IF "¶m_SRAM2_ECC"=="1" &OPTR=&OPTR|0x1000000 ELSE IF "¶m_SRAM2_ECC"=="0" &OPTR=&OPTR&~0x1000000 &programFlash=TRUE() ) IF "¶m_SRAM3_ECC"!="" ( IF "¶m_SRAM3_ECC"=="1" &OPTR=&OPTR|0x800000 ELSE IF "¶m_SRAM3_ECC"=="0" &OPTR=&OPTR&~0x800000 &programFlash=TRUE() ) IF "¶m_SRAM2_RST"!="" ( IF "¶m_SRAM2_RST"=="1" &OPTR=&OPTR|0x2000000 ELSE IF "¶m_SRAM2_RST"=="0" &OPTR=&OPTR&~0x2000000 &programFlash=TRUE() ) IF "¶m_nSWBOOT0"!="" ( IF "¶m_nSWBOOT0"=="1" &OPTR=&OPTR|0x4000000 ELSE IF "¶m_nSWBOOT0"=="0" &OPTR=&OPTR&~0x4000000 &programFlash=TRUE() ) IF "¶m_nBOOT0"!="" ( IF "¶m_nBOOT0"=="1" &OPTR=&OPTR|0x8000000 ELSE IF "¶m_nBOOT0"=="0" &OPTR=&OPTR&~0x8000000 &programFlash=TRUE() ) IF "¶m_IO_VDD_HSLV"!="" ( IF "¶m_IO_VDD_HSLV"=="1" &OPTR=&OPTR|0x20000000 ELSE IF "¶m_IO_VDD_HSLV"=="0" &OPTR=&OPTR&~0x20000000 &programFlash=TRUE() ) IF "¶m_IO_VDDIO2_HSLV"!="" ( IF "¶m_IO_VDDIO2_HSLV"=="1" &OPTR=&OPTR|0x40000000 ELSE IF "¶m_IO_VDDIO2_HSLV"=="0" &OPTR=&OPTR&~0x40000000 &programFlash=TRUE() ) IF "¶m_PA15PUPEN"!="" ( IF "¶m_PA15PUPEN"=="1" &OPTR=&OPTR|0x10000000 ELSE IF "¶m_PA15PUPEN"=="0" &OPTR=&OPTR&~0x10000000 &programFlash=TRUE() ) IF "¶m_TZEN"!="" ( IF "¶m_TZEN"=="1" &OPTR=&OPTR|0x80000000 ELSE IF "¶m_TZEN"=="0" &OPTR=&OPTR&~0x80000000 &programFlash=TRUE() ) IF ("¶m_NSBOOTADD0R"!="") ( &NSBOOTADD0R=¶m_NSBOOTADD0R &programFlash=TRUE() ) IF ("¶m_NSBOOTADD1R"!="") ( &NSBOOTADD1R=¶m_NSBOOTADD1R &programFlash=TRUE() ) IF ("¶m_SECBOOTADD0R"!="") ( &SECBOOTADD0R=¶m_SECBOOTADD0R &programFlash=TRUE() ) IF ("¶m_SECWM1R1"!="") ( &SECWM1R1=¶m_SECWM1R1 &programFlash=TRUE() ) IF ("¶m_SECWM1R2"!="") ( &SECWM1R2=¶m_SECWM1R2 &programFlash=TRUE() ) IF ("¶m_SECWM2R1"!="") ( &SECWM2R1=¶m_SECWM2R1 &programFlash=TRUE() ) IF ("¶m_SECWM2R2"!="") ( &SECWM2R2=¶m_SECWM2R2 &programFlash=TRUE() ) IF ("¶m_WRP1AR"!="") ( &WRP1AR=¶m_WRP1AR &programFlash=TRUE() ) IF ("¶m_WRP1BR"!="") ( &WRP1BR=¶m_WRP1BR &programFlash=TRUE() ) IF ("¶m_WRP2AR"!="") ( &WRP2AR=¶m_WRP2AR &programFlash=TRUE() ) IF ("¶m_WRP2BR"!="") ( &WRP2BR=¶m_WRP2BR &programFlash=TRUE() ) IF ("¶m_SECBB1R1"!="") ( &SECBB1R1=¶m_SECBB1R1 &programFlash=TRUE() ) IF ("¶m_SECBB1R2"!="") ( &SECBB1R2=¶m_SECBB1R2 &programFlash=TRUE() ) IF ("¶m_SECBB1R3"!="") ( &SECBB1R3=¶m_SECBB1R3 &programFlash=TRUE() ) IF ("¶m_SECBB1R4"!="") ( &SECBB1R4=¶m_SECBB1R4 &programFlash=TRUE() ) IF ("¶m_SECBB2R1"!="") ( &SECBB2R1=¶m_SECBB2R1 &programFlash=TRUE() ) IF ("¶m_SECBB2R2"!="") ( &SECBB2R2=¶m_SECBB2R2 &programFlash=TRUE() ) IF ("¶m_SECBB2R3"!="") ( &SECBB2R3=¶m_SECBB2R3 &programFlash=TRUE() ) IF ("¶m_SECBB2R4"!="") ( &SECBB2R4=¶m_SECBB2R4 &programFlash=TRUE() ) IF ("¶m_PRIV1BBR1"!="") ( &PRIV1BBR1=¶m_PRIV1BBR1 &programFlash=TRUE() ) IF ("¶m_PRIV1BBR2"!="") ( &PRIV1BBR2=¶m_PRIV1BBR2 &programFlash=TRUE() ) IF ("¶m_PRIV1BBR3"!="") ( &PRIV1BBR3=¶m_PRIV1BBR3 &programFlash=TRUE() ) IF ("¶m_PRIV1BBR4"!="") ( &PRIV1BBR4=¶m_PRIV1BBR4 &programFlash=TRUE() ) IF ("¶m_PRIV2BBR1"!="") ( &PRIV2BBR1=¶m_PRIV2BBR1 &programFlash=TRUE() ) IF ("¶m_PRIV2BBR2"!="") ( &PRIV2BBR2=¶m_PRIV2BBR2 &programFlash=TRUE() ) IF ("¶m_PRIV2BBR3"!="") ( &PRIV2BBR3=¶m_PRIV2BBR3 &programFlash=TRUE() ) IF ("¶m_PRIV2BBR4"!="") ( &PRIV2BBR4=¶m_PRIV2BBR4 &programFlash=TRUE() ) IF ("¶m_SECHDPCR"!="") ( &SECHDPCR=¶m_SECHDPCR &programFlash=TRUE() ) IF ("¶m_PRIVCFGR"!="") ( &PRIVCFGR=¶m_PRIVCFGR &programFlash=TRUE() ) ; Special script calls from dialog to refresh the dialog or activate option bytes. IF (STRing.SCAN(STRing.UPpeR("¶meters"),"REFRESH",0)!=-1) ( GOSUB UpdateWindowFromFlashContents ) ELSE IF (STRing.SCAN(STRing.UPpeR("¶meters"),"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 ¶m_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 )