通过汇编在二级bootloader中实现DMA,通过DMA来将程序段.text从外部的ROM搬至内部的程序RAM中。
但是程序运行过程中,异常中止了,通过仿真器查明,程序停在了DMA的主控制寄存器查询位置(下面代码wait标示处)。但是,在这个循环部分里面打入断点之行,可以正常引导入main函数。
程序的boot程序如下所示,大家帮忙分析分析。我初步断定可能是由于DMA的寄存器使用有问题。。。
;****************************************************************
; DMA操作
;****************************************************************
retPlace:
;****************************************************************
; DMA Register:PRICTL、SECCTL
;****************************************************************
mvkl PRICTL0,A4
mvkl 0x00000000,B4
mvkh PRICTL0,A4
mvkh 0x00000000,B4
stw B4,*A4
nop 5
mvkl SECCTL0,A4
mvkl 0x00000000,B4
mvkh SECCTL0,A4
mvkh 0x00000000,B4
stw B4,*A4
nop 5
;****************************************************************
; DMA Register:DMA0_SRA、DMA0_DSA、DMA0_CNT
;****************************************************************
mvkl DMA0_SRA,A4
mvkl DMA0_SRA_V,B4
mvkh DMA0_SRA,A4
mvkh DMA0_SRA_V,B4
stw B4,*A4
nop 5
mvkl DMA0_DSA,A4
mvkl DMA0_DSA_V,B4
mvkh DMA0_DSA,A4
mvkh DMA0_DSA_V,B4
stw B4,*A4
nop 5
mvkl DMA0_CNT,A4
mvkl DMA0_CNT_V,B4
mvkh DMA0_CNT,A4
mvkh DMA0_CNT_V,B4
stw B4,*A4
nop 5
;****************************************************************
; 启动DMA开始传输
;****************************************************************
mvkl PRICTL0,A4
mvkl 0x00000001,B4
mvkh PRICTL0,A4
mvkh 0x00000001,B4
stw B4,*A4
nop 5
;****************************************************************
; 判定DMA是否结束
;****************************************************************
wait:
mvkl PRICTL0,A4
mvkh PRICTL0,A4
ldw *A4, B2
nop 5
mvkl 0x0000000C,A4
mvkh 0x0000000C,A4
and A4, B2, B2
[ B2] b wait
[!B2] b copy_data
nop 5
;***********************************************************
; 将.cinit段和.switch段及其他段搬运到外部数据RAM
;***********************************************************
copy_data:
copy_cinit:
……
……
…… |