使用 arm-none-eabi-gdb 和 openocd 轻松访问外围设备
Get easy access to peripherals using arm-none-eabi-gdb and openocd
我使用openocd
、arm-none-eabi-gdb
和STLinkV2-1
来调试STM32F411CE
芯片。我还使用 LL 和 CMSIS 库。问题是要检查例如的值我必须在数据表中查找特定 GPIO 端口的寄存器边界地址的引脚(例如 0x4002 0000 - 0x4002 03FF
对应 GPIOA
),然后检查我要读取的寄存器的偏移量是多少(例如 0x10
对于 GPIOx_IDR
)。然后要检查特定位,我必须在数据表中再次检查它在寄存器中的偏移量是多少,并根据十六进制值计算该位的值。所以对于 gdb
它将是:
(gdb) x 0x40020010
0x40020010: 0xa8280000
是否有更简单的方法来获取值,通过键入类似的内容:
get bit value in register GPIOA IDR
我在 openocd
数据表或互联网上找不到任何可以回答我问题的内容。
我找到了解决办法。
CMSIS
定义了所有外设,所以我们可以利用它:
- 使用
-gdwarf-4 -g3
gcc 标志编译项目以在 gdb
中使用预处理器宏
运行 gdb
:
arm-none-eabi-gdb -nw program.elf
利用 CMSIS 定义:检查例如PORTB 上的第 3 个引脚用作输入:
(gdb) p (GPIOB->IDR & GPIO_BSRR_BS_3)
我使用openocd
、arm-none-eabi-gdb
和STLinkV2-1
来调试STM32F411CE
芯片。我还使用 LL 和 CMSIS 库。问题是要检查例如的值我必须在数据表中查找特定 GPIO 端口的寄存器边界地址的引脚(例如 0x4002 0000 - 0x4002 03FF
对应 GPIOA
),然后检查我要读取的寄存器的偏移量是多少(例如 0x10
对于 GPIOx_IDR
)。然后要检查特定位,我必须在数据表中再次检查它在寄存器中的偏移量是多少,并根据十六进制值计算该位的值。所以对于 gdb
它将是:
(gdb) x 0x40020010
0x40020010: 0xa8280000
是否有更简单的方法来获取值,通过键入类似的内容:
get bit value in register GPIOA IDR
我在 openocd
数据表或互联网上找不到任何可以回答我问题的内容。
我找到了解决办法。
CMSIS
定义了所有外设,所以我们可以利用它:
- 使用
-gdwarf-4 -g3
gcc 标志编译项目以在gdb
中使用预处理器宏
运行
gdb
:arm-none-eabi-gdb -nw program.elf
利用 CMSIS 定义:检查例如PORTB 上的第 3 个引脚用作输入:
(gdb) p (GPIOB->IDR & GPIO_BSRR_BS_3)