【问题标题】:OpenOCD and STM32F7 flashingOpenOCD 和 STM32F7 刷机
【发布时间】:2020-05-20 04:13:08
【问题描述】:

所以我有一个非常简单的代码来查看设备是否处于活动状态。

section .text
.weak Reset_Handler

Reset_Handler:
ldr   r0, =_estack
mov   sp, r0          /* set stack pointer */
ldr   r2, =_sdata

//
b Reset_Handler

根据数据表,闪存从 axim 总线上的 0x0800 0000 开始。这是我的链接器文件:

ENTRY(Reset_Handler)

MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20020000,   LENGTH = 368K
  ROM    (rx)    : ORIGIN = 0x08000000,   LENGTH = 2048K
}

_estack = ORIGIN(RAM)+LENGTH(RAM);


SECTIONS
{
  .text : 
  { 
    . = ALIGN(4);
    *(.text) 
    . = ALIGN(4);
  } > ROM
  
_sidata = LOADADDR(.data);

  .data :
  {
    . = ALIGN(4);
    _sdata = .;
    *(.data)
    . = ALIGN(4);
    _edata = .;
  } > RAM AT> ROM
}

这是我的符号表,看起来不错:

SYMBOL TABLE:
08000000 l    d  .text  00000000 .text
20020000 l    d  .data  00000000 .data
00000000 l    d  .ARM.attributes        00000000 .ARM.attributes
00000000 l    df *ABS*  00000000 main.o
08000018 g       *ABS*  00000000 _sidata
20020000 g       .data  00000000 _sdata
08000000 g       .text  00000000 Reset_Handler
2007c000 g       .text  00000000 _estack
20020000 g       .data  00000000 _edata

问题是,当我尝试使用 OpenOCD 写入闪存地址时,它说由于某种原因在0x1000 0000 找不到闪存库。当我运行 OpenOCD 闪存库时,它说我的闪存从 0x0 开始。当我写信给0x0 时,它会写。但是当我重置我的设备并迈出一步时,它会停止并说它现在处于硬故障模式。

Here is the datasheet, page 14 table 5.

更新

我使用 OpenOCD -> flash write_image 我已经保存了以前的固件,当我将它刷到地址0x0 时,设备再次工作。所以一定是代码的问题。

更新 2

pen On-Chip Debugger
> flash write_image erase "/home/legion/Desktop/ARM/Assembly/main.elf"
auto erase enabled
wrote 32768 bytes from file /home/legion/Desktop/ARM/Assembly/main.elf in 1.247269s (25.656 KiB/s)

> reset halt
Unable to match requested speed 2000 kHz, using 1800 kHz
Unable to match requested speed 2000 kHz, using 1800 kHz
target halted due to debug-request, current mode: Thread 
xPSR: 00000000 pc: 0xe1a0d000 msp: 0xe3a00004
> step
target halted due to single-step, current mode: Handler HardFault
xPSR: 0x01000003 pc: 0xeafffffa msp: 0xe39fffe0
halted: PC: 0xeafffffa

反汇编

