使用 JLink 和 GDB 读取 Cortex M0 MCU 的外设寄存器

Reading peripheral register of Cortex M0 MCU using JLink and GDB

我正在尝试使用 GDB 读取 MCU 的 ADC 寄存器,但我似乎无法找到它是如何完成的。

gdb 中使用 x\\10x 0x40012708 只会返回零,我尝试读取的任何内存映射外设寄存器也是如此。

这有可能吗?如果是这样,它是如何完成的?

谢谢!


我建议先验证您的设置是否正常运行。
例如,您可以尝试读取所有 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:JLinkGDBServerCL.exe -if SWD -speed 4000 -device Cortex-M0
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 命令提示符上。