主题中讨论的其他器件: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