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」 ( ) を設定します...0x0000FFFF
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 の構成または設定が間違っているのでしょうか?