用户程序就按照正常程序写即可,需要注意以下几点
- 程序写入固定的位置,不能和BootLoader程序的位置重合,否则有可能程序无法经过BootLoader下载后运行,同样也是在prm中进行相应的操作;
- 需要用到中断的,要对中断向量进行偏移;
- 对起始向量进行偏移;
- 写入地址对齐。
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