08000000 <Reset_Handler>:
 8000000:       e3a00005        mov     r0, #5
 8000004:       e1a0d000        mov     sp, r0
 8000008:       e51f2000        ldr     r2, [pc, #-0]   ; 8000010 <Reset_Handler+0x10>
 800000c:       eafffffb        b       8000000 <Reset_Handler>
 8000010:       20000000        .word   0x20000000

【问题讨论】:

    标签: assembly arm openocd


    【解决方案1】:

    正在试用一个 stm32f7

    flash.ld

    MEMORY
    {
        fst : ORIGIN = 0x00200000, LENGTH = 0x1000
        rom : ORIGIN = 0x08000000, LENGTH = 0x1000
        ram : ORIGIN = 0x20000000, LENGTH = 0x1000
    }
    SECTIONS
    {
        .text : { *(.text*) } > rom
    }
    

    flash.s

    .thumb
    .thumb_func
    .global _start
    _start:
    stacktop: .word 0x20001000
    .word reset
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    
    .thumb_func
    hang:   b .
    
    .thumb_func
    reset:
        b hang
    
    arm-none-eabi-as --warn --fatal-warnings -mcpu=cortex-m0 flash.s -o flash.o
    arm-none-eabi-ld -o flash.elf -T flash.ld flash.o
    arm-none-eabi-objdump -D flash.elf > flash.list
    

    -m0 很好,如果你不想大事,可以使用 -m7。

    cat flash.list
    
    flash.elf:     file format elf32-littlearm
    
    
    Disassembly of section .text:
    
    08000000 <_start>:
     8000000:   20001000    andcs   r1, r0, r0
     8000004:   08000043    stmdaeq r0, {r0, r1, r6}
     8000008:   08000041    stmdaeq r0, {r0, r6}
     800000c:   08000041    stmdaeq r0, {r0, r6}
     8000010:   08000041    stmdaeq r0, {r0, r6}
     8000014:   08000041    stmdaeq r0, {r0, r6}
     8000018:   08000041    stmdaeq r0, {r0, r6}
     800001c:   08000041    stmdaeq r0, {r0, r6}
     8000020:   08000041    stmdaeq r0, {r0, r6}
     8000024:   08000041    stmdaeq r0, {r0, r6}
     8000028:   08000041    stmdaeq r0, {r0, r6}
     800002c:   08000041    stmdaeq r0, {r0, r6}
     8000030:   08000041    stmdaeq r0, {r0, r6}
     8000034:   08000041    stmdaeq r0, {r0, r6}
     8000038:   08000041    stmdaeq r0, {r0, r6}
     800003c:   08000041    stmdaeq r0, {r0, r6}
    
    08000040 <hang>:
     8000040:   e7fe        b.n 8000040 <hang>
    
    08000042 <reset>:
     8000042:   e7fd        b.n 8000040 <hang>
    

    向量都很好(.thumb_func),地址很好,这应该可以。

    在 openocd 源代码构建中:

    ../src/openocd -f interface/stlink-v2-1.cfg -f target/stm32f7x.cfg
    
    Open On-Chip Debugger 0.10.0+dev-01000-gdb23c13 (2020-01-06-20:09)
    Licensed under GNU GPL v2
    For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
    WARNING: interface/stlink-v2-1.cfg is deprecated, please switch to interface/stlink.cfg
    Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
    Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
    Info : Listening on port 6666 for tcl connections
    Info : Listening on port 4444 for telnet connections
    Info : clock speed 2000 kHz
    Info : STLINK V2J28M18 (API v2) VID:PID 0483:374B
    Info : Target voltage: 3.252736
    Info : stm32f7x.cpu: hardware has 8 breakpoints, 4 watchpoints
    Info : Listening on port 3333 for gdb connections
    

    在另一个窗口中

    telnet localhost 4444
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    Open On-Chip Debugger
    > 
    

    然后

    > halt
    target halted due to debug-request, current mode: Thread 
    xPSR: 0x01000000 pc: 0x08000040 msp: 0x20001000
    > halt
    > flash write_image erase /path/to/flash.elf
    device id = 0x10006451
    flash size = 2048 kbytes
    Single Bank 2048 kiB STM32F76x/77x found
    auto erase enabled
    wrote 32768 bytes from file /path/to/flash.elf in 0.771285s (41.489 KiB/s)
    
    > 
    

    检查一下

    > mdw 0x08000000 20
    0x08000000: 20001000 08000043 08000041 08000041 08000041 08000041 08000041 08000041 
    0x08000020: 08000041 08000041 08000041 08000041 08000041 08000041 08000041 08000041 
    0x08000040: e7fde7fe ffffffff ffffffff ffffffff 
    

    看起来不错。

    > reset
    Unable to match requested speed 2000 kHz, using 1800 kHz
    Unable to match requested speed 2000 kHz, using 1800 kHz
    > halt
    target halted due to debug-request, current mode: Thread 
    xPSR: 0x01000000 pc: 0x08000040 msp: 0x20001000
    > 
    

    看起来不错。

    将 flash.s 中的重置处理程序更改为

    .thumb_func
    reset:
        ldr r0,=0x20000000
        ldr r1,[r0]
        add r1,r1,#1
        str r1,[r0]
        b hang
    

    再次构建,测试它

    > halt
    target halted due to debug-request, current mode: Thread 
    xPSR: 0x01000000 pc: 0x08000040 msp: 0x20001000
    > flash write_image erase /path/to/flash.elf
    auto erase enabled
    wrote 32768 bytes from file /path/to/flash.elf in 0.772410s (41.429 KiB/s)
    
    > mww 0x20000000 0x12345678
    > reset
    Unable to match requested speed 2000 kHz, using 1800 kHz
    Unable to match requested speed 2000 kHz, using 1800 kHz
    > halt
    target halted due to debug-request, current mode: Thread 
    xPSR: 0x01000000 pc: 0x08000040 msp: 0x20001000
    > mdw 0x20000000
    0x20000000: 12345679 
    
    > 
    

    现在它已加载,无需重启

    > reset
    Unable to match requested speed 2000 kHz, using 1800 kHz
    Unable to match requested speed 2000 kHz, using 1800 kHz
    > halt
    target halted due to debug-request, current mode: Thread 
    xPSR: 0x01000000 pc: 0x08000040 msp: 0x20001000
    > mdw 0x20000000
    0x20000000: 1234567a 
    
    > 
    

    一切看起来都不错。 更改为 ITCM

    MEMORY
    {
        fst : ORIGIN = 0x00200000, LENGTH = 0x1000
        rom : ORIGIN = 0x08000000, LENGTH = 0x1000
        ram : ORIGIN = 0x20000000, LENGTH = 0x1000
    }
    SECTIONS
    {
        .text : { *(.text*) } > fst
    }
    
    Disassembly of section .text:
    
    00200000 <_start>:
      200000:   20001000    andcs   r1, r0, r0
      200004:   00200043    eoreq   r0, r0, r3, asr #32
      200008:   00200041    eoreq   r0, r0, r1, asr #32
      20000c:   00200041    eoreq   r0, r0, r1, asr #32
    

    看起来不错

    > reset halt
    > flash write_image erase /path/to/flash.elf
    auto erase enabled
    wrote 32768 bytes from file /path/to/flash.elf in 0.769531s (41.584 KiB/s)
    
    > mdw 0x00200000 20
    0x00200000: 20001000 00200043 00200041 00200041 00200041 00200041 00200041 00200041 
    0x00200020: 00200041 00200041 00200041 00200041 00200041 00200041 00200041 00200041 
    0x00200040: 4802e7fe 31016801 e7f96001 20000000 
    
    > mww 0x20000000 0x12345678
    > reset
    Unable to match requested speed 2000 kHz, using 1800 kHz
    Unable to match requested speed 2000 kHz, using 1800 kHz
    > halt
    target halted due to debug-request, current mode: Thread 
    xPSR: 0x01000000 pc: 0x00200040 msp: 0x20001000
    > mdw 0x20000000
    0x20000000: 12345679 
    

    看起来不错。没问题。

    编辑

    基于您的编辑和 cmets

    把我的程序改成这样:

    .thumb
    .thumb_func
    .global _start
    _start:
    stacktop: .word _estack
    .word Reset_Handler
    
    .thumb_func
    Reset_Handler:
    ldr   r0, =_estack
    mov   sp, r0          /* set stack pointer */
    ldr   r2, =_sdata
    
    //
    b Reset_Handler
    

    并按原样使用您的链接器脚本

    Disassembly of section .text:
    
    08000000 <_start>:
     8000000:   2007c000    andcs   r12, r7, r0
     8000004:   08000009    stmdaeq r0, {r0, r3}
    
    08000008 <Reset_Handler>:
     8000008:   4801        ldr r0, [pc, #4]    ; (8000010 <Reset_Handler+0x8>)
     800000a:   4685        mov sp, r0
     800000c:   4a01        ldr r2, [pc, #4]    ; (8000014 <Reset_Handler+0xc>)
     800000e:   e7fb        b.n 8000008 <Reset_Handler>
     8000010:   2007c000    andcs   r12, r7, r0
     8000014:   20020000    andcs   r0, r2, r0
    

    应该可以正常启动和工作。

    【讨论】:

    • 向问题添加了反汇编
    猜你喜欢
    • 1970-01-01
    • 2018-12-31
    • 2019-03-26
    • 2018-04-15
    • 2021-04-26
    • 2011-04-02
    • 1970-01-01
    • 2021-09-15
    • 2018-08-04
    相关资源
    最近更新 更多