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) を出力モード ( ) に設定し、ポート B の出力レジスタ ( ) に0x55555555「1」 ( ) を設定します...0x0000FFFF0x40020414

アセンブリ命令をステップ実行して、レジスタ (r0、r1 ...) が期待値に更新されていることを確認できました...

しかし、基本的にペリフェラル レジスタに新しい値を書き込んでいるstr r2, [r1]と に到達すると、これらのペリフェラル メモリ位置 (および) が新しい値 (および)に更新されていないことがわかりました。str r2, [r1]0x400204000x400204140x555555550x0000FFFF

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 に答える