本人在做6678的emif16启动 是自己设计的板子 。
烧写方法是二次加载 待烧写工程为 A 烧写工程为emif16.
烧写流程是 .out 转为.bin ;用emif16烧写工程 写到0x70000000地址以后 0x70000000~0x70000400 为bootloader 之后为应用程序。
目前的问题是:断电重启加仿真器可以看到对应的flash有数据 就是烧正确 跑不起。(和.bin比对过没有问题)
下面贴上烧写工程的A bootloader 和 CMD
BOOTLOADER
CODE_ROM .equ 0x70000400 ;ROM (CE1-32bit)
GPIO_DIRREG .equ 0x02320010 ;DIR reg.
GPIO_DIRREG_V .equ 0x0000FFDF ;GPIO[4]=output,(0–output,1–input)
GPIO_SETDATAREG .equ 0x02320018 ;SET DATA reg.
GPIO_SETDATAREG_V .equ 0x00000020 ;1–high level
GPIO_CLRDATAREG .equ 0x0232001C ;CLEAR DATA reg.
GPIO_CLRDATAREG_V .equ 0x00000020 ;1–low level
.global _boot
.ref _c_int00
; .sect ".boot"
; .align 1024
.sect ".bootembed"
.align 1024
_boot:
;****************************************************************************
;* SET REG VAL == REG_VAL
;****************************************************************************
mvkl GPIO_DIRREG,A4 || mvkl GPIO_DIRREG_V,B4
mvkh GPIO_DIRREG,A4
|| mvkh GPIO_DIRREG_V,B4
stw B4,*A4
mvkl GPIO_CLRDATAREG,A4
|| mvkl GPIO_CLRDATAREG_V,B4
mvkh GPIO_SETDATAREG,A4
|| mvkh GPIO_CLRDATAREG_V,B4
stw B4,*A4
;****************************************************************************
;* Copy code sections
;****************************************************************************
mvkl CODE_ROM, a3 ; load table pointer
mvkh CODE_ROM, a3
ldw *a3++, b1 ; Load entry point
copy_section_top:
ldw *a3++, b0 ; byte count ldw *a3++, a4 ; ram start address
nop 3
[!b0] b copy_done ; have we copied all sections?
nop 5
copy_loop:
ldw *a3++,b5
sub b0,4,b0 ; decrement counter
[ b0] b copy_loop ; setup branch if not done
[!b0] b copy_section_top
zero a1
[!b0] and 3,a3,a1
stw b5,*a4++
[!b0] and -4,a3,a5 ; round address up to next multiple of 4
[ a1] add 4,a5,a3 ; round address up to next multiple of 4
;****************************************************************************
;* Jump to entry point
;****************************************************************************
copy_done:
b .S2 b1
nop 5
;************************************************************************
CMD
-heap 0x1000
-stack 0x2000
MEMORY
{
/* Local L2, 0.5~1MB*/
VECTORS: o = 0x00800000 l = 0x00000200
LL2_CODE: o = 0x00800200 l = 0x0000FE00
LL2_R_DATA: o = 0x00810000 l = 0x00008000
LL2_RW_DATA: o = 0x00818000 l = 0x00068000
Cor0_SL2: o = 0x10800000 l = 0x00080000
SL2: o = 0x0C000000 l = 0x00180000
/* Shared L2 2~4MB*/
SL2_RW_DATA: o = 0x18000000 l = 0x00200000
BootFlash: o = 0x70000000 l = 0x00000400
/* External DDR3, upto 2GB per core */
DDR3_CODE: o = 0x80000000 l = 0x01000000
DDR3_R_DATA: o = 0x81000000 l = 0x01000000
DDR3_RW_DATA: o = 0x82000000 l = 0x06000000
}
SECTIONS
{
vecs > VECTORS .bootembed > Cor0_SL2
.text > SL2
.cinit > SL2
.const > SL2
.switch > SL2
.cio > SL2
.stack > LL2_RW_DATA
GROUP
{
.neardata
.rodata
.bss
} > LL2_RW_DATA
.far > LL2_RW_DATA
.fardata > LL2_RW_DATA
.sysmem > LL2_RW_DATA
External_NonCache_Data > DDR3_RW_DATA
}
CMD中bootloader 的指向对吗?
bootembed > Cor0_SL2
Zhan Xiang:
通常烧写程序后运行不起来可以从以下点debug:
1. 确认boot管脚的配置是否正确
2. 确认大小端和烧写到Nor flash的字节序一致
3. 上电后连接仿真器,看看代码运行到哪里,是否在期望的地址
4. 我看你的代码定义了DDR3 的memory,bootloader是不是用到了DDR3,如果用到了,需要先初始化DDR3
user4528146:
回复 Zhan Xiang:
您好:
1boot管脚确认没问题。
2大小端和烧写到Nor flash确定一致
3.对于 上电后连接仿真器,看看代码运行到哪里,是否在期望的地址 这一步不是很懂刚开始接触。希望不吝赐教。
4 还有个问题 两端程序 bootloader和cmd相同 一段烧写成功 一段失败 。 但加载仿真器都能满足需求。。