我编写了一个非常简单的程序来打开 STM32L 发现套件上的 2 个 LED(GPIO 端口 B)。
我正在使用 GNU 工具链和 openocd 进行调试。
编译和链接正常。我链接了代码,使 LMA 和 VMA 位于 ram 区域中。
我在 GDB-insight 中打开了 .elf,插入了一些断点并运行 openocd'openocd-x64-0.7.0 -f stm32ldiscovery.cfg'
在 gdb 提示符下,我运行了以下命令:
(gdb)target remote localhost:3333
(gdb)monitor reset halt
(gdb)load
(gdb)continue
(gdb)stepi
...
====================...部分源代码...==================== ===========
const1: .word 0x40020400 @@GPIOB base mode register
const2: .word 0x55555555
const3: .word 0x40020414 @@GPIOB base output register
const4: .word 0x0000FFFF
...
...
...
reset_handler:
ldr r0, =const2
ldr r2, [r0] @r2=const2
ldr r0, =const1
ldr r1, [r0] @r1=const1
str r2, [r1] @@set mode to output
ldr r0, =const4
ldr r2, [r0] @r2=const4
ldr r0, =const3
ldr r1, [r0] @r1=const3
str r2, [r1] @@set output register to 1
loop:
b loop
==================================================== =
基本上,我将 GPIO 端口 B ( 0x40020400
) 设置为输出模式 ( 0x55555555
),然后将 '1's ( 0x0000FFFF
) 设置为端口 B 输出寄存器 ( 0x40020414
) ...
我能够逐步完成汇编指令并看到寄存器(r0,r1 ...)正在更新为预期值......
但是当我来到str r2, [r1]
并且str r2, [r1]
基本上将新值写入外围寄存器时,我发现这些外围存储器位置(0x40020400
和0x40020414
)没有更新为新值(0x55555555
和0x0000FFFF
)。
在 gdb 提示符下,我尝试运行monitor mdw 0x40020400
并确认此内存位置没有新值0x55555555
。我也尝试过监视器mww 0x40020400 0x55555555
写入内存位置但无济于事......我也尝试过设置*0x40020400 = 0x55555555
但也无济于事......
谁能帮我吗?是我弄错了一些 openocd/gdb 配置或设置吗?