MC9S12XS128MAL Bootloader(1)
2021-07-22 来源:eefocus
首先BootLoader和用户程序是两个工程,两个工程代码通过修改PRM文件存储在不同的flash中,在通过PC指针的跳转实现两个工程的切换;
BootLoader程序
关中断
初始化时钟;
初始化CAN
初始化flash读写;
开中断,开CAN中断;
计时判断CAN是否收到bootloader开始报文;
时间到后没收到跳转到原用户程序启动向量;
收到后,开始读写flash,读写完后,PC指针跳转到用户程序地址(EEFE);
其中flash程序在读写flash时,要把代码copy到RAM中,因读写时不能再读flash中的代码
extern char __SEG_START_RAM_CODE[] ;
extern char __SEG_END_RAM_CODE[];
extern char __SEG_SIZE_RAM_CODE ;
void CopyCodeToRAM(void)
{
memcpy((unsigned char *)0x3E00, (unsigned char *) __SEG_START_RAM_CODE,(unsigned int) __SEG_SIZE_RAM_CODE);
} //要写入的RAM地址0x3E00; RAM_CODE是在prm中定义的需要复制到ram中的地址区域;
写完后再使用下代码跳转到EEFE;
_asm ldx $eefe;
_asm jmp 0,x;
Prm文件中修改如下,是代码压入指定位置:
ROM_F000 = READ_ONLY DATA_NEAR IBCC_NEAR 0XF000 TO 0xF5FF;
ROM_FB00 = READ_ONLY DATA_NEAR IBCC_NEAR 0XF600 TO 0xFDFF;
PLACEMENT
_PRESTART,
STARTUP, /* startup data structures */
ROM_VAR, /* constant variables */
STRINGS, /* string literals */
VIRTUAL_TABLE_SEGMENT, /* C++ virtual table segment */
NON_BANKED, /* runtime routines which must not be banked */
COPY
INTO ROM_F000/*, ROM_4000*/;
DEFAULT_ROM INTO ROM_FB00; //