我写了一个非常简单的程序来打开STM32L-discovery工具包上的2个LED(GPIO端口B)。
我使用GNU工具链和openocd进行调试。
编译和链接没问题。我链接了代码,使得LMA和VMA位于ram区域。
我在GDB-insight中打开了.elf,插入了一些断点并使用'openocd-x64-0.7.0 -f stm32ldiscovery.cfg'
在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输出寄存器({{1 }})...
我能够逐步完成汇编指令,看到寄存器(r0,r1 ......)正在更新为预期值......
但是当我来到0x40020414
和str r2, [r1]
基本上是将新值写入外设寄存器时,我发现这些外围存储器位置(str r2, [r1]
和0x40020400
)没有更新为新值(0x40020414
和0x55555555
)。
在gdb提示符下,我尝试运行0x0000FFFF
并确认此内存位置没有新值monitor mdw 0x40020400
。我也试过监视器0x55555555
来写内存位置,但无济于事......我也试过设置mww 0x40020400 0x55555555
但是也无济于事......
任何人都可以帮助我吗?是一些openocd / gdb配置或设置我错了吗?
答案 0 :(得分:0)
好的,发现了问题。
我没有启用GPIOB时钟。
我在访问/修改GPIOB寄存器之前通过RCC_AHBENR寄存器启用它,如上面的代码......现在它可以工作。