This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP432E401Y:从 USB 引导加载程序跳转到应用程序

Guru**** 2540720 points
Other Parts Discussed in Thread: MSP432E401Y

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1020891/msp432e401y-jumping-from-usb-bootloader-to-application

器件型号:MSP432E401Y

你(们)好

 1. 我已经从 TI 下载了引导加载程序代码并成功刷写到 msp432e401y 开发板中。

 2.我还在设备管理器中看到 了它被检测为 Stellaris 设备固件升级

 通过 LM Flash Programmer,我还通过使用  USB 接口的 Stellaris 器件固件升级刷写了应用程序

 之后,当我重置电路板时,引导加载程序不会调用应用程序。

我还共享引导加载程序和应用程序的链接器脚本。

我需要进行哪些更改,以便引导加载程序调用应用程序

请引导我。

谢谢

//应用程序链接器脚本文件。

--diag_suppress=10199

--retain=interruptVectors

存储器

   闪存(RX):origin = 0x00004000,length = 0x00100000
   SRAM (rwx):origin = 0x20000000,length = 0x00040000


/*以下命令行选项作为 CCS 项目的一部分进行设置。    *
/*如果您使用命令行构建,或者出于某种原因想要   */
/*在此处定义它们,您可以根据需要取消注释并修改这些行。     *
/*如果您使用 CCS 进行构建、最好进行任何这样的构建*/
/*对 CCS 项目进行修改并将此文件保留为单独文件。              *
/*                                                                          *//
/*--heap_size=0                                                            */
/*--stack_size=256                                                         */
/*--library=rtsv7M4_T_le_eabi.lib                                          */

/*内存中的段分配*/

部分

#ifndef gen_crc_table
   .intvecs  :> 0x00004000
   .text  :  > FLASH
   .const :  > FLASH
   .cinit :  >闪存
   .pinit :  > FLASH
   .rodata:  > FLASH
   init_array:> FLASH
其他
   .intvecs:  > 0x00004000、crc_table (crc_table_for_intvecs)
   .text  :  > FLASH、crc_table (crc_table_for_text)
   .const :  > FLASH、crc_table (crc_table_for_const)
   .cinit :  > FLASH、crc_table (crc_table_for_cinit)
   .pinit :  > FLASH、crc_table (crc_table_for_Pinit)
   .rodata:   > FLASH、crc_table (crc_table_for_Pinit)
   init_array:> FLASH、crc_table (crc_table_for_init_array)
   .TI.crctab :>闪存
#endif

   .vtable  :>0x20000000
   .data  :  > SRAM
   .bss   :  > SRAM
   .sysmem  :> SRAM
   .stack :  > SRAM


__STACK_TOP =__STACK + 512;

//引导加载程序链接器脚本文件。

--retain=向量

/*以下命令行选项作为 CCS 项目的一部分进行设置。    *
/*如果您使用命令行构建,或者出于某种原因想要   */
/*在此处定义它们,您可以根据需要取消注释并修改这些行。     *
/*如果您使用 CCS 进行构建、最好进行任何这样的构建*/
/*对 CCS 项目进行修改并将此文件保留为单独文件。              *
/*                                                                          *//
/*--heap_size=0                                                            */
/*--stack_size=256                                                         */
/*--library=rtsv7M3_T_le_eabi.lib                                          */

/*系统内存映射*/

存储器

   闪存(RX):origin = 0x00000000,length = 0x00010000
   SRAM (rwx):origin = 0x20000000,length = 0x00010000


/*内存中的段分配*/

