查看: 9674|回复: 10

[分享] 8位单片机中断向量重定向的实现方法 Vector Redirection

[复制链接]
  • TA的每日心情
    无聊
    2019-8-29 13:37
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    18

    主题

    88

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    251
    最后登录
    2022-1-14
    发表于 2016-9-30 16:45:17 | 显示全部楼层 |阅读模式
    实践单片机平台: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的区域
    1.    //ROM                      =  READ_ONLY    0x1900 TO 0xFFAD;
    2.     APP_ROM                  =  READ_ONLY    0x1900 TO 0xEDFF;//应用程序FLASH地址
    3.     ROM_BOOT_CODE            =  READ_ONLY    0xEE00 TO 0xFCFF;//5个sector,共768*5=3840Bytes=
    4.     NOT_USE                  =  READ_ONLY    0xFD00 TO 0xFFAD;  //最后一个包含中断向量的SECTOR
    复制代码
    (2)启动FLASH保护,并确定保护区域(启动区域保护后,单片机会自动重定向中断向量到紧邻保护区的最小位置除,详细请参阅RM4.5.7)
    1. // Initialization of the CPU registers in FLASH
    2. // NVPROT: FPS7=1,FPS6=1,FPS5=1,FPS4=1,FPS3=1,FPS2=1,FPS1=0,FPDIS=0
    3. const unsigned char NVPROT_INIT @0x0000FFBD = 0xFC;//0xFC;    NVPROT_FPS = 0x3C//保护区域:0xEE00–0xFFFF   EEPROM不保护
    4. // NVOPT: KEYEN=0,FNORED=0,SEC01=1,SEC00=0
    5. const unsigned char NVOPT_INIT @0x0000FFBF = 0x3E;
    复制代码
    (3)擦除FLASH的时候,不需要对默认向量地址所在的SECTOR进行擦除
    2、应用程序需要做的:
    (1)定义中断向量数组,并且给数组分配直接地址到重定向后的地址
    1. interrupt void Dummy_ISR(void)
    2. {

    3. }
    4. void (* near const _vect[])() @0xEDC0 = { /* Interrupt vector table */
    5.          Dummy_ISR,             // #define VectorNumber_Vacmp2             31
    6.          Dummy_ISR,             // #define VectorNumber_Vacmp1             30
    7.          Dummy_ISR,             // #define VectorNumber_Vcantx             29
    8.          CAN_RECEIVE,           // #define VectorNumber_Vcanrx             28
    9.          Dummy_ISR,             // #define VectorNumber_Vcanerr            27
    10.          Dummy_ISR,             // #define VectorNumber_Vcanwu             26
    11.          Dummy_ISR,             // #define VectorNumber_Vrtc               25
    12.          Dummy_ISR,             // #define VectorNumber_Viic               24
    13.          Dummy_ISR,             // #define VectorNumber_Vadc               23
    14.          Dummy_ISR,             // #define VectorNumber_Vport              22
    15.          Dummy_ISR,             // #define VectorNumber_Vsci2tx            21
    16.          Dummy_ISR,             // #define VectorNumber_Vsci2rx            20
    17.          Dummy_ISR,             // #define VectorNumber_Vsci2err           19
    18.          Dummy_ISR,             // #define VectorNumber_Vsci1tx            18
    19.          Dummy_ISR,             // #define VectorNumber_Vsci1rx            17
    20.          Dummy_ISR,             // #define VectorNumber_Vsci1err           16
    21.          Dummy_ISR,             // #define VectorNumber_Vspi               15
    22.          Dummy_ISR,             // #define VectorNumber_Vtpm2ovf           14
    23.          Dummy_ISR,             // #define VectorNumber_Vtpm2ch1           13
    24.          Dummy_ISR,             // #define VectorNumber_Vtpm2ch0           12
    25.          Dummy_ISR,             // #define VectorNumber_Vtpm1ovf           11
    26.          Dummy_ISR,             // #define VectorNumber_Vtpm1ch5           10
    27.          Dummy_ISR,             // #define VectorNumber_Vtpm1ch4           9
    28.          Dummy_ISR,             // #define VectorNumber_Vtpm1ch3           8
    29.          Dummy_ISR,             // #define VectorNumber_Vtpm1ch2           7
    30.          Dummy_ISR,             // #define VectorNumber_Vtpm1ch1           6
    31.          TPM_inter,             // #define VectorNumber_Vtpm1ch0           5
    32.          Dummy_ISR,             // #define VectorNumber_Vlol               4
    33.          Dummy_ISR,             // #define VectorNumber_Vlvd               3
    34.          IRQ_ISR,               // #define VectorNumber_Virq               2
    35.          Dummy_ISR,             // #define VectorNumber_Vswi               1
    36. };

    37. #endif
    复制代码
    (2)把用到的中断向量函数名称替代相应位置的Dummy_ISR函数,并且中断函数也要仿照Dummy_ISR进行定义

    通过上述步骤,我成功完成了中断向量重定向的功能,应用程序中断运行正常。这两天查阅了,NXP官网论坛中的大量讨论和资料,再此谢过。


    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-12-6 16:47
  • 签到天数: 27 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    2

    主题

    318

    帖子

    0

    高级会员

    Rank: 4

    积分
    759
    最后登录
    2018-2-24
    发表于 2016-9-30 17:02:50 | 显示全部楼层
    感谢分享!
    110038az4g35rg4sggkott.png
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2019-8-29 13:37
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    18

    主题

    88

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    251
    最后登录
    2022-1-14
     楼主| 发表于 2016-10-12 09:50:46 | 显示全部楼层
    为解决重定向中断向量后,应用程序的仿真问题,在应用程序中添加NVPROT和NVOPT的配置
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-9 14:16
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2250
    最后登录
    2024-6-11
    发表于 2016-11-2 14:00:48 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    帖子

    0

    新手上路

    Rank: 1

    积分
    18
    最后登录
    2017-7-20
    发表于 2017-1-21 10:22:27 | 显示全部楼层
    可以问楼主那份数据手册的名字叫什么吗?
    我在官网搜4.5.7 Vector Redirection搜不到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2019-8-29 13:37
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    18

    主题

    88

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    251
    最后登录
    2022-1-14
     楼主| 发表于 2017-4-14 10:15:09 | 显示全部楼层
    一切中会消逝 发表于 2017-1-21 10:22
    可以问楼主那份数据手册的名字叫什么吗?
    我在官网搜4.5.7 Vector Redirection搜不到 ...

    就是芯片的datasheet
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    29

    帖子

    0

    注册会员

    Rank: 2

    积分
    75
    最后登录
    2018-9-25
    发表于 2018-8-18 10:12:29 | 显示全部楼层
    楼主你好 ,您好我想问一下BootLoader程序和APP程序中的复位向量如何处理,如果APP中的复位向量不从定向的话,岂不是和BootLoader程序的复位向量重叠了?这块没搞明白
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2019-8-29 13:37
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    18

    主题

    88

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    251
    最后登录
    2022-1-14
     楼主| 发表于 2018-12-19 10:55:45 | 显示全部楼层
    renjieyanhong 发表于 2018-8-18 10:12
    楼主你好 ,您好我想问一下BootLoader程序和APP程序中的复位向量如何处理,如果APP中的复位向量不从定向的 ...

    不好意思,很久没来论坛了。
    关于这个问题有两个方法来处理:
    1、在BootLoader中需要特殊处理复位向量,不对默认复位向量进行覆盖;
    2、bootloader和app正和到一个项目中,关闭应用程序的复位向量。
    prm文件中:
    HEXFILE S12G128Bootloader.abs.s19  //与BootLoader联合
    //VECTOR 0 _Startup
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 20:40
  • 签到天数: 1877 天

    连续签到: 2 天

    [LV.Master]伴坛终老

    203

    主题

    3万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    112731
    最后登录
    2025-9-6
    发表于 2018-12-24 08:33:35 | 显示全部楼层
    写的不错啊
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    2

    帖子

    0

    新手上路

    Rank: 1

    积分
    26
    最后登录
    2020-5-12
    发表于 2018-12-26 16:26:35 | 显示全部楼层
    你好,那两个寄存器的设置,FLASH块的保护是在BOOTLOADER里设置,通过BDM下载么?这样一弄,好像BOOTLOADER自己都运行不起来了,不会进入CAN接收中断了。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-6 16:22 , Processed in 0.114085 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表