Reading peripheral register of Cortex M0 MCU using JLink and GDB
我正在尝试使用 GDB 读取 MCU 的 ADC 寄存器,但我似乎无法找到它是如何完成的。
在
这有可能吗?如果是这样,它是如何完成的?
谢谢!
我建议先验证您的设置是否正常运行。
例如,您可以尝试读取所有 Cortex-M0 处理器上存在的 CPUID 寄存器 - 请参阅 Cortex?-M0 DevicesGeneric 用户指南的第 4.3 节。
它位于地址 0xE000ED00,它应该包含值 0x410CC200。
如果你能读懂,这将是一个好兆头。
您可能应该先尝试使用 J-Link 命令,然后再使用 GDB-Server 和 GDB。此后,我使用 LPC1114/301 Cortex-M0 在 Olimex 板上运行了该程序。我使用的是 J-Link 软件 V5.10n 和 arm-none-eabi-gdb 版本 7.10.1.20151217-cvs,它是用于 ARM Cortex-M 处理器包的 Linaro gcc 5.2 的一部分。
使用以下选项启动 JLink.exe:
1 | jlink.exe -if SWD -speed 4000 -AutoConnect 1 -device Cortex-M0 |
您应该会看到类似以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | SEGGER J-Link Commander V5.10n (Compiled Feb 19 2016 18:39:46) DLL version V5.10n, compiled Feb 19 2016 18:39:11<br/> Connecting to J-Link via USB...O.K. Firmware: J-Link ARM V8 compiled Nov 28 2014 13:44:46 Hardware version: V8.00 S/N: [My J-Link EDU Serial Number] License(s): FlashBP, GDB OEM: SEGGER-EDU Emulator has Trace capability VTref = 3.313V Device"CORTEX-M0" selected. Found SWD-DP with ID 0x0BB11477 Found Cortex-M0 r0p0, Little endian. FPUnit: 4 code (BP) slots and 0 literal slots CoreSight components: ROMTbl 0 @ E00FF000 ROMTbl 0 [0]: FFF0F000, CID: B105E00D, PID: 000BB008 SCS ROMTbl 0 [1]: FFF02000, CID: B105E00D, PID: 000BB00A DWT ROMTbl 0 [2]: FFF03000, CID: B105E00D, PID: 000BB00B FPB Cortex-M0 identified. J-Link> |
您现在可以使用 J-Link 命令 mem32 命令读取 CPUID 寄存器,并验证 CPUID 寄存器是否包含预期值:
1 | J-Link>mem32 0xE000ED00,1 |
你应该得到:
1 | E000ED00 = 410CC200 |
如果是这种情况,我会说您的 J-Link/Cortex-M0 设置可能正常工作。我们现在可以验证 GDB Server 和 GDB 是否工作正常。
使用以下选项启动 JLinkGDBServerCL.exe:
SEGGER J-Link GDB Server V5.10n 命令行版
JLinkARM.dll V5.10n(2016 年 2 月 19 日 18:39:11 编译的 DLL)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | -----GDB Server start settings----- GDBInit file: none GDB Server Listening port: 2331 SWO raw output listening port: 2332 Terminal I/O port: 2333 Accept remote connection: localhost only Generate logfile: off Verify download: off Init regs on start: off Silent mode: off Single run mode: off Target connection timeout: 0 ms ------J-Link related settings------ J-Link Host interface: USB J-Link script: none J-Link settings file: none ------Target related settings------ Target device: Cortex-M0 Target interface: SWD Target interface speed: 4000kHz Target endian: little Connecting to J-Link... J-Link is connected. Firmware: J-Link ARM V8 compiled Nov 28 2014 13:44:46 Hardware: V8.00 S/N: [My J-Link EDU Serial Number] OEM: SEGGER-EDU Feature(s): FlashBP, GDB Checking target voltage... Target voltage: 3.31 V Listening on TCP/IP port 2331 Connecting to target...Connected to target Waiting for GDB connection... |
保持 GDB 服务器运行,并在另一个 Windows 控制台会话中启动 GDB:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | arm-none-eabi-gdb GNU gdb (GNU Tools for ARM Embedded Processors) 7.10.1.20151217-cvs Copyright (C) 2015 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type"show copying" and"show warranty" for details. This GDB was configured as"--host=i686-w64-mingw32 --target=arm-none-eabi". Type"show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type"help". Type"apropos word" to search for commands related to"word". |
我们现在可以连接到 GDB 服务器,并尝试再次显示 CPUID 寄存器的内容:
1 2 3 4 5 6 7 8 9 | (gdb) target remote localhost:2331 Remote debugging using localhost:2331 0xfffffffe in ?? () (gdb) monitor halt (gdb) monitor reset Resetting target (gdb) x/1xw 0xE000ED00 0xe000ed00: 0x410cc200 (gdb) |
如果您再次收到 0x410cc200,您的 J-Link/Cortex-m0/GDB 服务器/GDB 设置应该可以正常工作,您现在应该再次尝试使用以下命令读取您的 ADC 寄存器:
1 | x/1xw 0x40012708 |
如果您能够读取 CPUID 寄存器,但不能读取 ADC 寄存器,并且 ADC 寄存器的地址是正确的,我现在不会对此行为做出解释 - 知道确切的品牌/型号您正在使用的 MCU 当然可以提供更多帮助。
请注意,从现在开始,您应该指定 MCU 的确切型号作为 -device J-Link Commander/GDB Server 选项的参数,而不是 Cortex-M0。您可以通过输入命令获取列表?在 J-Link Commander 命令提示符上。