MC9S12XS128 MAL BootLoader(2)

用户程序就按照正常程序写即可,需要注意以下几点

  1. 程序写入固定的位置,不能和BootLoader程序的位置重合,否则有可能程序无法经过BootLoader下载后运行,同样也是在prm中进行相应的操作;
  2. 需要用到中断的,要对中断向量进行偏移;
  3. 对起始向量进行偏移;
  4. 写入地址对齐。

 

1.BootLoader程序写入固定位置:

 

   ROM_C000      = READ_ONLY   DATA_NEAR IBCC_NEAR  0xC000 TO   0xEFDF;

 确保不会和BootLoader的F000开始的地址重合;

 

 

INTO  ROM_C000/*, ROM_4000*/;

 

2.对中断向量进行偏移,中断发生时,将当前PC位置压入堆栈中,然后通过中断向量找到当前中断函数,一个中断向量不能对应两个中断函数地址;

中断向量的偏移,首先要定义如下的中断向量表,其中对于不用的中断用Unimplemented_ISR表示,再在main函数中令中断偏移寄存器IVBR=0x7F。

 

3.起始向量的偏移,起始向量即程序最开始PC指针要指向的地址,默认为FFFE,如果偏移,那么该程序是没法直接运行的,只有在BootLoader中运行,所以我们是在使用上位机发送该程序S19文件时,需要将FFFE这一行中的FFFE改为我们需要的地址。

 

4.在使用上位机传输S19文件时,有部分地址是与FLASH写操作地址不对齐的,比如FFFE,那么需要我们补齐FFF0~FFFD地址的数据为FF;

 

 

#pragma CODE_SEG NON_BANKED

interrupt void Unimplemented_ISR(void)

{

  asm BGND; //software breakpoint

}

#pragma CODE_SEG DEFAULT

 

 

 

typedef void (*near tIsrFunc)(void);

const tIsrFunc VectorTable[] @0xEF10 =

{

  Unimplemented_ISR,    // Vector base + 0x10   Spurious interrupt

  Unimplemented_ISR,    // Vector base + 0x12   System Call Interrupt (SYS)

  Unimplemented_ISR,    // Vector base + 0x14   Reserved

  Unimplemented_ISR,    // Vector base + 0x16   Reserved

  Unimplemented_ISR,    // Vector base + 0x18   Reserved

  Unimplemented_ISR,    // Vector base + 0x1A   Reserved

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值