0

我编写了一个非常简单的程序来打开 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]基本上将新值写入外围寄存器时,我发现这些外围存储器位置(0x400204000x40020414)没有更新为新值(0x555555550x0000FFFF)。

在 gdb 提示符下,我尝试运行monitor mdw 0x40020400并确认此内存位置没有新值0x55555555。我也尝试过监视器mww 0x40020400 0x55555555写入内存位置但无济于事......我也尝试过设置*0x40020400 = 0x55555555但也无济于事......

谁能帮我吗?是我弄错了一些 openocd/gdb 配置或设置吗?

4

1 回答 1

0

好的,找到问题了。

我没有启用 GPIOB 时钟。

在访问/修改 GPIOB 寄存器之前,我通过 RCC_AHBENR 寄存器启用了它,如上面的代码......现在它可以工作了。

于 2014-04-15T23:46:52.967 回答