打印
[技术问答]

关于NUC972中断向量表的问题

[复制链接]
2663|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
有际有际|  楼主 | 2017-9-29 15:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在在做一个NUC972的串口IAP程序。
1、我自己写了一个IAP程序,用来接收串口的APP二进制代码。IAP程序的执行地址是0x0,存放在SPI中0x0开始的地方;
2、现在选择SPI启动,将SPI里面的IAP程序加载到DDR中0x0地址开始的地方运行,并从串口接收APP二进制代码文件,存放到DDR的0x0020 0000的地方。这个APP程序的执行地址也是0x0020 0000;
3、等IAP程序将APP二进制文件接收完成并存放在DDR中0x0020 0000开始的地方之后,再从IAP跳转到地址为0x0020 0000的地方去执行APP程序。

这种情况下,如果APP程序发生中断,系统会跳到哪里去查找中断向量表?能不能找到APP中断服务程序的入口地址?


请大神指点一哈
沙发
heisexingqisi| | 2017-9-29 17:19 | 只看该作者
应该是可以的,中断向量程序都有地址入口,发生了就去那个地方,结束了就退回之前的位置。

使用特权

评论回复
板凳
有际有际|  楼主 | 2017-9-29 19:07 | 只看该作者
heisexingqisi 发表于 2017-9-29 17:19
应该是可以的,中断向量程序都有地址入口,发生了就去那个地方,结束了就退回之前的位置。 ...

但是PC指针要跳到中断服务程序去执行的话,必须要去中断向量表对应的位置取出中断服务程序的入口地址,把这个地址赋给PC,这样PC才能跳过去啊。但是据我所知ARM的中断向量表都是放到0x0开始的地方的,那当APP发生中断时PC应该是在0x0开始的地方去找中断服务函数的入口地址吧。可是APP的中断向量表是在0x0020 0000的地方。这样的话PC又怎么能进APP程序的中断服务函数呢。

使用特权

评论回复
地板
21mengnan| | 2017-9-30 20:02 | 只看该作者
实在不确定,就写个简单的测试例子看看。看看运行效果。

使用特权

评论回复
5
y182510421| | 2017-10-26 22:43 | 只看该作者
我这里也在用NUC972 实现 IAP 功能,请问您这里是用GCC 编译出bin的么?
ARM9 应该是直接跳转到以0x0 开始的地址  做中断!
目前你这里做的结果如何?

使用特权

评论回复
6
mugenwon| | 2017-10-31 11:08 | 只看该作者
我也碰到类似问题。打算用的是是M0,但刚接触正在看资料。
我搜索过,在STM32F0系列的有类似资料,说是因为没有中断向量表入口寄存器(M3有我正常使用,但是M0没有),必须把0开始放中断向量表的内容放到sram去,再做重映射。但从datasheet没看到具体操作的方法。原帖也是个函数,在新唐的例程也没有这种函数。

使用特权

评论回复
7
mugenwon| | 2017-10-31 11:17 | 只看该作者
多说2句,程序起始存放地址为0. IAP程序范围就从0~0x0fff(4K字节),AP程序放在0x1000后面。IAP程序没有中断,而AP程序肯定有中断。开机从IAP程序开始执行,能够刷写AP程序。但是AP程序一旦中断,就会从0x4开始的表格找中断向量入口地址。偏偏这地方是IAP的势力范围,所以如果不做处理根本无法使用AP的中断功能。

使用特权

评论回复
8
有际有际|  楼主 | 2017-11-7 10:54 | 只看该作者
y182510421 发表于 2017-10-26 22:43
我这里也在用NUC972 实现 IAP 功能,请问您这里是用GCC 编译出bin的么?
ARM9 应该是直接跳转到以0x0 开始 ...

嗯,我的IAP功能已经做好了。有什么问题可以相互交流一下啊。

使用特权

评论回复
9
有际有际|  楼主 | 2017-11-7 10:58 | 只看该作者
mugenwon 发表于 2017-10-31 11:08
我也碰到类似问题。打算用的是是M0,但刚接触正在看资料。
我搜索过,在STM32F0系列的有类似资料,说是因为 ...

嗯,是的。新唐NUC970库里面没有这种。问一句:M0没有内部Flash的吗?要不然为什么要复制到sram里面去。我没用过M0内核的单片机。

使用特权

