Problems debugging artemis_dk with Cortex-Debug in VSCode using DAPLink/pyOCD

I am getting familiar with Ambiq apollo3 blue using the artemis_dk development board. I liked the approach taken with the artemis_dev_platform so I set that up to be my build environment. This will be really helpful down the road when I am ready to set up CI/CD.

Currently I’m trying to figure out how to debug with cortex-debug in visual studio. I’ve been using “professional” IDE’s including SES, Keil and IAR for years, but it seems like VS Code+cortex-debug is a great alternative.

Since the artemis_dk includes a DAPLink interface, I installed pyocd. I had a bit of doubt at first as far as the launch configuration, but I think I have it figured out now.

I’ll include it here just FYI:

{

// Use IntelliSense to learn about possible attributes.

// Hover to view descriptions of existing attributes.

// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387

“version”: “0.2.0”,

“configurations”: [

{

“type”: “cortex-debug”,

“request”: “launch”,

“name”: “Cortex Debug”,

“cwd”: “${workspaceRoot}/boards_sfe/common/examples/ble_freertos_tag”, // workspaceRoot refers to the VSCode root workspace

“executable”: “${workspaceRoot}/boards_sfe/common/examples/ble_freertos_tag/gcc/artemis_dk/bin/ble_freertos_tag_asb.axf”,

“serverpath”: “C:/Python37/Scripts/pyocd-gdbserver.exe”,

“servertype”: “pyocd”,

“device”: “AMA3B1KK-KBR”,

“interface”: “swd”, // or “jtag” - but usually “swd”

“serialNumber”: “”, //if you have more than one J-Link probe add the serial number here

“runToMain”: true,

“svdFile”: “AmbiqSuiteSDK/pack/SVD/apollo3.svd”,

}

]

}

One of my main points of confusion at first was where to find the elf file, but eventually I realized the axf file is elf format.

PROBLEM #1:

I’m getting so close to being able to debug but I hit a snag. The axf built in artemis_dev_platform has all the files starting at /app which is the root of the virtual file system for the docker container. When I start debugging it produces errors like this:

Launching server: “C:/Python37/Scripts/pyocd-gdbserver.exe” “–persist” “–port” “50000” “–telnet-port” “50001”

Launching GDB: “arm-none-eabi-gdb.exe” “-q” “–interpreter=mi2”

Reading symbols from D:\Flipperz\artemis_dev_docker\artemis_dev_platform\AmbiqSuiteSDK/boards_sfe/common/examples/ble_freertos_tag/gcc/artemis_dk/bin/ble_freertos_tag_asb.axf…

done.

0x00023950 in vTaskStepTick (xTicksToJump=23160) at /app/AmbiqSuiteSDK/third_party/FreeRTOSv10.1.1/Source/tasks.c:2552

Is there a good trick for getting cortex-debug to get cortex-debug to find the files through a different path?

PROBLEM #2:

Also I’m having a problem that I supect is an issue with cortex-debug and pyOCD but wondering if anyone has seen this before:

0000729:WARNING:gdb_server:pyocd-gdbserver is deprecated; please use the new combined pyocd tool.

0000902:WARNING:mbed_board:Board ID A127 is not recognized, using generic cortex_m target.

0000902:WARNING:board:Generic ‘cortex_m’ target type is selected by default; is this intentional? You will be able to debug most devices, but not program flash. To set the target type use the ‘–target’ argument or ‘target_override’ option. Use ‘pyocd list --targets’ to see available targets types.

0000902:INFO:board:Target type is cortex_m

0000933:INFO:dap:DP IDR = 0x2ba01477 (v1 rev2)

0000943:INFO:ap:AHB-AP#0 IDR = 0x24770011 (AHB-AP var1 rev2)

0000964:INFO:rom_table:AHB-AP#0 Class 0x1 ROM table #0 @ 0xe00ff000 (designer=43b part=4c4)

0000971:INFO:rom_table:[0]<e000e000:SCS-M4 class=14 designer=43b part=00c>

0000976:INFO:rom_table:[1]<e0001000:DWT class=14 designer=43b part=002>

0000981:INFO:rom_table:[2]<e0002000:FPB class=14 designer=43b part=003>

0000986:INFO:rom_table:[3]<e0000000:ITM class=14 designer=43b part=001>

0000991:INFO:rom_table:[4]<e0040000:TPIU-M4 class=9 designer=43b part=9a1 devtype=11 archid=0000 devid=ca0:0:0>

0000994:INFO:cortex_m:CPU core #0 is Cortex-M4 r0p1

0001002:INFO:cortex_m:FPU present: FPv4-SP-D16-M

0001007:INFO:dwt:4 hardware watchpoints