部分

   组
   {
       .intvecs
       .text
       .const
       .data
   } load = FLASH、run = 0x20000000、load_start (init_load)、run_start (init_run)、size (init_size)

   组
   {
       .bss
       堆栈
   }run = SRAM、run_start (bss_run)、run_end (bss_end)、size (bss_size)、run_end (__stack_top)


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    //这是 Bootloader 的初始代码



    ;;BL_STARTUP_CCS.s - Code Composer Studio 的引导加载程序启动代码

    ;版权所有(c) 2009-2017 Texas Instruments Incorporated。  保留所有权利。
    ;软件许可协议

    ;德州仪器(TI)提供此软件仅用于和
    ;专门用于 TI 的微控制器产品。 该软件归其所有
    ;;TI 和/或其供应商,并受适用版权的保护
    ;法律。 您不能将此软件与"病毒"开源软件结合使用
    ;软件,以便形成一个更大的程序。

    ;此软件按“原样”提供,且存在所有缺陷。
    ;不作任何明示、暗示或法定的保证,包括: 但是
    ;不限于对适销性和适用性的暗示保证
    ;特定用途适用于此软件。 TI 不得以任何方式进行
    ;特殊情况、偶然或必然的责任
    ;由于任何原因造成的损失。





    ;包括引导加载程序配置选项。


       cdecls C、NOLIST、WARN
       %{
           #include "bl_config.h"
       %}



    ;从该文件导出在其他地方使用的符号


       全局 ResetISR、延迟、矢量



    ;;创建堆栈并将其放入一个段中


       .global __stack
    _stack:.usect ".stack"、stack_size * 4、8



    ;;将汇编器置于正确的配置中。


       Thumb



    ;;文件的这一部分进入中断向量部分


       .sect ".intvecs"



    ; Cortex-M3处理器的最小矢量表。


    向量:
       .ref   __stack_top
       .word  __STACK_TOP                  ;偏移000:初始堆栈指针
       .word  ResetISR - 0x20000000        ;;偏移004:复位处理程序
       .word  NmiSR - 0x20000000           ;;偏移008:NMI 处理程序
       .word  FaultISR - 0x20000000        ;;偏移00C:硬故障处理程序
       .word  IntDefaultHandler            ;;偏移010: MPU 故障处理程序
       .word  IntDefaultHandler            ;;偏移014:总线故障处理程序
       .word  IntDefaultHandler            ;;偏移018:用法故障处理程序
       .word  0                            ;;偏移01C:保留
       .word  0                            ;;偏移020:保留
       .word  0                            ;;偏移024:保留
       .word  0                            ;;偏移028:保留
       .word  UpdateHandler - 0x20000000   ;;偏移量02C:SVCall 处理程序
       .word  IntDefaultHandler            ;;偏移030:调试监视器处理程序
       .word  0                            ;;偏移034:保留
       .word  IntDefaultHandler            ;;偏移038:PendSV 处理程序
     .if $$defined (ENET_ENABLE_UPDATE)
       .ref   SysTickIntHandler
       .word  SysTickIntHandler            ;; Offset 03C: SysTick 处理程序
     其他
       .word  IntDefaultHandler            ;; Offset 03C: SysTick 处理程序
     .endif
     如果$$defined (UART_ENABLE_UPDATE)&$defined (UART_autobaud)
     .if (UART_autobaud = 0)
       .ref   GPIOIntHandler
       .word  GPIOIntHandler               ;;偏移量040:GPIO 端口 A 处理程序
     其他
       .word  IntDefaultHandler            ;;偏移量040:GPIO 端口 A 处理程序
     .endif
     其他
       .word  IntDefaultHandler            ;;偏移量040:GPIO 端口 A 处理程序
     .endif
     如果$$defined (UART_ENABLE_UPDATE)&$defined (UART_autobaud)
     .if (UART_autobaud = 1)
       .ref   GPIOIntHandler
       .word  GPIOIntHandler                ;;偏移量044:GPIO 端口 B 处理程序
     其他
       .word  IntDefaultHandler             ;;偏移量044:GPIO 端口 B 处理程序
     .endif
     其他
       .word  IntDefaultHandler             ;;偏移量044:GPIO 端口 B 处理程序
     .endif
     如果$$defined (UART_ENABLE_UPDATE)&$defined (UART_autobaud)
     .if (UART_autobaud == 2)
       .ref   GPIOIntHandler
       .word  GPIOIntHandler                ;;偏移量048:GPIO 端口 C 处理程序
     其他
       .word  IntDefaultHandler             ;;偏移量048:GPIO 端口 C 处理程序
     .endif
     其他
       .word  IntDefaultHandler             ;;偏移量048:GPIO 端口 C 处理程序
     .endif
     如果$$defined (UART_ENABLE_UPDATE)&$defined (UART_autobaud)
     .if (UART_autobaud == 3)
       .ref   GPIOIntHandler
       .word  GPIOIntHandler                ;;偏移量04C:GPIO 端口 D 处理程序
     其他
       .word  IntDefaultHandler             ;; Offset 04C: GPIO 端口 D 处理程序
     .endif
     其他
       .word  IntDefaultHandler             ;; Offset 04C: GPIO 端口 D 处理程序
     .endif
       .word  IntDefaultHandler             ;;偏移050: GPIO 端口 E
       .word  IntDefaultHandler             ;;偏移054:UART0 Rx 和 Tx
       .word  IntDefaultHandler             ;;偏移量058:UART1 Rx 和 Tx
       .word  IntDefaultHandler             ;; Offset 05C: SSI0 Rx 和 Tx
       .word  IntDefaultHandler             ;;偏移060: I2C0主设备和从设备
       .word  IntDefaultHandler             ;;偏移064:PWM 故障
       .word  IntDefaultHandler             ;;偏移068: PWM 发生器0
       .word  IntDefaultHandler             ;; Offset 06c: PWM 发生器1.
       .word  IntDefaultHandler             ;; Offset 070: PWM 发生器2.
       .word  IntDefaultHandler             ;; Offset 074:正交编码器0
       .word  IntDefaultHandler             ;;偏移078:ADC 序列0
       .word  IntDefaultHandler             ;; Offset 07C: ADC Sequence 1.
       .word  IntDefaultHandler             ;;偏移080: ADC 序列2.
       .word  IntDefaultHandler             ;;偏移084: ADC 序列3.
       .word  IntDefaultHandler             ;;偏移088:看门狗计时器
       .word  IntDefaultHandler             ;; Offset 08C: Timer 0子计时器 A
       .word  IntDefaultHandler             ;;偏移量090:计时器0子计时器 B
       .word  IntDefaultHandler             ;;偏移量094:定时器1子定时器 A
       .word  IntDefaultHandler             ;; Offset 098: Timer 1子计时器 B
       .word  IntDefaultHandler             ;; Offset 09C: Timer 2子计时器 A
       .word  IntDefaultHandler             ;; Offset 0A0: Timer 2子计时器 B
       .word  IntDefaultHandler             ;;偏移0A4:模拟比较器0
       .word  IntDefaultHandler             ;;偏移0A8:模拟比较器1.
       .word  IntDefaultHandler             ;; Offset 0AC: Analog Comparator 2.
       .word  IntDefaultHandler             ;;偏移0B0:系统控制
       .word  IntDefaultHandler             ;;偏移0B4:闪存控制
       .word  IntDefaultHandler             ;;偏移量0B8:GPIO 端口 F
       .word  IntDefaultHandler             ;; Offset 0BC:GPIO 端口 G
     如果$$defined (UART_ENABLE_UPDATE)&$defined (UART_autobaud)
     .if (UART_autobaud == 7)
       .ref   GPIOIntHandler
       .word  GPIOIntHandler                ;;偏移量0c0:GPIO 端口 H 处理程序
     其他
       .word  IntDefaultHandler             ;;偏移量0c0:GPIO 端口 H 处理程序
     .endif
     其他
       .word  IntDefaultHandler             ;;偏移量0c0:GPIO 端口 H 处理程序
     .endif
       .word  IntDefaultHandler             ;;偏移0C4:UART2 Rx 和 Tx
       .word  IntDefaultHandler             ;;偏移0C8:SSI1 Rx 和 Tx
       .word  IntDefaultHandler             ;; Offset 0CC: Timer 3子计时器 A
       .word  IntDefaultHandler             ;;偏移0D0:计时器3子计时器 B
       .word  IntDefaultHandler             ;;偏移0D4:I2C1主站和从站
       .word  IntDefaultHandler             ;;偏移0D8:CAN0
       .word  IntDefaultHandler             ;;偏移0DC: CAN1.
       .word  IntDefaultHandler             ;;偏移0E0:以太网
       .word  IntDefaultHandler             ;; Offset 0E4:休眠模块
     .if $$defined (USB_ENABLE_UPDATE)
       .ref   USB0DeviceIntHandler
       .word  USB0DeviceIntHandler          ;偏移量0E8:USB 0控制器
     其他
       .word  IntDefaultHandler             ;;偏移量0E8: USB 0控制器
     .endif
       .word  IntDefaultHandler             ;;偏移0EC: PWM 发生器3.
       .word  IntDefaultHandler             ;; Offset 0F0:UDMA 0软件
       .word  IntDefaultHandler             ;;偏移0F4:UDMA 0错误
       .word  IntDefaultHandler             ;;偏移0F8:ADC 1序列0
       .word  IntDefaultHandler             ;; Offset 0FC:ADC 1序列1
       .word  IntDefaultHandler             ;;偏移100: ADC 1序列2.
       .word  IntDefaultHandler             ;;偏移104:ADC 1序列3.
       .word  IntDefaultHandler             ;;偏移108:EPI 0
     如果$$defined (UART_ENABLE_UPDATE)&$defined (UART_autobaud)
     .if (UART_autobaud == 8)
       .ref   GPIOIntHandler
       .word  GPIOIntHandler                ;;偏移量10C:GPIO 端口 J 处理程序
     其他
       .word  IntDefaultHandler             ;;偏移量10C: GPIO 端口 J 处理程序
     .endif
     其他
       .word  IntDefaultHandler             ;;偏移量10C: GPIO 端口 J 处理程序
     .endif
     如果$$defined (UART_ENABLE_UPDATE)&$defined (UART_autobaud)
     .if (UART_autobaud == 9)
       .ref   GPIOIntHandler
       .word  GPIOIntHandler                ;;偏移量110: GPIO 端口 K 处理程序
     其他
       .word  IntDefaultHandler             ;;偏移量110: GPIO 端口 K 处理程序
     .endif
     其他
       .word  IntDefaultHandler             ;;偏移量110: GPIO 端口 K 处理程序
     .endif
       .word  IntDefaultHandler             ;;偏移量114: GPIO 端口 L
       .word  IntDefaultHandler             ;;偏移量118: SSI2 Rx 和 Tx
       .word  IntDefaultHandler             ;; Offset 11C: SSI3 Rx 和 Tx
       .word  IntDefaultHandler             ;;偏移量120: UART3 Rx 和 Tx
       .word  IntDefaultHandler             ;;偏移124:UART4 Rx 和 Tx
       .word  IntDefaultHandler             ;;偏移量128: UART5 Rx 和 Tx
       .word  IntDefaultHandler             ;; Offset 12C:UART6 Rx 和 Tx
       .word  IntDefaultHandler             ;;偏移量130: UART7 Rx 和 Tx
       .word  IntDefaultHandler             ;;偏移134:I2C2主站和从站
       .word  IntDefaultHandler             ;; Offset 138: I2C3 Master and Slave
       .word  IntDefaultHandler             ;;偏移13C:计时器4子计时器 A
       .word  IntDefaultHandler             ;; Offset 140: Timer 4子计时器 B
       .word  IntDefaultHandler             ;;偏移144:计时器5子计时器 A
       .word  IntDefaultHandler             ;;偏移148:计时器5子计时器 B
       .word  IntDefaultHandler             ;;偏移14C: FPU 异常
       .word  IntDefaultHandler             ;;偏移150:保留
       .word  IntDefaultHandler             ;;偏移154:保留
       .word  IntDefaultHandler             ;; Offset 158: I2C4 Master and Slave
       .word  IntDefaultHandler             ;;偏移15C: I2C5主设备和从设备
       .word  IntDefaultHandler             ;;偏移量160: GPIO 端口 M
       .word  IntDefaultHandler             ;;偏移量164: GPIO 端口 N
       .word  IntDefaultHandler             ;;偏移168:保留
       .word  IntDefaultHandler             ;;偏移16C:篡改
     如果$$defined (UART_ENABLE_UPDATE)&$defined (UART_autobaud)
     .if (UART_autobaud == 13)
       .ref   GPIOIntHandler
       .word  GPIOIntHandler                ;;偏移量170: GPIO 端口 P 处理程序
     其他
       .word  IntDefaultHandler             ;; Offset 170: GPIO 端口 P 处理程序
     .endif
     其他
       .word  IntDefaultHandler             ;; Offset 170: GPIO 端口 P 处理程序
     .endif
       .word  IntDefaultHandler             ;;偏移量174:GPIO 端口 P1
       .word  IntDefaultHandler             ;;偏移量178: GPIO 端口 P2
       .word  IntDefaultHandler             ;;偏移量17C: GPIO 端口 P3
       .word  IntDefaultHandler             ;;偏移量180:GPIO 端口 P4
       .word  IntDefaultHandler             ;;偏移量184:GPIO 端口 P5
       .word  IntDefaultHandler             ;;偏移量188:GPIO 端口 P6
       .word  IntDefaultHandler             ;;偏移量18C:GPIO 端口 P7
     如果$$defined (UART_ENABLE_UPDATE)&$defined (UART_autobaud)
     .if (UART_autobaud == 14)
       .ref   GPIOIntHandler
       .word  GPIOIntHandler                ;;偏移量190: GPIO 端口 Q 处理程序
     其他
       .word  IntDefaultHandler             ;;偏移量190: GPIO 端口 Q 处理程序
     .endif
     其他
       .word  IntDefaultHandler             ;;偏移量190: GPIO 端口 Q 处理程序
     .endif
       .word  IntDefaultHandler             ;;偏移量194:GPIO 端口 Q1
       .word  IntDefaultHandler             ;;偏移量198: GPIO 端口 Q2
       .word  IntDefaultHandler             ;;偏移量19C:GPIO 端口 Q3
       .word  IntDefaultHandler             ;;偏移量1A0: GPIO 端口 Q4
       .word  IntDefaultHandler             ;;偏移量1A4:GPIO 端口 Q5
       .word  IntDefaultHandler             ;;偏移1A8:GPIO 端口 Q6
       .word  IntDefaultHandler             ;;偏移量1AC: GPIO 端口 Q7
     如果$$defined (UART_ENABLE_UPDATE)&$defined (UART_autobaud)
     .if (UART_autobaud == 15)
       .ref   GPIOIntHandler
       .word  GPIOIntHandler                ;偏移量1B0:GPIO 端口 R 处理程序
     其他
       .word  IntDefaultHandler             ;;偏移量1B0: GPIO 端口 R 处理程序
     .endif
     其他
       .word  IntDefaultHandler             ;;偏移量1B0: GPIO 端口 R 处理程序
     .endif
       .word  IntDefaultHandler             ;;偏移量1B4: GPIO 端口 S
       .word  IntDefaultHandler             ;;偏移1B8: SHA/MD5
       .word  IntDefaultHandler             ;;偏移1BC:AES



    ;;文件的这一部分进入文本部分。


       .text



    ;;通过将引导加载程序从闪存复制到 SRAM,零来初始化处理器
    ;填充.bss 段,并将矢量表移动到的开头
    ;SRAM。  修改返回地址以指向引导的 SRAM 副本
    ;;加载而不是闪存副本,导致现在在中对该副本进行分支
    ;SRAM。


       .ref   BSS_run
    bss_start  .word bss_run
       .ref   __stack_top
    bss_end    .word __stack_top

       thumbfunc ProcessorInit
    ProcessorInit:.asmfunc
       ;
       ;;将代码映像从闪存复制到 SRAM。
       ;
       MOV   r0、#0x0000
       MOV   R1、#0x0000
       MOVt   R1、#0x2000
       LDR    R2、BSS_START
    COPY_LOOP:
           LDR    R3、[r0]、#4
           STR    R3、[R1]、#4
           CMP    R1、R2
           BLT    COPY_LOOP

       ;
       ;零填充.bss 段。
       ;
       MOV   r0、#0x0000
       LDR    R2、BSS_END
    zero_loop:
           STR    r0、[R1]、#4
           CMP    R1、R2
           BLT    zero_loop

       ;
       ;;将矢量表指针设置为 SRAM 的开头。
       ;
       MOVw   r0、#(0xE000ED08和0xFFFF)
       movt   r0、#(0xE000ED08 >> 16)
       MOV   R1、#0x0000
       MOVt   R1、#0x2000
       STR    R1、[r0]

       ;
       ;;设置刚刚复制到 SRAM 的代码的返回地址。
       ;
       ORR    LR、LR、#0x20000000

       ;
       ;返回给呼叫者。
       ;
       BX LR      
       endasmfunc



    ;复位处理程序,在处理器启动时调用。


       .thumbfunc ResetISR
    ResetISR:.asmfunc
       ;
       ;启用浮点单元。  如果有任何情况、必须在此处执行此操作
       ;;后面的 C 函数使用浮点。  请注意、有些工具链会
       ;;即使没有显式浮点、也可将 FPU 寄存器用于通用工作区
       ;点数据类型正在使用中。
       ;
       movw   r0、#0xED88
       movt   r0、#0xE000
       LDR    R1、[r0]
       ORR    R1、R1、#0x00F00000
       STR    R1、[r0]

       ;
       ;初始化处理器。
       ;
       BL     处理器初始化

       ;
       ;;调用用户提供的低级硬件初始化函数
       ;如果提供。
       ;
     .if $defined (BL_HW_INIT_FN_Hook)
       .ref   BL_HW_INIT_FN_HOOK
       BL     BL_HW_INIT_FN_HOOK
     .endif

       ;
       ;查看是否应执行更新。
       ;
       .ref   CheckForceUpdate
       BL     CheckForceUpdate
       CBZ    r0、CallApplication

       ;
       ;;配置微控制器。
       ;
       thumbfunc EnterBootLoader
    EnterBootLoader:
     .if $$defined (ENET_ENABLE_UPDATE)
       .ref   配置环境
       BL     配置 Enet
     .elseif $$defined (CAN_ENABLE_UPDATE)
       .ref   配置 CAN
       BL     配置 CAN
     .elseif $$defined (USB_ENABLE_UPDATE)
       .ref   配置 USB
       BL     配置 USB
     其他
       .ref   配置设备
       BL     配置设备
     .endif

       ;
       ;;调用用户提供的初始化函数(如果提供)。
       ;
     .if $defined (bl_init_fn_hook)
       .ref   bl_init_fn_hook
       BL     BL_INIT_FN_HOOK
     .endif

       ;
       ;;分支到更新处理程序。
       ;
     .if $$defined (ENET_ENABLE_UPDATE)
       .ref   UpdateBOOTP
       b      更新 BOOTP
     .elseif $$defined (CAN_ENABLE_UPDATE)
       .ref   UpdateerCAN
       b      更新 CAN
     .elseif $$defined (USB_ENABLE_UPDATE)
       .ref   UpdateerUSB
       B      更新程序 USB
     其他
       .ref   更新程序
       b      更新程序
     .endif
       endasmfunc

       ;
       ;;这是允许从引导中启动应用程序的第二个符号
       ;加载程序链接器可能与感知跳转不同。
       ;
       .global StartApplication
       thumbfunc StartApplication
    启动应用程序:
       ;
       ;;通过其矢量表中的复位处理程序调用应用程序。  负载
       ;应用程序矢量表的地址。
       ;
       .thumbfunc CallApplication
    CallApplication:.asmfunc
       ;
       ;;如有必要,将应用程序的矢量表复制到目标地址。
       ;;请注意,错误的引导加载程序配置可能会导致这种情况
       ;;代码损坏!  将 VTABLE _START_ADDRESS 设置为0x20000000 (开始
       ;; of SRAM)是安全的,因为它将使用与引导加载程序相同的内存
       ;已用于其矢量表。  如果需要、则必须非常小心
       ;其它地址将被使用。
       ;
     .if (app_start_address!= VTABLE _start_address)
       movw   r0、#(VTABLE _START_ADDRESS & 0xFFFF)
     .if (VTABLE _START_ADDRESS > 0xFFFF)
       movt   r0、#(VTABLE _START_ADDRESS >> 16)
     .endif
       MOVw   R1、#(APP_START_ADDRESS 和0xFFFF)
     .if (APP_START_ADDRESS > 0xFFFF)
       movt   R1、#(app_start_address >> 16)
     .endif

       ;
       ;;计算向量表的结束地址,假定它具有
       ;;最大可能的向量数。  我们不知道该应用程序有多少
       ;;已填充,因此这是最安全的方法,尽管它可能复制一些非
       ;如果应用程序表小于最大值,则向量数据。
       ;
       movw   R2、#(70 * 4)
       添加   了 R2、R2、r0
    VectorCopyLoop:
           LDR    R3、[R1]、#4
           STR    R3、[r0]、#4
           CMP    r0、R2
           BLT    VectorCopyLoop
     .endif

       ;
       ;;设置应用程序的矢量表起始地址。  通常、这是
       ;应用程序起始地址,但在某些情况下,应用程序可能会重新定位
       ;;这样我们就不能假定这两个地址是相等的。
       ;
       movw   r0、#(VTABLE _START_ADDRESS & 0xFFFF)
     .if (VTABLE _START_ADDRESS > 0xFFFF)
       movt   r0、#(VTABLE _START_ADDRESS >> 16)
     .endif
       MOVw   R1、#(0xE000ED08和0xFFFF)
       MOVt   R1、#(0xE000ED08 >> 16)
       STR    r0、[R1]

       ;
       ;从应用程序的向量表加载栈指针。
       ;
     .if (app_start_address!= VTABLE _start_address)
       movw   r0、#(app_start_address 和0xFFFF)
     .if (APP_START_ADDRESS > 0xFFFF)
       movt   r0、#(app_start_address >> 16)
     .endif
     .endif
       LDR    sp、[r0]

       ;
       ;从应用程序的矢量表加载初始 PC 并分支到
       ;应用程序的入口点。
       ;
       LDR    r0、[r0、#4]
       BX     r0
       endasmfunc



    ;;更新处理程序,在应用程序需要时调用
    ;开始更新。


       .thumbfunc UpdateHandler
    UpdateHandler:.asmfunc
       ;
       ;初始化处理器。
       ;
       BL     处理器初始化

       ;
       ;从向量表加载栈指针。
       ;
       MOV   r0、#0x0000
       LDR    sp、[r0]

       ;
       ;;调用用户提供的低级硬件初始化函数
       ;如果提供。
       ;
     .if $defined (BL_HW_INIT_FN_Hook)
       BL     BL_HW_INIT_FN_HOOK
     .endif

       ;
       ;;调用用户提供的重新初始化函数(如果提供)。
       ;
     如果$$defined (BL_reinit_fn_hook)
       .ref   BL_reinit_fn_hook
       BL     BL_reinit_fn_hook
     .endif

       ;
       ;;分支到更新处理程序。
       ;
     .if $$defined (ENET_ENABLE_UPDATE)
       b      更新 BOOTP
     .elseif $$defined (CAN_ENABLE_UPDATE)
       .ref   AppUpdateerCAN
       b      AppUpdateerCAN
     .elseif $$defined (USB_ENABLE_UPDATE)
       .ref   AppUpdateerUSB
       b      AppUpdateerUSB
     其他
       b      更新程序
     .endif
       endasmfunc



    ;NMI 处理程序。


       thumbfunc NmiSR
    NmiSR:.asmfunc
     .if $$defined (ENABLE_MOSCFAIL_handler)
       ;
       ;从堆栈中抓取故障帧(堆栈将由清除
       ;随后的处理器初始化)。
       ;
       LDM    sp、{R4-r11}
       MOV    R12、LR

       ;
       ;初始化处理器。
       ;
       BL     处理器初始化

       ;
       ;恢复堆栈框。
       ;
       MOV    LR、R12
       STM    sp、{R4-r11}

       ;
       ;保存链接寄存器。
       ;
       MOV    R9、LR

       ;
       ;;调用用户提供的低级硬件初始化函数
       ;如果提供。
       ;
     .if $defined (BL_HW_INIT_FN_Hook)
       BL     BL_HW_INIT_FN_HOOK
     .endif

       ;
       ;查看是否应执行更新。
       ;
       BL     CheckForceUpdate
       CBZ    r0、EnterApplication

           ;
           ;;清除 RESC 中的 MOSCFAIL 位。
           ;
           MOVw   r0、#(0x400FE05C & 0xFFFF)
           movt   r0、#(0x400FE05C >> 16)
           LDR    R1、[r0]
           BIC    R1、R1、#0x00010000
           STR    R1、[r0]

           ;
           ;修复堆栈上的 PC,以便绕过引导引脚检查
           ;;(因为已经执行)。
           ;
           LDR    r0、= EnterBootLoader
           BIC    r0、#0x00000001
           STR    r0、[sp、#0x18]

           ;
           ;从 NMI 处理程序返回。  然后、这将开始执行
           ;引导加载程序。
           ;
           BX     R9.

       ;
       ;恢复链接寄存器。
       ;
    EnterApplication:
       MOV    LR、R9

       ;
       ;;如有必要,将应用程序的矢量表复制到目标地址。
       ;;请注意,错误的引导加载程序配置可能会导致这种情况
       ;;代码损坏!  将 VTABLE _START_ADDRESS 设置为0x20000000 (开始
       ;; of SRAM)是安全的,因为它将使用与引导加载程序相同的内存
       ;已用于其矢量表。  如果需要、则必须非常小心
       ;其它地址将被使用。
       ;
     .if (app_start_address!= VTABLE _start_address)
       movw   r0、#(VTABLE _START_ADDRESS & 0xFFFF)
     .if (VTABLE _START_ADDRESS > 0xFFFF)
       movt   r0、#(VTABLE _START_ADDRESS >> 16)
     .endif
       MOVw   R1、#(APP_START_ADDRESS 和0xFFFF)
     .if (APP_START_ADDRESS > 0xFFFF)
       movt   R1、#(app_start_address >> 16)
     .endif

       ;
       ;;计算向量表的结束地址,假定它具有
       ;;最大可能的向量数。  我们不知道该应用程序有多少
       ;;已填充,因此这是最安全的方法,尽管它可能复制一些非
       ;如果应用程序表小于最大值,则向量数据。
       ;
       movw   R2、#(70 * 4)
       添加   了 R2、R2、r0
    VectorCopyLoop2:
           LDR    R3、[R1]、#4
           STR    R3、[r0]、#4
           CMP    r0、R2
           BLT    VectorCopyLoop2.
     .endif

       ;
       ;;设置应用程序的矢量表起始地址。  通常、这是
       ;应用程序起始地址,但在某些情况下,应用程序可能会重新定位
       ;;这样我们就不能假定这两个地址是相等的。
       ;
       movw   r0、#(VTABLE _START_ADDRESS & 0xFFFF)
     .if (VTABLE _START_ADDRESS > 0xFFFF)
       movt   r0、#(VTABLE _START_ADDRESS >> 16)
     .endif
       MOVw   R1、#(0xE000ED08和0xFFFF)
       MOVt   R1、#(0xE000ED08 >> 16)
       STR    r0、[R1]

       ;
       ;从引导加载程序的堆栈中删除 NMI 堆栈框。
       ;
       ldmia  sp、{R4-r11}

       ;
       ;;获取应用程序的栈指针。
       ;
     .if (app_start_address!= VTABLE _start_address)
       movw   r0、#(app_start_address 和0xFFFF)
     .if (APP_START_ADDRESS > 0xFFFF)
       movt   r0、#(app_start_address >> 16)
     .endif
     .endif
       LDR    sp、[r0、#0x00]

       ;
       ;;将 NMI 堆栈帧的返回地址修复为的复位处理程序
       ;;应用程序。
       ;
       LDR    R10、[r0、#0x04]
       BIC    R10、#0x00000001

       ;
       ;;将 NMI 堆栈帧存储到应用程序的堆栈上。
       ;
       stmdb  sp!、{R4-r11}

       ;
       ;;分支到应用程序的 NMI 处理程序。
       ;
       LDR    r0、[r0、#0x08]
       BX     r0
     其他
       ;
       ;;永久循环,因为我们无法对 NMI 执行任何操作。
       ;
       b      NmiSR
     .endif
       endasmfunc



    ;硬故障处理程序。


       thumbfunc FaultISR
    FaultISR:.asmfunc
       ;
       ;;永久循环,因为我们无法对硬故障采取任何措施。
       ;
       b      FaultISR
       endasmfunc



    ;;缺省中断处理程序。


       thumbfunc IntDefaultHandler
    IntDefaultHandler:.asmfunc
       ;
       ;;永远循环,因为我们无法做任何意外的事情
       ;中断。
       ;
       b      IntDefaultHandler
       endasmfunc



    ;提供较小的延迟。  下面的环路每环路需要3个周期。


    ;   .globl 延迟
       thumbfunc 延迟
    延迟:.asmfunc
       SUS   r0、#1
       BNE    延迟
       BX LR      
       endasmfunc

       thumbfunc _c_int00
       全局_c_int00
    _c_int00:.asmfunc
       b      ResetISR



    ;;这是文件的末尾。


       .end

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    是否有任何方法可以使用描述中的1步重新刷新您的电路板。

    此致、

    现金 Hao

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好,我 使用直接从 Code composer studio 刷新了引导加载程序代码。

    TI XDS110调试探针。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    当您重新刷写电路板时、电路板的功能是否正常。

    此致、

    现金 Hao

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    是,刷写引导加载程序代码并重置后,在设备管理器中看到 ,它被检测为 Stellaris 设备固件

    升级。