在线时间28 小时
UID113945
注册时间2008-3-21
NXP金币0
TA的每日心情 | 无聊 2019-8-29 13:37 |
---|
签到天数: 6 天 连续签到: 1 天 [LV.2]偶尔看看I
中级会员
 
- 积分
- 251
- 最后登录
- 2022-1-14
|
实践单片机平台:S08DZ60
为什么需要向量重定向:
在制作BOOTLOADER的时候,如果不对向量重定向,那么应用程序的中断向量所在FLASH位置和BOOTLOADER中断向量(至少占用复位向量)都处于一个FLASH SECTOR,那么在写入应用程序中断向量地址数据的时候,首先需要对其所在的SECTOR进行擦除,因为FLASH SECTOR 的大小要么512字节、要么768字节,这样势必会擦除BOOTLOADER的复位向量。因此写入应用程序中断向量地址之前,还需要重新写入BOOTLOADER的复位向量,这样对BOOTLOADER就进行了擦写操作,实际使用的时候可能没多大问题,但是毕竟存在安全隐患,一旦擦除向量SECTOR 的瞬间系统掉电,则BOOTLOADER的复位向量被改变,则BOOTLOADER本身都不能运行了,系统成为砖头;
中断向量的实现方法:
详细解释请参阅数据手册4.5.7 Vector Redirection;
1、BOOTLOADER中的处理:
(1)PRM文件分隔好BOOTLOADER和APP所在FLASH的区域
- //ROM = READ_ONLY 0x1900 TO 0xFFAD;
- APP_ROM = READ_ONLY 0x1900 TO 0xEDFF;//应用程序FLASH地址
- ROM_BOOT_CODE = READ_ONLY 0xEE00 TO 0xFCFF;//5个sector,共768*5=3840Bytes=
- NOT_USE = READ_ONLY 0xFD00 TO 0xFFAD; //最后一个包含中断向量的SECTOR
复制代码 (2)启动FLASH保护,并确定保护区域(启动区域保护后,单片机会自动重定向中断向量到紧邻保护区的最小位置除,详细请参阅RM4.5.7)- // Initialization of the CPU registers in FLASH
- // NVPROT: FPS7=1,FPS6=1,FPS5=1,FPS4=1,FPS3=1,FPS2=1,FPS1=0,FPDIS=0
- const unsigned char NVPROT_INIT @0x0000FFBD = 0xFC;//0xFC; NVPROT_FPS = 0x3C//保护区域:0xEE00–0xFFFF EEPROM不保护
- // NVOPT: KEYEN=0,FNORED=0,SEC01=1,SEC00=0
- const unsigned char NVOPT_INIT @0x0000FFBF = 0x3E;
复制代码 (3)擦除FLASH的时候,不需要对默认向量地址所在的SECTOR进行擦除
2、应用程序需要做的:
(1)定义中断向量数组,并且给数组分配直接地址到重定向后的地址- interrupt void Dummy_ISR(void)
- {
-
- }
- void (* near const _vect[])() @0xEDC0 = { /* Interrupt vector table */
- Dummy_ISR, // #define VectorNumber_Vacmp2 31
- Dummy_ISR, // #define VectorNumber_Vacmp1 30
- Dummy_ISR, // #define VectorNumber_Vcantx 29
- CAN_RECEIVE, // #define VectorNumber_Vcanrx 28
- Dummy_ISR, // #define VectorNumber_Vcanerr 27
- Dummy_ISR, // #define VectorNumber_Vcanwu 26
- Dummy_ISR, // #define VectorNumber_Vrtc 25
- Dummy_ISR, // #define VectorNumber_Viic 24
- Dummy_ISR, // #define VectorNumber_Vadc 23
- Dummy_ISR, // #define VectorNumber_Vport 22
- Dummy_ISR, // #define VectorNumber_Vsci2tx 21
- Dummy_ISR, // #define VectorNumber_Vsci2rx 20
- Dummy_ISR, // #define VectorNumber_Vsci2err 19
- Dummy_ISR, // #define VectorNumber_Vsci1tx 18
- Dummy_ISR, // #define VectorNumber_Vsci1rx 17
- Dummy_ISR, // #define VectorNumber_Vsci1err 16
- Dummy_ISR, // #define VectorNumber_Vspi 15
- Dummy_ISR, // #define VectorNumber_Vtpm2ovf 14
- Dummy_ISR, // #define VectorNumber_Vtpm2ch1 13
- Dummy_ISR, // #define VectorNumber_Vtpm2ch0 12
- Dummy_ISR, // #define VectorNumber_Vtpm1ovf 11
- Dummy_ISR, // #define VectorNumber_Vtpm1ch5 10
- Dummy_ISR, // #define VectorNumber_Vtpm1ch4 9
- Dummy_ISR, // #define VectorNumber_Vtpm1ch3 8
- Dummy_ISR, // #define VectorNumber_Vtpm1ch2 7
- Dummy_ISR, // #define VectorNumber_Vtpm1ch1 6
- TPM_inter, // #define VectorNumber_Vtpm1ch0 5
- Dummy_ISR, // #define VectorNumber_Vlol 4
- Dummy_ISR, // #define VectorNumber_Vlvd 3
- IRQ_ISR, // #define VectorNumber_Virq 2
- Dummy_ISR, // #define VectorNumber_Vswi 1
- };
- #endif
复制代码 (2)把用到的中断向量函数名称替代相应位置的Dummy_ISR函数,并且中断函数也要仿照Dummy_ISR进行定义
通过上述步骤,我成功完成了中断向量重定向的功能,应用程序中断运行正常。这两天查阅了,NXP官网论坛中的大量讨论和资料,再此谢过。
|
|