0001010:INFO:fpb:6 hardware breakpoints, 4 literal comparators

0001039:INFO:server:Semihost server started on port 50001 (core 0)

0001065:INFO:gdbserver:GDB server started on port 50000 (core 0)

0001149:INFO:gdbserver:One client connected!

0001202:INFO:gdbserver:Attempting to load argon

0001202:INFO:gdbserver:Attempting to load freertos

0001204:INFO:gdbserver:freertos loaded successfully

0001215:ERROR:gdbserver:Transfer failure while executing remote command ‘reset halt’: No ACK received

Traceback (most recent call last):

File “c:\python37\lib\site-packages\pyocd\probe\cmsis_dap_probe.py”, line 286, in read_ap_result_callback

return result()

File “c:\python37\lib\site-packages\pyocd\probe\pydapaccess\dap_access_cmsis_dap.py”, line 833, in read_reg_cb

res = transfer.get_result()

File “c:\python37\lib\site-packages\pyocd\probe\pydapaccess\dap_access_cmsis_dap.py”, line 143, in get_result

self.daplink.flush()

File “c:\python37\lib\site-packages\pyocd\utility\concurrency.py”, line 28, in _locking

return func(self, *args, **kwargs)

File “c:\python37\lib\site-packages\pyocd\probe\pydapaccess\dap_access_cmsis_dap.py”, line 667, in flush

self._read_packet()

File “c:\python37\lib\site-packages\pyocd\utility\concurrency.py”, line 28, in _locking

return func(self, *args, **kwargs)

File “c:\python37\lib\site-packages\pyocd\probe\pydapaccess\dap_access_cmsis_dap.py”, line 918, in _read_packet

decoded_data = cmd.decode_data(raw_data)

File “c:\python37\lib\site-packages\pyocd\probe\pydapaccess\dap_access_cmsis_dap.py”, line 451, in decode_data

data = self._decode_transfer_data(data)

File “c:\python37\lib\site-packages\pyocd\probe\pydapaccess\dap_access_cmsis_dap.py”, line 358, in _decode_transfer_data

self._check_response(data[2])

File “c:\python37\lib\site-packages\pyocd\probe\pydapaccess\dap_access_cmsis_dap.py”, line 341, in _check_response

raise DAPAccessIntf.TransferError(“No ACK received”)

pyocd.probe.pydapaccess.dap_access_api.DAPAccessIntf.TransferError: No ACK received

The above exception was the direct cause of the following exception:

Traceback (most recent call last):

File “c:\python37\lib\site-packages\pyocd\gdbserver\gdbserver.py”, line 1008, in handle_remote_command

self._command_context.process_command_line(cmd)

File “c:\python37\lib\site-packages\pyocd\commands\execution_context.py”, line 281, in process_command_line

invoc.handler(invoc)

File “c:\python37\lib\site-packages\pyocd\commands\execution_context.py”, line 352, in execute_command

cmd_object.execute()

File “c:\python37\lib\site-packages\pyocd\commands\commands.py”, line 344, in execute

self.context.target.reset_and_halt()

File “c:\python37\lib\site-packages\pyocd\core\soc_target.py”, line 219, in reset_and_halt

return self.selected_core.reset_and_halt(reset_type)

File “c:\python37\lib\site-packages\pyocd\coresight\cortex_m.py”, line 810, in reset_and_halt

if self.get_state() not in (Target.State.RESET, Target.State.RUNNING):

File “c:\python37\lib\site-packages\pyocd\coresight\cortex_m.py”, line 828, in get_state

dhcsr = self.read_memory(CortexM.DHCSR)

File “c:\python37\lib\site-packages\pyocd\coresight\cortex_m.py”, line 436, in read_memory

result = self.ap.read_memory(addr, transfer_size, now)

File “c:\python37\lib\site-packages\pyocd\utility\concurrency.py”, line 28, in _locking

return func(self, *args, **kwargs)

File “c:\python37\lib\site-packages\pyocd\coresight\ap.py”, line 883, in _read_memory

result = read_mem_cb()

File “c:\python37\lib\site-packages\pyocd\coresight\ap.py”, line 864, in read_mem_cb

res = result_cb()

File “c:\python37\lib\site-packages\pyocd\coresight\dap.py”, line 603, in read_ap_cb

result = result_cb()

File “c:\python37\lib\site-packages\pyocd\probe\cmsis_dap_probe.py”, line 288, in read_ap_result_callback

six.raise_from(self._convert_exception(error), error)

File “”, line 3, in raise_from

pyocd.core.exceptions.TransferError: No ACK received

For some reason pyOCD is having trouble communicating via DAPLink to the AMA3B1KK-KBR, do I need to provide additional parameters to pyOCD?