; -------------------------------------------------------------------------------- ; @Title: AT91SAM3x Flash Dialog for programming additional NVM Flash bits. ; ; @Description: ; Supported CPU families: ; - AT91SAM3N ; - AT91SAM3S ; - AT91SAM3U ; ; @Author: WRD ; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only ; @Chip: AT91SAM3* ; -------------------------------------------------------------------------------- ; $Rev: 10516 $ ; $Id: at91sam3-nvm.cmm 10516 2022-02-02 11:39:30Z bschroefel $ ; Create LOCAL macros LOCAL &mcu LOCAL &mcu_class LOCAL &mcu_flashsize LOCAL &mcu_flashplanes LOCAL &number_lockbits LOCAL &result LOCAL &EFC0_BASE ; Flash controller EFC0 base address LOCAL &EFC1_BASE ; Flash controller EFC1 base address LOCAL &MC_FSR ; Flash Status Register value LOCAL &MC_FRR ; Flash Result Register value &EFC0_BASE="tbd" &EFC1_BASE="tbd" ; Basic checks ON ERROR GOSUB ( CONTinue RETURN ) ; Checking CPU selection &mcu=SYStem.CPU() &mcu_class=STRing.MID("&mcu",0.,8.) IF "&mcu_class"!="AT91SAM3" ( DIALOG.OK "Not an AT91SAM3 selected!" SYStem.view ENDDO ) &mcu_class=STRing.MID("&mcu",0.,9.) &mcu_flashsize=STRing.MID("&mcu",9.,1.) &mcu_flashplanes=1. IF ("&mcu_class"=="AT91SAM3S")||("&mcu_class"=="AT91SAM3N") ( &EFC0_BASE=0x400E0A00 IF &mcu_flashsize==4. ( &mcu_flashsize=256. &number_lockbits=16. ) ELSE IF &mcu_flashsize==2. ( &mcu_flashsize=128. &number_lockbits=8. ) ELSE IF &mcu_flashsize==1. ( &mcu_flashsize=64. &number_lockbits=4. ) ELSE ( DIALOG.OK "&mcu is not supported by the script" SYStem.view ENDDO ) ) ELSE IF "&mcu_class"=="AT91SAM3U" ( &EFC0_BASE=0x400E0800 &EFC1_BASE=0x400E0A00 IF &mcu_flashsize==4. ( &mcu_flashsize=256. &mcu_flashplanes=2. &number_lockbits=32. ) ELSE IF &mcu_flashsize==2. ( &mcu_flashsize=128. &number_lockbits=16. ) ELSE IF &mcu_flashsize==1. ( &mcu_flashsize=64. &number_lockbits=8. ) ELSE ( DIALOG.OK "&mcu is not supported by the script" SYStem.view ENDDO ) ) ELSE ( DIALOG.OK "&mcu is not supported by the script" SYStem.view ENDDO ) IF SYStem.MODE()<5 ( DIALOG.OK "ERROR: System is down!" ENDDO ) ; Read NVM bits to check security bit and exit if set GOSUB ExecuteFlashCommandFRR_EFC &EFC0_BASE 0x5a00000D ENTRY &MC_FRR IF (&MC_FRR&0x01)!=0 ( DIALOG.OK "Security bit is enabled! Flash content can only be erased by the external ERASE pin." ENDDO ) ; Creating the main dialog. (& afer DIALOG command must be in first column! WinPOS 50. 5. 45. 19. DIALOG.view (& HEADER "Flash settings for the &mcu" POS 1. 0. 43. 9. BOX "EEFC Sector Lock Bits" POS 3. 2. 4. 1. CHK_EFC_0x0: CHECKBOX " 0" "" POS 8. 2. 4. 1. CHK_EFC_0x1: CHECKBOX " 1" "" POS 13. 2. 4. 1. CHK_EFC_0x2: CHECKBOX " 2" "" POS 18. 2. 4. 1. CHK_EFC_0x3: CHECKBOX " 3" "" POS 23. 2. 4. 1. CHK_EFC_0x4: CHECKBOX " 4" "" POS 28. 2. 4. 1. CHK_EFC_0x5: CHECKBOX " 5" "" POS 33. 2. 4. 1. CHK_EFC_0x6: CHECKBOX " 6" "" POS 38. 2. 4. 1. CHK_EFC_0x7: CHECKBOX " 7" "" POS 3. 3. 4. 1. CHK_EFC_0x8: CHECKBOX " 8" "" POS 8. 3. 4. 1. CHK_EFC_0x9: CHECKBOX " 9" "" POS 13. 3. 4. 1. CHK_EFC_0x0A: CHECKBOX "10" "" POS 18. 3. 4. 1. CHK_EFC_0x0B: CHECKBOX "11" "" POS 23. 3. 4. 1. CHK_EFC_0x0C: CHECKBOX "12" "" POS 28. 3. 4. 1. CHK_EFC_0x0D: CHECKBOX "13" "" POS 33. 3. 4. 1. CHK_EFC_0x0E: CHECKBOX "14" "" POS 38. 3. 4. 1. CHK_EFC_0x0F: CHECKBOX "15" "" POS 3. 4. 4. 1. CHK_EFC_0x10: CHECKBOX "16" "" POS 8. 4. 4. 1. CHK_EFC_0x11: CHECKBOX "17" "" POS 13. 4. 4. 1. CHK_EFC_0x12: CHECKBOX "18" "" POS 18. 4. 4. 1. CHK_EFC_0x13: CHECKBOX "19" "" POS 23. 4. 4. 1. CHK_EFC_0x14: CHECKBOX "20" "" POS 28. 4. 4. 1. CHK_EFC_0x15: CHECKBOX "21" "" POS 33. 4. 4. 1. CHK_EFC_0x16: CHECKBOX "22" "" POS 38. 4. 4. 1. CHK_EFC_0x17: CHECKBOX "23" "" POS 3. 5. 4. 1. CHK_EFC_0x18: CHECKBOX "24" "" POS 8. 5. 4. 1. CHK_EFC_0x19: CHECKBOX "25" "" POS 13. 5. 4. 1. CHK_EFC_0x1A: CHECKBOX "26" "" POS 18. 5. 4. 1. CHK_EFC_0x1B: CHECKBOX "27" "" POS 23. 5. 4. 1. CHK_EFC_0x1C: CHECKBOX "28" "" POS 28. 5. 4. 1. CHK_EFC_0x1D: CHECKBOX "29" "" POS 33. 5. 4. 1. CHK_EFC_0x1E: CHECKBOX "30" "" POS 38. 5. 4. 1. CHK_EFC_0x1F: CHECKBOX "31" "" POS 3. 7. 9. 1. BUTTON "Select All" "GOSUB EEFCSelectAll" POS 13. 7. 9. 1. BUTTON "Unselect All" "GOSUB EEFCUnselectAll" ; GPNVM bits settings POS 1. 9. 43. 5. BOX "General Purpose NVM Bits" POS 3. 11. 10. 1. CHSB_BOOT.ROM: CHOOSEBOX "ROM Boot" "" CHSB_BOOT.FLASH: CHOOSEBOX "Flash Boot" "" POS 20. 12. 8. 1. CHSB_SEL.FLASH0: CHOOSEBOX "Flash 0" "" POS 30. 12. 8. 1. CHSB_SEL.FLASH1: CHOOSEBOX "Flash 1" "" ; Security bit POS 1. 14. 43. 4. BOX "Enable security bit and lock content" POS 3. 16. 25. 1. CHK_SEC: CHECKBOX "Enable security bit and lock content" "GOSUB EnableSecurityBit" POS 1. 18. 10. 1. BUTTON "Program" "GOSUB ProgramFlashSettings" POS 34. 18. 10. 1. BUTTON "Exit" "CONTinue" CLOSE "CONTinue" ) ON SYSDOWN GOSUB ( DIALOG.OK "System is down!" DIALOG.END END ) ; Disable/Enable the check boxes GOSUB UpdateWindowFromFlashType GOSUB UpdateWindowFlashSettings STOP DIALOG.END ENDDO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Routines for updating the window ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; UpdateWindowFromFlashType: IF &number_lockbits<=16. ( DIALOG.Disable CHK_EFC_0x10 DIALOG.Disable CHK_EFC_0x11 DIALOG.Disable CHK_EFC_0x12 DIALOG.Disable CHK_EFC_0x13 DIALOG.Disable CHK_EFC_0x14 DIALOG.Disable CHK_EFC_0x15 DIALOG.Disable CHK_EFC_0x16 DIALOG.Disable CHK_EFC_0x17 DIALOG.Disable CHK_EFC_0x18 DIALOG.Disable CHK_EFC_0x19 DIALOG.Disable CHK_EFC_0x1A DIALOG.Disable CHK_EFC_0x1B DIALOG.Disable CHK_EFC_0x1C DIALOG.Disable CHK_EFC_0x1D DIALOG.Disable CHK_EFC_0x1E DIALOG.Disable CHK_EFC_0x1F ) IF &number_lockbits<=8. ( DIALOG.Disable CHK_EFC_0x8 DIALOG.Disable CHK_EFC_0x9 DIALOG.Disable CHK_EFC_0x0A DIALOG.Disable CHK_EFC_0x0B DIALOG.Disable CHK_EFC_0x0C DIALOG.Disable CHK_EFC_0x0D DIALOG.Disable CHK_EFC_0x0E DIALOG.Disable CHK_EFC_0x0F ) IF &number_lockbits<=4. ( DIALOG.Disable CHK_EFC_0x4 DIALOG.Disable CHK_EFC_0x5 DIALOG.Disable CHK_EFC_0x6 DIALOG.Disable CHK_EFC_0x7 ) IF &mcu_flashplanes<=1. ( DIALOG.Disable CHSB_SEL.FLASH0 DIALOG.Disable CHSB_SEL.FLASH1 ) RETURN UpdateWindowFlashSettings: ; Read out Lock Bit Status EEFC and set the check boxes in the right way. GOSUB ExecuteFlashCommandFRR_EFC &EFC0_BASE 0x5a00000A ENTRY &MC_FRR IF (&MC_FRR&0x00000001)!=0 DIALOG.Set CHK_EFC_0x0 "" ELSE DIALOG.Set CHK_EFC_0x0 " " IF (&MC_FRR&0x00000002)!=0 DIALOG.Set CHK_EFC_0x1 "" ELSE DIALOG.Set CHK_EFC_0x1 " " IF (&MC_FRR&0x00000004)!=0 DIALOG.Set CHK_EFC_0x2 "" ELSE DIALOG.Set CHK_EFC_0x2 " " IF (&MC_FRR&0x00000008)!=0 DIALOG.Set CHK_EFC_0x3 "" ELSE DIALOG.Set CHK_EFC_0x3 " " IF (&MC_FRR&0x00000010)!=0 DIALOG.Set CHK_EFC_0x4 "" ELSE DIALOG.Set CHK_EFC_0x4 " " IF (&MC_FRR&0x00000020)!=0 DIALOG.Set CHK_EFC_0x5 "" ELSE DIALOG.Set CHK_EFC_0x5 " " IF (&MC_FRR&0x00000040)!=0 DIALOG.Set CHK_EFC_0x6 "" ELSE DIALOG.Set CHK_EFC_0x6 " " IF (&MC_FRR&0x00000080)!=0 DIALOG.Set CHK_EFC_0x7 "" ELSE DIALOG.Set CHK_EFC_0x7 " " IF (&MC_FRR&0x00000100)!=0 DIALOG.Set CHK_EFC_0x8 "" ELSE DIALOG.Set CHK_EFC_0x8 " " IF (&MC_FRR&0x00000200)!=0 DIALOG.Set CHK_EFC_0x9 "" ELSE DIALOG.Set CHK_EFC_0x9 " " IF (&MC_FRR&0x00000400)!=0 DIALOG.Set CHK_EFC_0x0A "" ELSE DIALOG.Set CHK_EFC_0x0A " " IF (&MC_FRR&0x00000800)!=0 DIALOG.Set CHK_EFC_0x0B "" ELSE DIALOG.Set CHK_EFC_0x0B " " IF (&MC_FRR&0x00001000)!=0 DIALOG.Set CHK_EFC_0x0C "" ELSE DIALOG.Set CHK_EFC_0x0C " " IF (&MC_FRR&0x00002000)!=0 DIALOG.Set CHK_EFC_0x0D "" ELSE DIALOG.Set CHK_EFC_0x0D " " IF (&MC_FRR&0x00004000)!=0 DIALOG.Set CHK_EFC_0x0E "" ELSE DIALOG.Set CHK_EFC_0x0E " " IF (&MC_FRR&0x00008000)!=0 DIALOG.Set CHK_EFC_0x0F "" ELSE DIALOG.Set CHK_EFC_0x0F " " IF &mcu_flashplanes>=2. ( GOSUB ExecuteFlashCommandFRR_EFC &EFC1_BASE 0x5a00000A ENTRY &MC_FRR IF (&MC_FRR&0x00000001)!=0 DIALOG.Set CHK_EFC_0x10 "" ELSE DIALOG.Set CHK_EFC_0x10 " " IF (&MC_FRR&0x00000002)!=0 DIALOG.Set CHK_EFC_0x11 "" ELSE DIALOG.Set CHK_EFC_0x11 " " IF (&MC_FRR&0x00000004)!=0 DIALOG.Set CHK_EFC_0x12 "" ELSE DIALOG.Set CHK_EFC_0x12 " " IF (&MC_FRR&0x00000008)!=0 DIALOG.Set CHK_EFC_0x13 "" ELSE DIALOG.Set CHK_EFC_0x13 " " IF (&MC_FRR&0x00000010)!=0 DIALOG.Set CHK_EFC_0x14 "" ELSE DIALOG.Set CHK_EFC_0x14 " " IF (&MC_FRR&0x00000020)!=0 DIALOG.Set CHK_EFC_0x15 "" ELSE DIALOG.Set CHK_EFC_0x15 " " IF (&MC_FRR&0x00000040)!=0 DIALOG.Set CHK_EFC_0x16 "" ELSE DIALOG.Set CHK_EFC_0x16 " " IF (&MC_FRR&0x00000080)!=0 DIALOG.Set CHK_EFC_0x17 "" ELSE DIALOG.Set CHK_EFC_0x17 " " IF (&MC_FRR&0x00000100)!=0 DIALOG.Set CHK_EFC_0x18 "" ELSE DIALOG.Set CHK_EFC_0x18 " " IF (&MC_FRR&0x00000200)!=0 DIALOG.Set CHK_EFC_0x19 "" ELSE DIALOG.Set CHK_EFC_0x19 " " IF (&MC_FRR&0x00000400)!=0 DIALOG.Set CHK_EFC_0x1A "" ELSE DIALOG.Set CHK_EFC_0x1A " " IF (&MC_FRR&0x00000800)!=0 DIALOG.Set CHK_EFC_0x1B "" ELSE DIALOG.Set CHK_EFC_0x1B " " IF (&MC_FRR&0x00001000)!=0 DIALOG.Set CHK_EFC_0x1C "" ELSE DIALOG.Set CHK_EFC_0x1C " " IF (&MC_FRR&0x00002000)!=0 DIALOG.Set CHK_EFC_0x1D "" ELSE DIALOG.Set CHK_EFC_0x1D " " IF (&MC_FRR&0x00004000)!=0 DIALOG.Set CHK_EFC_0x1E "" ELSE DIALOG.Set CHK_EFC_0x1E " " IF (&MC_FRR&0x00008000)!=0 DIALOG.Set CHK_EFC_0x1F "" ELSE DIALOG.Set CHK_EFC_0x1F " " ) ; Check the GPNVM bits in EEFC ; Read NVM bits to check security bit and exit if set GOSUB ExecuteFlashCommandFRR_EFC &EFC0_BASE 0x5a00000D ENTRY &MC_FRR IF (&MC_FRR&0x00000004)!=0 DIALOG.Set CHSB_SEL.FLASH1 ELSE DIALOG.Set CHSB_SEL.FLASH0 IF (&MC_FRR&0x00000002)!=0 DIALOG.Set CHSB_BOOT.FLASH ELSE DIALOG.Set CHSB_BOOT.ROM RETURN EEFCSelectAll: DIALOG.Set CHK_EFC_0x0 "" DIALOG.Set CHK_EFC_0x1 "" DIALOG.Set CHK_EFC_0x2 "" DIALOG.Set CHK_EFC_0x3 "" IF &number_lockbits>4. ( DIALOG.Set CHK_EFC_0x4 "" DIALOG.Set CHK_EFC_0x5 "" DIALOG.Set CHK_EFC_0x6 "" DIALOG.Set CHK_EFC_0x7 "" ) IF &number_lockbits>8. ( DIALOG.Set CHK_EFC_0x8 "" DIALOG.Set CHK_EFC_0x9 "" DIALOG.Set CHK_EFC_0x0A "" DIALOG.Set CHK_EFC_0x0B "" DIALOG.Set CHK_EFC_0x0C "" DIALOG.Set CHK_EFC_0x0D "" DIALOG.Set CHK_EFC_0x0E "" DIALOG.Set CHK_EFC_0x0F "" ) IF &number_lockbits>16. ( DIALOG.Set CHK_EFC_0x10 "" DIALOG.Set CHK_EFC_0x11 "" DIALOG.Set CHK_EFC_0x12 "" DIALOG.Set CHK_EFC_0x13 "" DIALOG.Set CHK_EFC_0x14 "" DIALOG.Set CHK_EFC_0x15 "" DIALOG.Set CHK_EFC_0x16 "" DIALOG.Set CHK_EFC_0x17 "" DIALOG.Set CHK_EFC_0x18 "" DIALOG.Set CHK_EFC_0x19 "" DIALOG.Set CHK_EFC_0x1A "" DIALOG.Set CHK_EFC_0x1B "" DIALOG.Set CHK_EFC_0x1C "" DIALOG.Set CHK_EFC_0x1D "" DIALOG.Set CHK_EFC_0x1E "" DIALOG.Set CHK_EFC_0x1F "" ) RETURN EEFCUnselectAll: DIALOG.Set CHK_EFC_0x0 " " DIALOG.Set CHK_EFC_0x1 " " DIALOG.Set CHK_EFC_0x2 " " DIALOG.Set CHK_EFC_0x3 " " IF &number_lockbits>4. ( DIALOG.Set CHK_EFC_0x4 " " DIALOG.Set CHK_EFC_0x5 " " DIALOG.Set CHK_EFC_0x6 " " DIALOG.Set CHK_EFC_0x7 " " ) IF &number_lockbits>8. ( DIALOG.Set CHK_EFC_0x8 " " DIALOG.Set CHK_EFC_0x9 " " DIALOG.Set CHK_EFC_0x0A " " DIALOG.Set CHK_EFC_0x0B " " DIALOG.Set CHK_EFC_0x0C " " DIALOG.Set CHK_EFC_0x0D " " DIALOG.Set CHK_EFC_0x0E " " DIALOG.Set CHK_EFC_0x0F " " ) IF &number_lockbits>16. ( DIALOG.Set CHK_EFC_0x10 " " DIALOG.Set CHK_EFC_0x11 " " DIALOG.Set CHK_EFC_0x12 " " DIALOG.Set CHK_EFC_0x13 " " DIALOG.Set CHK_EFC_0x14 " " DIALOG.Set CHK_EFC_0x15 " " DIALOG.Set CHK_EFC_0x16 " " DIALOG.Set CHK_EFC_0x17 " " DIALOG.Set CHK_EFC_0x18 " " DIALOG.Set CHK_EFC_0x19 " " DIALOG.Set CHK_EFC_0x1A " " DIALOG.Set CHK_EFC_0x1B " " DIALOG.Set CHK_EFC_0x1C " " DIALOG.Set CHK_EFC_0x1D " " DIALOG.Set CHK_EFC_0x1E " " DIALOG.Set CHK_EFC_0x1F " " ) RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Flash programming routine. This routine does not modify the flash content, but ; changes some flags of the Embedded Flash Controller. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ProgramFlashSettings: LOCAL &error LOCAL §orlockbit &error=0; IF DIALOG.BOOLEAN(CHK_SEC) ( DIALOG.YESNO "Do you really want to program the flash settings and enable the Security bit?" ENTRY &result ) ELSE ( DIALOG.YESNO "Do you really want to program the flash settings?" ENTRY &result ) IF !&result RETURN ; Programming the Sector protection bits. §orlockbit=0x0 WHILE §orlockbit<0x10&&§orlockbit<&number_lockbits ( LOCAL &boxid &boxid="CHK_EFC_§orlockbit" IF DIALOG.BOOLEAN(&boxid) ( GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A000000+(§orlockbit<<(5.+8.))+0x08 ENTRY &error ) ELSE ( GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A000000+(§orlockbit<<(5.+8.))+0x09 ENTRY &error ) IF &error!=0 RETURN §orlockbit=§orlockbit+0x1 ) IF &mcu_flashplanes>=2. ( §orlockbit=0x10 WHILE §orlockbit<0x20&&§orlockbit<&number_lockbits ( LOCAL &boxid &boxid="CHK_EFC_§orlockbit" IF DIALOG.BOOLEAN(&boxid) ( GOSUB ExecuteFlashCommand_EFC &EFC1_BASE 0x5A000000+((§orlockbit&0x0F)<<(5.+8.))+0x08 ENTRY &error ) ELSE ( GOSUB ExecuteFlashCommand_EFC &EFC1_BASE 0x5A000000+((§orlockbit&0x0F)<<(5.+8.))+0x09 ENTRY &error ) IF &error!=0 RETURN §orlockbit=§orlockbit+0x1 ) ) ; Programing the GPNVM bits IF &mcu_flashplanes>=2. ( IF DIALOG.BOOLEAN(CHSB_SEL.FLASH1) ( GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A00020B ENTRY &error ) ELSE ( GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A00020C ENTRY &error ) IF &error!=0 RETURN ) IF DIALOG.BOOLEAN(CHSB_BOOT.FLASH) ( GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A00010B ENTRY &error ) ELSE ( GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A00010C ENTRY &error ) IF &error!=0 RETURN IF DIALOG.BOOLEAN(CHK_SEC) ( GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A00000B ENTRY &error ; When the Security bit was successfully enabled, these script lines shouldn't ; be reached because system is going done immediately. Ensure that the dialog ; will be closed. Any modification in the flash setup is forbidden, until the ; flash was erased by the external ERASE pin. IF &error==0 ( DIALOG.END END ) ) GOSUB UpdateWindowFlashSettings RETURN ExecuteFlashCommand_EFC: ENTRY &efc_base &cmd LOCAL &error LOCAL &timer &error=0 ; Check FRDY bit in the FSR &MC_FSR=Data.Long(ASD:&efc_base+0x08) IF (&MC_FSR&0x1)==0 ( DIALOG.OK "Unexpected Error: Flash controller is busy!" &error=1 RETURN &error ) ; Write flash command Data.Set &efc_base+0x04 %Long &cmd ; Check FRDY bit in the FSR &MC_FSR=Data.Long(ASD:&efc_base+0x08) &timer=0. WHILE (&MC_FSR&0x1)==0 ( WAIT 10ms &timer=&timer+1. IF &timer>500. ; Timeout after 5 seconds ( DIALOG.OK "Timeout: Flash controller keeps busy!" &error=1 RETURN &error ) &MC_FSR=Data.Long(ASD:&efc_base+0x08) ) IF (&MC_FSR&0x4)!=0 ( DIALOG.OK "Unexpected Error: Locking region violation!" &error=1 RETURN &error ) IF (&MC_FSR&0x2)!=0 ( DIALOG.OK "INTERNAL ERROR: Bad keyword violation!" &error=1 RETURN &error ) RETURN &error ExecuteFlashCommandFRR_EFC: ENTRY &efc_base &cmd LOCAL &error LOCAL &timer &result=0 ; Check FRDY bit in the FSR &MC_FSR=Data.Long(ASD:&efc_base+0x08) IF (&MC_FSR&0x1)==0 ( DIALOG.OK "Unexpected Error: Flash controller is busy!" RETURN &result ) ; Write flash command Data.Set &efc_base+0x04 %Long &cmd ; Check FRDY bit in the FSR &MC_FSR=Data.Long(ASD:&efc_base+0x08) &timer=0. WHILE (&MC_FSR&0x1)==0 ( WAIT 10ms &timer=&timer+1. IF &timer>500. ; Timeout after 5 seconds ( DIALOG.OK "Timeout: Flash controller keeps busy!" RETURN &result ) &MC_FSR=Data.Long(ASD:&efc_base+0x08) ) IF (&MC_FSR&0x4)!=0 ( DIALOG.OK "Unexpected Error: Locking region violation!" RETURN &result ) IF (&MC_FSR&0x2)!=0 ( DIALOG.OK "INTERNAL ERROR: Bad keyword violation!" RETURN &result ) ; Read Result &MC_FRR=Data.Long(ASD:&efc_base+0x0C) &result=&MC_FRR RETURN &result EnableSecurityBit: IF DIALOG.BOOLEAN(CHK_SEC) ( DIALOG.YESNO "WARNING: Flash cannot be read or written after programming until it is erased by the external ERASE pin! Continue?" ENTRY &result IF !&result ( DIALOG.Set CHK_SEC " " ) ) RETURN