📄 setup.s
字号:
//-------------------------------------------------------------------------*
// 文件名: setup.s *
// 说 明: MCF52233的启动文件 *
//-------------------------------------------------------------------------*
//为了汇编调用,给出一些标号或函数宏定义
#define mcf52233_init _mcf52233_init
#define main _main
#define __IPSBAR ___IPSBAR
#define __SRAM ___SRAM
#define __FLASH ___FLASH
#define __SP_INIT ___SP_INIT
//外部标记符引用声明
.extern __IPSBAR
.extern __SRAM
.extern __FLASH
.extern __SP_INIT
.extern mcf52233_init
.extern main
//全局标记符定义
.global asm_startmeup
.global _asm_startmeup
.global mcf5xxx_wr_cacr
.global _mcf5xxx_wr_cacr
.global mcf5xxx_wr_vbr
.global _mcf5xxx_wr_vbr
.global d0_reset
.global _d0_reset
.global d1_reset
.global _d1_reset
.data
//定义变量保存D0和D1的复位值
d0_reset:
_d0_reset: .long 0
d1_reset:
_d1_reset: .long 0
.text
//-------------------------------------------------------------------------*
//函数名: asm_startmeup *
//功 能: 硬件复位后的启动函数。内存映射根据链接文件的定义设置,然后调用 *
// 更高级的系统初始化例程。最后程序跳转到“main”程序 *
//参 数: 无 *
//返 回: 无 *
//-------------------------------------------------------------------------*
asm_startmeup:
_asm_startmeup:
//备份芯片信息:D0寄存器提供了处理器配置信息,D1提供内部存储器配置的信息。
//先备份D0和D1到D6和D7,后面会使用D0和D1,
//而D0和D1在系统加电之初保存有芯片相关信息
move.l d0,d6
move.l d1,d7
//初始化RAMBAR1: 定位SRAM并使其生效
//设置RAMBAR1的SPV和V位为1,
//SPV:允许DMA和FEC访问内存
//V :设置SRAM模块有效。
move.l #__SRAM,d0
add.l #0x21,d0
movec d0,RAMBAR1
//初始化IPSBAR
move.l #__IPSBAR,d0
add.l #0x1,d0
move.l d0,0x40000000
//初始化FLASHBAR
move.l #__FLASH,d0
cmp.l #0x00000000,d0
bne change_flashbar
add.l #0x61,d0
movec d0,RAMBAR0
_continue_startup:
//定位堆栈指针
move.l #__SP_INIT,sp
//系统初始化
jsr mcf52233_init
// 备份D0和D1的初始值到RAM,访问d0_reset和d1_reset得到D0和D1的初始值
move.l d6,d0_reset
move.l d7,d1_reset
//跳转到main程序
jsr main
bra .
nop
nop
halt
change_flashbar:
//下面的程序用于设置FLASHBAR。由于可能正在Flash中执行,必须将例程放到
//SRAM中执行,然后使用新地址跳回到Flash。
//下面的指令被编码到SRAM:
//
// move.l #(__FLASH + 0x21),d0
// movec d0, RAMBAR0
// jmp _continue_startup
//选择任意一个SRAM地址,直到载入实地址。
//如果使用默认Flash地址(0x00000000),则不需要该程序
//如果在SRAM中运行,不需要执行change_flashbar
move.l #__SRAM,a0
//将代码"move.l #(__FLASH + 0x21),d0"放入SRAM
move.w #0x203C,d0
move.w d0,(a0)+
move.l #__FLASH,d0
add.l #0x21,d0
move.l d0,(a0)+
//将代码"movec d0,FLASHBAR"放入SRAM
move.l #0x4e7b0C04,d0
move.l d0,(a0)+
//将代码"jmp _continue_startup"放入SRAM
move.w #0x4EF9,d0
move.w d0,(a0)+
move.l #_continue_startup,d0
move.l d0,(a0)+
//跳到内部SRAM的代码段
jmp __SRAM
//==========================================================================
mcf5xxx_wr_cacr:
_mcf5xxx_wr_cacr:
//movec d0,cacr
move.l 4(SP),D0
.long 0x4e7b0002
nop
rts
mcf5xxx_wr_vbr:
_mcf5xxx_wr_vbr:
//movec d0,VBR
move.l 4(SP),D0
.long 0x4e7b0801
nop
rts
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -