Post Go back to editing

ADuCM4050 Flash Erase Failing


I am developing an application for the ADuCM4050 microcontroller on a custom board in CrossCore Embedded Studio (v2.9.2), using the ICE-2000 emulator for debugging via SWD.

Initially this setup worked well. However, after some use, the board stopped allowing code to be written to flash via SWD. Whenever I try to debug or run code in CCES, the ICE-2000 is able to connect to the DAP, but the flash erase command fails. I get the following output from the debugger console:

Info : SWD IDCODE 0x6ba02477
Info : CHIPID 0x02a1
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00080020 msp: 0x20004000, semihosting
lr (/32): 0x00000000
Error: command ignored for attempted access of a protected or out of memory location)
Error: failed erasing sectors 0 to 9
Error: flash_erase returned -902

This matches the behavior seen here. Unfortunately, their suggestion of erasing over UART will not work for our board design.

We encountered a similar "bricking" issue on a different project which uses the ADuCM3029. This was resolved by using the JLink CLI to perform the following command sequence before loading code:

w4 0x40018020,0x676C7565 -> 'Write user key to FLCC_KEY, unlocking the flash

w4 0x40018008,0x7 -> Write mass erase command to FLCC_CMD

This seemed to consistently resolve the issue on that part.

So overall, three questions:

  1. Is there any understanding of what the root cause of this "bricking" behavior might be? Can the flash become persistently write protected?
  2. Is there any way to directly write ADuCM4050 memory locations using SWD via ICE-2000 (in the same manner as JLink CLI), to try this mass erase command?
  3. Is there any other way to force a mass flash erase in CCES? TCL script I can run? Note I have ADuCM4050_DFP installed (3.4.0)

Thanks for the help,

Alex Nolan

  • We resolved this issue by adding a mass erase command to the reset-init routine in the ADuCM4050 TCL script which is installed with the ADuCM4x50 Device Family Pack at:

    C:\Analog Devices\CrossCore Embedded Studio 2.9.2\ARM\packs\AnalogDevices\ADuCM4x50_DFP\3.4.0\openocd\scripts\target\aducm4x50.tcl

    Add the following commands starting at line 98:

    mww $key $user_key
    mww 0x40018008 0x7
    after 500
    puts [format "Info : FLCC_STAT 0x%08x" [memread32 0x40018000]]

    0x40018008 is the address of the FLCC_CMD register, and 0x7 is the mass erase command.