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

590 lines
18 KiB
Plaintext

; --------------------------------------------------------------------------------
; @Title: Option bytes Programming script for STM32H7 drivatives
;
; @Description:
; Script Parameters:
;
; DO ~~/demo/arm/flash/stm32h7-optionbyte
; [BOR_LEV=0..3]
; [IWDG1_SW=0|1] [NRST_STOP_D1=0|1] [NRST_STDBY_D1=0|1]
; [RDP=0|1] [IWDG_FZ_STOP=0|1] [IWDG_FZ_SDBY=0|1] [IWDG_STDBY=0|1]
; [ST_RAM_SIZE=0|1] [SECURITY=0|1] [IO_HSLV=0|1] [SWAP_BANK_OPT=0|1]
; [BOOT_ADD0= <val>] [BOOT_ADD1= <val>] [PROT_AREA_END1=<val>]
; [DMEP1=0|1] [PROT_AREA_START1=<val>]
; [PROT_AREA_END2=<val>] [DMEP2=0|1]
; [PROT_AREA_START2=<val>] [SEC_AREA_END1=<val>] [DMES1=0|1]
; [SEC_AREA_START1=<val>] [SEC_AREA_END2=<val>] [DMES2=0|1]
; [SEC_AREA_START2=<val>] [WRPSn1=<val>] [WRPSn2=<val>]
; [RESETDEVICE]
;
; Program the STM32H7 option bytes according to the following parameters:
;
; BOR_LEV=0..3: Brownout level option configuration bit
; 0: BOR Level 0: Reset level is set to 1.6 V
; 1: BOR Level 1: Reset is set to 2.1 V
; 2: BOR Level 2: Reset is set to 2.4 V
; 3: BOR Level 3: Reset level is set to 2.7 V
;
; IWDG1_SW=0|1 IWDG1 control mode option configuration bit
; 0: IWDG1 watchdog is controller by hardware
; 1: IWDG1 watchdog is controlled by software
;
; NRST_STOP_D1=0|1 D1 domain DStop entry reset option status bit
; 0: A reset is generated when entering DStop mode on D1 domain
; 1: No reset generated
;
; NRST_STDBY_D1=0|1 D1 domain DStandby entry reset option status bit
; 0: A reset is generated when entering DStandby mode on D1 domain
; 1: No reset generated
;
; RDP=0|1 is programming read protection option byte
; 0: Disables flash read out protection (Level 0 : 0xAA)
; 1: Enables flash read out protection (Level 1 : 0x00)
; the script doesn't support programming Level 2, because with it no
; further debugging would be possible!
;
; IWDG_FZ_STOP=0|1 is programming IWDG_FZ_STOP bit of user option byte
; 0: Independent watchdog frozen in system Stop mode
; 1: Independent watchdog keep running in system Stop mode
;
; IWDG_FZ_SDBY=0|1 is programming IWDG_FZ_SDBY bit of user option byte
; 0: Independent watchdog counter is frozen in Standby mode
; 1: Independent watchdog counter is running in Standby mode
;
; IWDG_STDBY=0|1 is programming IWDG_STDBY bit of user option byte
;
; ST_RAM_SIZE=0..3 is programming ST RAM size
; 0: 2 Kbytes reserved to ST code
; 1: 4 Kbytes reserved to ST code
; 2: 8 Kbytes reserved to ST code
; 3: 16 Kbytes reserved to ST code
;
; SECURITY=0|1: Manage secure access mode
; 0: Security feature disabled
; 1: Security feature enabled
;
; IO_HSLV: I/O high-speed at low-voltage configuration
; 0: I/O speed optimization at low-voltage disabled
; 1: I/O speed optimization at low-voltage feature allowed
;
; SWAP_BANK_OPT: Bank swapping option
; 0: bank 1 and bank 2 not swapped
; 1: bank 1 and bank 2 swapped
;
; BOOT_ADD0= <val> MSB of the Arm Cortex-M7 boot address when
; the BOOT pin is low
; BOOT_ADD1= <val> MSB of the Arm Cortex-M7 boot address when
; the BOOT pin is high
;
; PROT_AREA_END1=<val>: Bank 1 PCROP area end offset
;
; DMEP1: Bank 1 PCROP protected erase enable bit
; 0: Bank 1 PCROP area is not erased while a protection level regression
; 1: Bank 1 PCROP area is erased while a protection level regression
;
; PROT_AREA_START1=<val>: Bank 1 PCROP area start offset
;
; PROT_AREA_END2=<val>: Bank 2 PCROP area end offset
;
; DMEP2: Bank 2 PCROP protected erase enable bit
; 0: Bank 1 PCROP area is not erased
; 1: Bank 1 PCROP area is erased
;
; PROT_AREA_START2=<val>: Bank 2 PCROP area start offset
;
; SEC_AREA_END1=<val>: Bank 1 secure-only area end offset
;
; DMES1: Bank 1 secure access protected erase enable bit
; 0: Secure access only area in bank 1 is not erased
; 1: Secure access only area in bank 1 is erased
;
; SEC_AREA_START1=<val>: Bank 1 secure-only area start offset
;
; SEC_AREA_END2=<val>: Bank 2 secure-only area end offset
;
; DMES2: Bank 2 secure access protected erase enable bit
; 0: Secure access only area in bank 2 is not erased
; 1: Secure access only area in bank 2 is erased
;
; SEC_AREA_START2=<val>: Bank 2 secure-only area start offset
;
; WRPSn1=<val>: Bank 1 sector write protection option status byte
;
; WRPSn2=<val>: Bank 2 sector write protection option status byte
;
; RESETDEVICE Activate Flash Settings
;
; @Author: NEZ
; @Copyright: (C) 1989-2023 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Rev: 12927 $
; $Id: stm32h7-optionbyte.cmm 12927 2024-01-12 11:00:05Z nzouari $
LOCAL &parameters
ENTRY %LINE &parameters
; LOCAL macros used as script global macros
LOCAL &Script
LOCAL &FlashRegBase &FlashAdressStart &FlashSize
//Option Bytes
LOCAL &OB_OPTSR_CUR &OB_OPTSR_PRG
LOCAL &OB_PRAR_CUR1 &OB_PRAR_CUR2 &OB_PRAR_PRG1 &OB_PRAR_PRG2
LOCAL &OB_SCAR_CUR1 &OB_SCAR_CUR2 &OB_SCAR_PRG1 &OB_SCAR_PRG2
LOCAL &OB_WPSN_CUR1R &OB_WPSN_CUR2R &OB_WPSN_PRG1R &OB_WPSN_PRG2R
LOCAL &OB_BOOT_CUR &OB_BOOT_PRG
LOCAL &dualbank &pcrop_granularity
&Script=OS.PPF()
&FlashRegBase="D:0x52002000"
&FlashAdressStart="0x8000000"
; Checking CPU selection
IF !CPUIS(STM32H7*)
(
SYStem.RESet
SYStem.CPU STM32H7*
)
IF !(CPUIS(STM32H742*)||CPUIS(STM32H743*)||CPUIS(STM32H753*)||CPUIS(STM32H750*))
(
PRINT %ERROR "CPU not supported by this script"
ENDDO
)
IF SYStem.MODE()<5
(
IF CABLE.TWOWIRE()
SYStem.CONFIG.DEBUGPORTTYPE SWD
SYStem.Option.ResBreak OFF
SYStem.Up
)
IF CPUIS(STM32H750*B)
(
&FlashSize=0x20000
&dualbank=FALSE()
)
ELSE IF (CPUIS(STM32H742*I)||CPUIS(STM32H743*I)||CPUIS(STM32H753*I))
(
&FlashSize=0x200000
&dualbank=TRUE()
)
ELSE IF (CPUIS(STM32H742*G)||CPUIS(STM32H743*G)||CPUIS(STM32H753*G))
(
&FlashSize=0x100000
&dualbank=TRUE()
)
&pcrop_granularity=0x100 //256Byte
; Parse script arguments
IF "&parameters"==""
(
PRINT %ERROR "Script parameters are missing. Please refer to the script's header "
ENDDO
)
ELSE
(
PRIVATE &param_BOR_LEV &param_IWDG1_SW
PRIVATE &param_NRST_STOP_D1 &param_NRST_STDBY_D1
PRIVATE &param_RDP &param_IWDG_FZ_STOP &param_IWDG_FZ_SDBY
PRIVATE &param_ST_RAM_SIZE &param_SECURITY &param_IO_HSLV
PRIVATE &param_SWAP_BANK_OPT &param_BOOT_ADD0 &param_BOOT_ADD1
PRIVATE &param_PROT_AREA_END1 &param_DMEP1 &param_PROT_AREA_START1
PRIVATE &param_PROT_AREA_END2 &param_DMEP2 &param_PROT_AREA_START2
PRIVATE &param_SEC_AREA_END1 &param_DMES1 &param_SEC_AREA_START1
PRIVATE &param_SEC_AREA_END2 &param_DMES2 &param_SEC_AREA_START2
PRIVATE &param_WRPSn1 &param_WRPSn2
PRIVATE &param_resetDevice &programFlash
&param_BOR_LEV=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"BOR_LEV=","")
&param_IWDG1_SW=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"IWDG1_SW=","")
&param_NRST_STOP_D1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"NRST_STOP_D1=","")
&param_NRST_STDBY_D1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"NRST_STDBY_D1=","")
&param_RDP=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"RDP=","")
&param_IWDG_FZ_STOP=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"IWDG_FZ_STOP=","")
&param_IWDG_FZ_SDBY=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"IWDG_FZ_SDBY=","")
&param_ST_RAM_SIZE=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"ST_RAM_SIZE=","")
&param_SECURITY=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SECURITY=","")
&param_IO_HSLV=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"IO_HSLV=","")
&param_SWAP_BANK_OPT=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SWAP_BANK_OPT=","")
&param_BOOT_ADD0=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"BOOT_ADD0=","")
&param_BOOT_ADD1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"BOOT_ADD1=","")
&param_PROT_AREA_END1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"PROT_AREA_END1=","")
&param_DMEP1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"DMEP1=","")
&param_PROT_AREA_START1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"PROT_AREA_START1=","")
&param_PROT_AREA_END2=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"PROT_AREA_END2=","")
&param_DMEP2=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"DMEP2=","")
&param_PROT_AREA_START2=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"PROT_AREA_START2=","")
&param_SEC_AREA_END1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SEC_AREA_END1=","")
&param_DMES1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"DMES1=","")
&param_SEC_AREA_START1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SEC_AREA_START1=","")
&param_SEC_AREA_END2=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SEC_AREA_END2=","")
&param_DMES2=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"DMES2=","")
&param_SEC_AREA_START2=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"SEC_AREA_START2=","")
&param_WRPSn1=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"WRPSN1=","")
&param_WRPSn2=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"WRPSN2=","")
&param_resetDevice=(STRing.SCAN(STRing.UPpeR("&parameters"),"RESETDEVICE",0)!=-1)
&programFlash=FALSE()
GOSUB ReadOptionBytes
IF "&param_BOR_LEV"=="3"
(
&OB_OPTSR_PRG=(&OB_OPTSR_CUR&0xFFFFFFF3)|(0x3<<2.)
)
ELSE IF "&param_BOR_LEV"=="2"
(
&OB_OPTSR_PRG=(&OB_OPTSR_CUR&0xFFFFFFF3)|(0x2<<2.)
)
ELSE IF "&param_BOR_LEV"=="1"
(
&OB_OPTSR_PRG=(&OB_OPTSR_CUR&0xFFFFFFF3)|(0x1<<2.)
)
ELSE IF "&param_BOR_LEV"=="0"
(
&OB_OPTSR_PRG=(&OB_OPTSR_CUR&0xFFFFFFF3)|(0x0<<2.)
)
&programFlash=TRUE()
IF "&param_IWDG1_SW"!=""
(
IF "&param_IWDG1_SW"=="1"
&OB_OPTSR_PRG=&OB_OPTSR_CUR|0x10
ELSE IF "&param_IWDG1_SW"=="0"
&OB_OPTSR_PRG=&OB_OPTSR_CUR&~0x10
&programFlash=TRUE()
)
IF "&param_NRST_STOP_D1"!=""
(
IF "&param_NRST_STOP_D1"=="1"
&OB_OPTSR_PRG=&OB_OPTSR_CUR|0x40
ELSE IF "&param_NRST_STOP_D1"=="0"
&OB_OPTSR_PRG=&OB_OPTSR_CUR&~0x40
&programFlash=TRUE()
)
IF "&param_NRST_STDBY_D1"!=""
(
IF "&param_NRST_STDBY_D1"=="1"
&OB_OPTSR_PRG=&OB_OPTSR_CUR|0x80
ELSE IF "&param_NRST_STDBY_D1"=="0"
&OB_OPTSR_PRG=&OB_OPTSR_CUR&~0x80
&programFlash=TRUE()
)
IF "&param_RDP"!=""
(
IF "&param_RDP"=="1"
&OB_OPTSR_PRG=(&OB_OPTSR_CUR&0xFFFF00FF)|(0xFF<<8.)
ELSE IF "&param_RDP"=="0"
&OB_OPTSR_PRG=(&OB_OPTSR_CUR&0xFFFF00FF)|(0xAA<<8.)
&programFlash=TRUE()
)
IF "&param_IWDG_FZ_STOP"!=""
(
IF "&param_IWDG_FZ_STOP"=="1"
&OB_OPTSR_PRG=&OB_OPTSR_CUR|0x20000
ELSE IF "&param_IWDG_FZ_STOP"=="0"
&OB_OPTSR_PRG=&OB_OPTSR_CUR&~0x20000
&programFlash=TRUE()
)
IF "&param_IWDG_FZ_SDBY"!=""
(
IF "&param_IWDG_FZ_SDBY"=="1"
&OB_OPTSR_PRG=&OB_OPTSR_CUR|0x40000
ELSE IF "&param_IWDG_FZ_SDBY"=="0"
&OB_OPTSR_PRG=&OB_OPTSR_CUR&~0x40000
&programFlash=TRUE()
)
IF "&param_ST_RAM_SIZE"=="3"
(
&OB_OPTSR_PRG=&OB_OPTSR_CUR&0xFFE7FFFF
&OB_OPTSR_PRG=&OB_OPTSR_CUR|0x000C
)
ELSE IF "&param_ST_RAM_SIZE"=="2"
(
&OB_OPTSR_PRG=&OB_OPTSR_CUR&0xFFE7FFFF
&OBH_OPTSR_PRG=&OB_OPTSR_CUR|0x0004
)
ELSE IF "&param_ST_RAM_SIZE"=="1"
(
&OB_OPTSR_PRG=&OB_OPTSR_CUR&0xFFE7FFFF
&OB_OPTSR_PRG=&OB_OPTSR_CUR|0x0001
)
ELSE IF "&param_ST_RAM_SIZE"=="0"
(
&OB_OPTSR_PRG=&OB_OPTSR_CUR&0xFFE7FFFF
&OB_OPTSR_PRG=&OB_OPTSR_CUR|0x0000
)
&programFlash=TRUE()
IF "&param_SECURITY"!=""
(
IF "&param_SECURITY"=="1"
&OB_OPTSR_PRG=&OB_OPTSR_CUR|0x200000
ELSE IF "&param_SECURITY"=="0"
&OB_OPTSR_PRG=&OB_OPTSR_CUR&~0x200000
&programFlash=TRUE()
)
IF "&param_IO_HSLV"!=""
(
IF "&param_IO_HSLV"=="1"
&OB_OPTSR_PRG=&OB_OPTSR_CUR|20000000
ELSE IF "&param_IO_HSLV"=="0"
&OB_OPTSR_PRG=&OB_OPTSR_CUR~0x20000000
&programFlash=TRUE()
)
IF "&param_SWAP_BANK_OPT"!=""
(
IF "&param_SWAP_BANK_OPT"=="1"
&OB_OPTSR_PRG=&OB_OPTSR_CUR&~0x80000000
ELSE IF "&param_SWAP_BANK_OPT"=="0"
&OB_OPTSR_PRG=&OB_OPTSR_CUR|0x80000000
&programFlash=TRUE()
)
IF ("&param_BOOT_ADD0"!="")
(
&OB_BOOT_PRG=(&OB_BOOT_CUR&0xFFFF0000)|(&param_BOOT_ADD0)
&programFlash=TRUE()
)
IF ("&param_BOOT_ADD1"!="")
(
&OB_BOOT_PRG=(&OB_BOOT_CUR&0x0000FFFF)|(&param_BOOT_ADD1<<16.)
&programFlash=TRUE()
)
IF ("&param_PROT_AREA_END1"!="")
(
&OB_PRAR_PRG1=(&OB_PRAR_CUR1&0xF000FFFF)|(&param_PROT_AREA_END1<<16.)
&programFlash=TRUE()
)
IF ("&param_PROT_AREA_START1"!="")
(
&OB_PRAR_PRG1=(&OB_PRAR_CUR1&0xFFFFF000)|(&param_PROT_AREA_START1&0xFFF)
&programFlash=TRUE()
)
IF "&param_DMEP1"!=""
(
IF "&param_DMEP1"=="1"
&OB_PRAR_PRG1=&OB_PRAR_CUR1|0x80000000
ELSE IF "&param_DMEP1"=="0"
&OB_PRAR_PRG1=&OB_PRAR_CUR1&~0x80000000
&programFlash=TRUE()
)
IF ("&param_PROT_AREA_END2"!="")
(
&OB_PRAR_PRG2=(&OB_PRAR_CUR2&0xF000FFFF)|(&param_PROT_AREA_END2<<16.)
&programFlash=TRUE()
)
IF ("&param_PROT_AREA_START2"!="")
(
&OB_PRAR_PRG2=(&OB_PRAR_CUR2&0xFFFFF000)|(&param_PROT_AREA_START2&0xFFF)
&programFlash=TRUE()
)
IF ("&param_DMEP2"!="")
(
IF "&param_DMEP2"=="1"
&OB_PRAR_PRG2=&OB_PRAR_CUR2|0x80000000
ELSE IF "&param_DMEP2"=="0"
&OB_PRAR_PRG2=&OB_PRAR_CUR2&~0x80000000
&programFlash=TRUE()
)
IF ("&param_SEC_AREA_END1"!="")
(
&OB_SCAR_PRG1=(&OB_SCAR_CUR1&0xF000FFFF)|(&param_SEC_AREA_END1<<16.)
&programFlash=TRUE()
)
IF ("&param_SEC_AREA_START1"!="")
(
&OB_SCAR_PRG1=(&OB_SCAR_CUR1&0xFFFFF000)|(&param_SEC_AREA_START1&0xFFF)
&programFlash=TRUE()
)
IF "&param_DMES1"!=""
(
IF "&param_DMES1"=="1"
&OB_SCAR_PRG1=&OB_SCAR_CUR1|0x80000000
ELSE IF "&param_DMES1"=="0"
&OB_SCAR_PRG1=&OB_SCAR_CUR1&~0x80000000
&programFlash=TRUE()
)
IF ("&param_SEC_AREA_END2"!="")
(
&OB_SCAR_PRG2=(&OB_SCAR_CUR2&0xF000FFFF)|(&param_SEC_AREA_END2<<16.)
&programFlash=TRUE()
)
IF ("&param_SEC_AREA_START2"!="")
(
&OB_SCAR_PRG2=(&OB_SCAR_CUR2&0xFFFFF000)|(&param_SEC_AREA_START2&0xFFF)
&programFlash=TRUE()
)
IF "&param_DMES2"!=""
(
IF "&param_DMES2"=="1"
&OB_SCAR_PRG2=&OB_SCAR_CUR2|0x80000000
ELSE IF "&param_DMES2"=="0"
&OB_SCAR_PRG2=&OB_SCAR_CUR2&~0x80000000
&programFlash=TRUE()
)
IF ("&param_WRPSn1"!="")
(
&OB_WPSN_PRG1R=(&OB_WPSN_CUR1R&0xFFFFFF00)|(&param_WRPSn1&0xFF)
&programFlash=TRUE()
)
IF ("&param_WRPSn2"!="")
(
&OB_WPSN_PRG2R=(&OB_WPSN_CUR2R&0xFFFFFF00)|(&param_WRPSn2&0xFF)
&programFlash=TRUE()
)
; Program option bytes into flash
IF &programFlash
(
GOSUB ProgramOptionBytes
; Reset device to activate programmed option bytes
IF &param_resetDevice
GOSUB ResetDevice
)
ELSE
(
PRINT %ERROR "Option bytes programming not yet done"
)
)
ENDDO
; --------------------------------------------------------------------------------
; Reset device
ResetDevice:
(
SYStem.Down
SYStem.Up
RETURN
)
; --------------------------------------------------------------------------------
; Read option byte values out of flash
ReadOptionBytes:
(
&OB_OPTSR_CUR=Data.Long(&FlashRegBase+0x01C)
&OB_PRAR_CUR1=Data.Long(&FlashRegBase+0x028)
&OB_PRAR_CUR2=Data.Long(&FlashRegBase+0x128)
&OB_SCAR_CUR1=Data.Long(&FlashRegBase+0x030)
&OB_SCAR_CUR2=Data.Long(&FlashRegBase+0x130)
&OB_WPSN_CUR1R=Data.Long(&FlashRegBase+0x038)
&OB_WPSN_CUR2R=Data.Long(&FlashRegBase+0x138)
&OB_BOOT_CUR=Data.Long(&FlashRegBase+0x040)
RETURN
)
; --------------------------------------------------------------------------------
; Program option bytes
ProgramOptionBytes:
(
PRIVATE &cr1 &cr2 &optcr
&cr1=Data.Long(&FlashRegBase+0xC)
&cr2=Data.Long(&FlashRegBase+0x10C)
; Unlock FLASH_CR1 Register
IF ((&cr1&0x1)==0x1)
(
Data.Set &FlashRegBase+0x004 %Long 0x45670123 // FLASH->KEYR1 = FLASH_KEY1;
Data.Set &FlashRegBase+0x004 %Long 0xCDEF89AB // FLASH->KEYR1 = FLASH_KEY2;
)
; Unlock FLASH_CR2 Register
IF ((&cr2&0x1)==0x1)
(
Data.Set &FlashRegBase+0x104 %Long 0x45670123 // FLASH->KEYR2 = FLASH_KEY1;
Data.Set &FlashRegBase+0x104 %Long 0xCDEF89AB // FLASH->KEYR2 = FLASH_KEY2;
)
; Unlock FLASH_OPTCR Register
Data.Set &FlashRegBase+0x108 %Long 0x08192A3B // FLASH->OPTKEYR = FLASH_KEY1;
Data.Set &FlashRegBase+0x108 %Long 0x4C5D6E7F // FLASH->OPTKEYR = FLASH_KEY2;
&optlocked=Data.Long(&FlashRegBase+0x018)&0x1 // locked = FLASH->OTPCR & OPTLOCK
IF (&optlocked==0x1)
(
PRINT %ERROR "Cannot unlock option byte programming!"
RETURN
)
IF (((&OB_OPTSR_CUR&0xFF00)>>8.)==0xCC)
(
PRINT "Option byte programming aborted, because RDP=0xCC will disable further debugging"
PRINT "Disabling JTAG won't be reversible"
Data.Set &FlashRegBase+0xC %Long &cr1 // restore FLASH_CR1 register
Data.Set &FlashRegBase+0x10C %Long &cr2 // restore FLASH_CR2 register
ENDDO
)
; Start option byte programming
Data.Set &FlashRegBase+0x20 %Long &OB_OPTSR_PRG
Data.Set &FlashRegBase+0x2C %Long &OB_PRAR_PRG1
Data.Set &FlashRegBase+0x12C %Long &OB_PRAR_PRG2
Data.Set &FlashRegBase+0x34 %Long &OB_SCAR_PRG1
Data.Set &FlashRegBase+0x134 %Long &OB_SCAR_PRG2
Data.Set &FlashRegBase+0x3C %Long &OB_WPSN_PRG1R
Data.Set &FlashRegBase+0x13C %Long &OB_WPSN_PRG2R
Data.Set &FlashRegBase+0x44 %Long &OB_BOOT_PRG
; Set OPTSTART bit to 1 in the FLASH_OPTCR register
&optcr=Data.Long(&FlashRegBase+0x18)
Data.Set &FlashRegBase+0x18 %Long (&optcr)|(1<<1.)
WAIT 1s
;Restore FLASH_CR1 and FLASH_CR2 registers
Data.Set &FlashRegBase+0xC %Long &cr1
Data.Set &FlashRegBase+0x10C %Long &cr2
&param_resetDevice=TRUE()
RETURN
)