评论回复
10
有际有际|  楼主 | 2017-11-7 11:01 | 只看该作者
mugenwon 发表于 2017-10-31 11:17
多说2句,程序起始存放地址为0. IAP程序范围就从0~0x0fff(4K字节),AP程序放在0x1000后面。IAP程序没有中断 ...

你说的是M0内核的中断方式吧?所以像M3的话专门有一个中断向量表重映射的函数。不知道你M0单片机库函数有没有这个功能。如果没有的话得想其他的办法。

使用特权

评论回复
11
有际有际|  楼主 | 2017-11-7 11:02 | 只看该作者
y182510421 发表于 2017-10-26 22:43
我这里也在用NUC972 实现 IAP 功能,请问您这里是用GCC 编译出bin的么?
ARM9 应该是直接跳转到以0x0 开始 ...

没有,我是用的keil编译的bin

使用特权

评论回复
12
mugenwon| | 2017-11-13 09:47 | 只看该作者
现在IAP能实现了。只需要从LDROM启动,然后就能刷新APROM。datasheet说的不是太明白(还是我理解能力差),以为LDROM代码不能刷写APROM代码前4K字节,结果看了例程发现是可以的。
不管你IAP还是ISP,反正从LDROM启动,就能刷写APROM全部。顺手贴段简单测试程序
       
        //=====================
        //IAP测试
        //=====================
        unlockreg();
        CLK->AHBCLK |=0x04;                                //允许ISP时钟
        FMC->ISPCON |=0x01;                               
        FMC_Erase_User(0);                                //刷了从0开始的512字节
        FMC_Write_User(0x00000000, 0x12345678);//把4字节数据写到0地址
       
        CLK->AHBCLK &=~0x00000004;                //关闭ISP时钟
        FMC->ISPCON &=~0x00000003;                //改为从APROM启动,关ISP
        lockreg();
        //LED_ON;
       
        SYS->RSTSRC=3;                                        //清除上电和复位脚复位标志
        SCB->AIRCR=0x05FA0004;                        //系统复位

其中的函数新唐例程里面有。

使用特权

评论回复
13
有际有际|  楼主 | 2017-11-14 14:28 | 只看该作者
mugenwon 发表于 2017-11-13 09:47
现在IAP能实现了。只需要从LDROM启动,然后就能刷新APROM。datasheet说的不是太明白(还是我理解能力差), ...

你用的是哪一款芯片?这和新唐的NUC972还是有点差别的,新唐的程序都是在DDR里面运行的没有APROM这个概念。不过总的来说方法都差不多

使用特权

评论回复
14
gejigeji521| | 2017-11-14 14:50 | 只看该作者
有际有际 发表于 2017-11-14 14:28
你用的是哪一款芯片?这和新唐的NUC972还是有点差别的,新唐的程序都是在DDR里面运行的没有APROM这个概念 ...

他说的应该是那些低级的单片机应用。

使用特权

评论回复
15
有际有际|  楼主 | 2017-11-14 19:28 | 只看该作者
gejigeji521 发表于 2017-11-14 14:50
他说的应该是那些低级的单片机应用。

噢?为什么这么说呢?还有什么算是低级的单片机?(对这一块了解的少)

使用特权

评论回复
16
yiyigirl2014| | 2017-11-15 11:24 | 只看该作者
他说的低级单片机应该就是只适合裸奔跑单线程,顺序执行那种的。

使用特权

评论回复
17
yiyigirl2014| | 2017-11-15 11:24 | 只看该作者
Cortex-M系列。。

使用特权

评论回复
18
一周一天班| | 2017-11-15 13:27 | 只看该作者
你做的太复杂了,我这样做的:首先了解nuwriter烧写时存储结构,程序直接包含iap功能,需要执行时按nuwriter存储格式直接在程序区写flash.写完自动复位就ok.

使用特权

评论回复
19
leiwu2002| | 2020-3-13 15:30 | 只看该作者
你好, 我的NUC972跑的是祼奔程序, 想加上IAP功能, 请指点一下, 有例程参考一下吗

使用特权

评论回复
20
leiwu2002| | 2020-3-16 10:20 | 只看该作者
一周一天班 发表于 2017-11-15 13:27
你做的太复杂了,我这样做的:首先了解nuwriter烧写时存储结构,程序直接包含iap功能,需要执行时按nuwriter ...

NUC972芯片,我也想加入IAP功能,能指点一二吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

38

帖子

2

粉丝