[PIC®/AVR®/dsPIC®产品] bootloader中断向量表怎么重映射

[复制链接]
2384|9
 楼主| jlyuan 发表于 2021-10-11 23:21 | 显示全部楼层 |阅读模式
本帖最后由 pzsh 于 2021-10-13 21:07 编辑

PIC24F的片子,在bootloader程序和app程序中都有中断,那在切换到app程序中时怎么重映射中断向量表呢
wuhany 发表于 2021-10-11 23:23 | 显示全部楼层
可以先参考一下16bit的bootloader,使用MCC可以直接选择要REMAP的中断到Applicaiton。
https://www.microchip.com/SWLibraryWeb/product.aspx?product=16-bit-Bootloader
shimx 发表于 2021-10-11 23:27 | 显示全部楼层
也可以参考AN1157
https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en533906
 楼主| jlyuan 发表于 2021-10-11 23:30 | 显示全部楼层
你可以大概讲解一下app中断向量表跳转过程吗,看AN1157我的个人理解是,bootloader的gld文件中先写好bootloader和app的中断向量表,然后在app程序中调用中断时按地址调用,一种是按void __attribute__((__interrupt__,address(0x3000 + 0x0EC),__no_auto_psv__)) _USB1Interrupt(void)调用,另一种是按void __attribute__ ((address(0x3000 + 0x0EC))) ISRTable()进行跳转的。
zhaoxqi 发表于 2021-10-11 23:32 | 显示全部楼层
简单的理解就是bootloader将自己的IRQ向量表中要转出去的IRQ,放一个GOTO xxx汇编指令,这个xxx就是Application IRQ的入口地址,所以Bootloader需要知道Application的IRQ表的地址(MCC支持图形化配置相关的地址),这个方法并不需要改gld文件,也是新的16bit bootloader的实现方式。当然如果MCU支持AIVT也可以用直接切中断向量表,这个在application中切就可以了(https://microchipdeveloper.com/faq:2702)

下面是讲解16bit interrupt的文档可以参考。
https://microchipdeveloper.com/16bit:exceptions
http://ww1.microchip.com/downloads/en/DeviceDoc/39707a.pdf
 楼主| jlyuan 发表于 2021-10-11 23:36 | 显示全部楼层
我用过切换AIVT的方法 ,但是app的中断还是没起来
 楼主| jlyuan 发表于 2021-10-11 23:38 | 显示全部楼层
boot的主程序是这样的:
int main(void)

{

    bool Init;

    INTCON2bits.ALTIVT = 1;

    SYSTEM_Initialize();

    if(_RB5 == 1)  //button press

    {

        INTCON2bits.ALTIVT = 0;

        __asm__("goto 0x3000");

    }

    Init = Initialize();



    while(1)

    {   

        if (Init)

        ProcessCommand();

        else

        {

        }

    }

    return 1;

}
 楼主| jlyuan 发表于 2021-10-11 23:40 | 显示全部楼层
在我的boot程序里导入不带中断的app程序运行是正常的,换了带中断的程序就不运行了,有没有大神指导一下
match007 发表于 2021-10-12 10:57 | 显示全部楼层
app程序的问题吧,单独跑呢?什么情况
pzsh 发表于 2021-10-13 21:06 | 显示全部楼层
看看应用笔记文档应该有帮助
您需要登录后才可以回帖 登录 | 注册

本版积分规则

880

主题

12030

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部