工具/软件:Code Composer Studio
我使用 CCSv3.3 开发 C6713引导加载。 我设计的次级引导加载 程序可以将应用程序从0x90000400的闪存复制到0x00000000的 IRAM 中、然后板复位、项目可以正确运行。 但我希望 二级应用程序可以 从0x90000400处的闪存复制到0x80000000开头的 SDRAM 中、但当我复位电路板时、它无法 正确运行。 我不知道我的设计是错误的。 希望获得您的帮助。
此外,还有一个问题,即 在<文件中设计的次级引导加载程序示例 > 可以 将 应用 程序从闪存复制到 IRAM。 但是、它是否 满足 了我将 应用从闪存复制到 SDRAM 的需要?
提前感谢您的回复。
1.my .cmd:
-c
-x
l rts670.lib
-heap 200h
-stack 300h
存储器
{
BOOT_RAM:o=0、l=200h
IRAM:o=401h、l=0x0003FBFE
SDRAM:o = 80000000h l = 10000000h
}
部分
{
.vectors :>boot_RAM
boot_load:> boot_RAM
.bss:> SDRAM
.cinit:> SDRAM
.far:>SDRAM
.stack:> SDRAM
.text > SDRAM
.const > SDRAM
.pinit > SDRAM
.switch > SDRAM
.data > SDRAM
.cio > SDRAM
}
2.我使用 十六进制转换实用程序 自动创建段复制表。 我 的十六进制命令文件如下所示:
Debug\boot_test.out
-A
-memwidth 8
-map boot_test.map
-boot
-bootorg 0x90000400
bootsection .boot_load 0x90000000
ROM
{
闪存:org = 0x90000000、len = 0x8C00、romwidth = 8、files ={boot_test.hex}
}
我的次级引导加载程序如下:
;a;
;===== BOOT_C671x.s62 ===
;
.title "Flash 启动实用程序"
选项 D、T
长度102.
宽140
;为 C671x 系列定义的全局 EMIF 符号
.include boot_C671x.h62
;生成的引导表的地址
copyTable .equ 0x90000400
;.global _text_size
;.global _text_ld_start
;.global _text_rn_start
.sect ".boot_load"
全局_boot
.ref _c_int00
启动(_P):
;'********
;*调试循环-为正常运行注释出 B
;'********
零 B1
_myloop:;[!b1] B _myloop
NOP 5.
_myloopend:NOP
;'********
;*配置 EMIF、EMIF
;'********
;********
;* EMIF_GCTL = EMIF_GCTL_V;
;********
mvkl EMIF_GCTL、A4
|| mvkl EMIF_GCTL_V、B4
mvkh EMIF_GCTL、A4
|| mvkh EMIF_GCTL_V、B4
STW B4、* A4
;********
;* EMIF_CE0 = EMIF_CE0_V
;********
mvkl EMIF_ce0、A4
|| mvkl EMIF_ce0_V、B4
mvkh EMIF_ce0、A4
|| mvkh EMIF_ce0_V、B4
STW B4、* A4
;********
;* EMIF_CE1 = EMIF_CE1_V (设置为8位异步)
;********
mvkl EMIF_CE1、A4
|| mvkl EMIF_CE1_V、B4
mvkh EMIF_CE1、A4
|| mvkh EMIF_CE1_V、B4
STW B4、* A4
;********
;* EMIF_CE2 = EMIF_CE2_V (设置为32位异步)
;********
mvkl EMIF_CE2、A4
|| mvkl EMIF_CE2_V、B4
mvkh EMIF_CE2、A4
|| mvkh EMIF_CE2_V、B4
STW B4、* A4
;********
;* EMIF_CE3 = EMIF_CE3_V (设置为32位异步)
;********
|| mvkl EMIF_CE3、A4
|| mvkl EMIF_CE3_V、B4;
mvkh EMIF_CE3、A4
|| mvkh EMIF_CE3_V、B4
STW B4、* A4
;********
;* EMIF_SDRAMCTL = EMIF_SDRAMCTL_V
;********
|| mvkl EMIF_SDRAMCTL、A4
|| mvkl EMIF_SDRAMCTL_V、B4;
mvkh EMIF_SDRAMCTL、A4
|| mvkh EMIF_SDRAMCTL_V、B4
STW B4、* A4
;********
;* EMIF_SDRAMTIM = EMIF_SDRAMTIM_V
;********
|| mvkl EMIF_SDRAMTIM、A4
|| mvkl EMIF_SDRAMTIM_V、B4;
mvkh EMIF_SDRAMTIM、A4
|| mvkh EMIF_SDRAMTIM_V、B4
STW B4、* A4
;********
;* EMIF_SDRAMEXT = EMIF_SDRAMEXT_V
;********
|| mvkl EMIF_SDRAMEXT、A4
|| mvkl EMIF_SDRAMEXT_V、B4;
mvkh EMIF_SDRAMEXT、A4
|| mvkh EMIF_SDRAMEXT_V、B4
STW B4、* A4
;
;复制段,
;
mvkl copyTable,A3;加载表指针
mvkh copyTable、A3
LDW *A3++,B1;负载入口点
COPY_SECTION 顶部:
LDW *A3++,b0;字节计数
LDW *A3++,A4;RAM 起始地址
NOP 3.
[!b0] b copy_done;我们是否复制了所有段?
NOP 5.
COPY_LOOP:
LDB * A3++、B5
低于 b0、1、b0;递减计数器
[b0] b COPY_LOOP;如果未完成则设置分支
[!b0] b COPY_SECTION _TOP
A1为零
[!b0]和3、A3、A1
STB B5、* A4++
[!b0]和-4、A3、A5;向上舍入地址到4的下一个倍数
[a1]加4、A5、A3;四舍五入地址到4的下一个倍数
;
;跳转到入口点
;
COPY_DONE:
b .S2 B1
NOP 5.
;复制表:
;计数
;闪存启动(载入)地址
; RAM 启动(运行)地址
;.text
;.word _text_size
;.word _text_ld_start
;.word _text_rn_start
;表末尾
;.word 0
;.word 0
;.word 0