我编写了一个非常简单的程序来打开STM32 L-发现套件上的2个LED(GPIO端口B)。
我正在使用GNU工具链和openocd进行调试。
编译和链接都很好。我链接代码,使LMA和VMA位于RAM区域。
我在GDB-insight中打开了.elf,插入了一些断点,并使用'openocd-x64-0.7.0 -f stm32ldiscovery.cfg'
运行openocd
在gdb提示符下,我运行了以下命令:
(gdb)target remote localhost:3333
(gdb)monitor reset halt
(gdb)load
(gdb)continue
(gdb)stepi
...
字符串
Full source code and object files here
==......部分源代码......=
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'(0x0000FFFF
)设置为端口B输出寄存器(0x40020414
)...
我能够单步执行汇编指令,看到寄存器(r 0,r1...)正在更新到预期的值...
但是当我来到str r2, [r1]
和str r2, [r1]
时,它们基本上正在向外围寄存器写入新值,我发现这些外围存储器位置(0x40020400
和0x40020414
)没有更新为新值(0x55555555
和0x0000FFFF
)。
在gdb提示符下,我尝试运行monitor mdw 0x40020400
,并确认该内存位置没有新值0x55555555
。我也试过监视器mww 0x40020400 0x55555555
写内存位置,但无济于事。我也试过设置*0x40020400 = 0x55555555
,但也无济于事。
有人能帮帮我吗?是不是一些openocd/gdb的配置或设置我错了?
1条答案
按热度按时间rqqzpn5f1#
好了,找到问题了。
我没有启用GPIOB时钟。
在访问/修改GPIOB寄存器之前,我通过RCC_AHBENR寄存器启用了它,如上面的代码...现在起作用了