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.

[参考译文] TMS320F28335:ExitBoot 例程

Guru**** 2589300 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1169535/tms320f28335-exitboot-routine

器件型号:TMS320F28335
主题中讨论的其他器件:C2000WARE

如果我 使用闪存模式、引导加载程序代码会放入 RAM 中、我如何退出引导。 有两个有关闪存的演示(c2000ware 中的 SCIA 或 CAN)、都使用 RAM 模式、InitBoot 是程序的入口点、

在此汇编程序中、使用 LCR 调用"main"函数并以 LRETR 结束、如果程序从闪存引导、如何 转到入口点。

InitBoot (_InitBoot):

;初始化栈指针。

_stack:.usect ".stack"、0
MOV SP、#_STACK;初始化栈指针

;初始化在 C28x 模式下运行的设备。

C28OBJ;选择 C28x 对象模式
C28ADDR;选择 C27x/C28x 寻址
C28MAP;为 C28x 模式设置块 M0/M1
CLRC PAGE0;始终使用栈寻址模式
MOVW DP、#0;初始化 DP 以指向低64K
CLRC OVM

;将 PM 漂移设置为0

SPM 0

;决定使用哪种引导模式
LCR_MAIN

;清理并退出。 此时、EntryAddr
;位于 ACC 寄存器中
bf _ExitBoot、UNC

;------------------------------------------------
;_ExitBoot
;------------------------------------------------
;------------------------------------------------
;此模块在引导加载程序之后清理

;1)确保已取消分配堆栈。
; SP = 0x400退出引导后
;加载程序
;2)将0推入堆栈,这样 RPC 将是
;在使用 LRETR 跳转到后为0
;入口点
;2)使用入口点装载 RPC
;3)清除所有 XARn 寄存器
;4)清除 ACC、P 和 XT 寄存器
;5) LRETR -这也将清除 RPC
;寄存器,因为0在堆栈上
;------------------------------------------------

ExitBoot (_ExitBoot):

;------------------------------------------------
;确保栈被取消分配
;------------------------------------------------

MOV SP、#__STACK

;------------------------------------------------
;清除堆栈的底部。 这将会结束
;在我们完成时在 RPC 中
;------------------------------------------------

MOV * SP++、#0
MOV * SP++、#0

;------------------------------------------------
;使用确定的入口点加载 RPC
;通过引导模式。 将返回此地址
;在 ACC 寄存器中。
;------------------------------------------------

按 ACC
弹出 RPC

;------------------------------------------------
;将寄存器恢复到复位状态。

;清除所有 XARn、ACC、XT、P 和 DP
;寄存器

;注:将器件保持在 C28x 操作模式
;(OBJMODE = 1、AMODE = 0)
;------------------------------------------------
ZAPA
MOVL XT、ACC
MOVZ AR0、AL
MOVZ AR1、AL
MOVZ AR2、AL
MOVZ AR3、AL
MOVZ AR4、AL
MOVZ AR5、AL
MOVZ AR6、AL
MOVZ AR7、AL
MOVW DP、#0

;----------------------------------------------------
;恢复 st0和 st1。 请注意 OBJMODE 是
;唯一的位未恢复到其复位状态。
; OBJMODE 保留为 C28x 对象操作设置
;模式。

;ST0 = 0x0000 ST1 = 0x0A0B
;15:10 OVC = 0 15:13 ARP = 0
;9:7 PM = 0 12 XF = 0
;6V = 0 11 M0M1MAP = 1
;5 N = 0 10保留
;4 Z = 0 9 OBJMODE = 1
;3 C = 0 8 AMODE = 0
;2 TC = 0 7 IDLESTAT = 0
;1 OVM = 0 6 EALLOW = 0
;0 SXM = 0 5 LOOP = 0
;4 SPA = 0
;3 VMAP = 1
;2 PAGE0 = 0
;1 DBGM = 1
;0 INTM = 1
;------------------------------------------------

MOV * SP++、#0
MOV * SP++、#0x0A0B
弹出 ST1
弹出 ST0

;----------------------------------------------------
;跳转到由定义的 EntryAddr
;选择引导模式并继续执行
;------------------------------------------------

LRETR

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

     以下内容是否正确:  

    1. 引导模式选择引脚配置为从闪存引导。
    2. 您正在使用 CAN 或 SCI 进行引导加载。
    3. 传输代码后、您想知道如何分支到 InitBoot。  

    如果我们的理解正确、您通过串行端口传输代码的目标是什么? 您是否未对闪存进行编程? 如果是这样、您应该分支到闪存中的程序起始地址(实际上是一个分支)、对吧?

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

    、是;、从闪存引导的,1、引导引脚;2使用 SCIB 传输代码3 编程闪存后、我想分支到闪存入口点、让芯片再次重新启动

    我的问题是我是否需要 exitboot 例程、例如处理 st0或 st1、或者直接分支到闪存入口点。

    我不是很熟悉相关说明、我可以使用 LB 分支到闪存入口点吗?

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

    如果目的是重置器件、则只需使用 LB 跳转闪存入口点。

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

    如何在 C 源代码中定义的汇编源代码中引用符号

    或汇编源代码中定义的 symblol、在 C 文件中使用

    该工程可能会发生更改、因此我想使用 PC 发送的入口点进行分支、该值在 C 程序中得到、如何传递该入口点来汇编 源代码

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

    请查看 e2e.ti.com/.../accessing-c-structure-members-in-c28x-assembly 上提供的建议