打印
[ARM9、LPC]

LPC1788跳转SDRAM,加入中断无法运行

[复制链接]
1609|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yang5223536|  楼主 | 2015-11-9 11:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人使用芯片为LPC1788,开发工具是MDK,使用ULINK调试工具(SDRAM起始地址为0xA0000000)
在经过一些努力,终于可以实现应用程序跳转到SDRAM中运行,但是不加中断的情况下,程序可以正常运行!一旦加入中断,程序无法进入中断
    中断向量表我是这样写的:(中断向量表想映射到SRAM里,原因是由于只支持1G空间的映射)
volatile u8 int_vector_table[64] __attribute__((at(0x10000000)));
void init_interrupt_controller(void)
{
volatile const u8 *org_table = (u8*)0xA0000000;
int i;

for(i=0;i<1024;i++)
{
int_vector_table[i]=org_table[i];
}
}
init_interrupt_controller();
SCB->VTOR = 0x10000000;
做了一些实验,调试中memory中 显示0xA0000000和0x10000000内容一致
期望大神的帮助和解答

相关帖子

沙发
yang5223536|  楼主 | 2015-11-9 13:05 | 只看该作者
自己顶一下~ 大神求出现啊~

使用特权

评论回复
板凳
阿南| | 2015-11-9 17:14 | 只看该作者
产生中断后,程序跑到初实的中断向量表那里去了(比如0x0地址开始处),而楼主初始的中断向量表又不正常,所以当产生中断后程序就飞了。

使用特权

评论回复
地板
yang5223536|  楼主 | 2015-11-9 18:19 | 只看该作者
阿南 发表于 2015-11-9 17:14
产生中断后,程序跑到初实的中断向量表那里去了(比如0x0地址开始处),而楼主初始的中断向量表又不正常, ...

我写了测试程序,没有回到初始。程序也没有跑飞,程序一直在跑,但是给个串口中断没有反应,上边的数组的值和循环的值不匹配的问题是我之前用u32跑的,然后改了u8,忘记改就放上来了
我的映射表是0x00到0x400是有效映射(支持VTOR向量表偏移寄存器),但不支持MEMMAP寄存器

使用特权

评论回复
5
yang5223536|  楼主 | 2015-11-9 18:27 | 只看该作者
阿南 发表于 2015-11-9 17:14
产生中断后,程序跑到初实的中断向量表那里去了(比如0x0地址开始处),而楼主初始的中断向量表又不正常, ...

哦,不好意思!可能上边描述的不清楚,目前板子完成了在flash中运行,且没有问题。现在,需要在flash运行的时候下载一个.bin,然后.bin在SDRAM中运行(.bin为独立的一套程序,且期望不与flash的程序冲突),这样就完成了一个由flash跳转到SDRAM的过程,现在程序不加中断的情况可以跑(while1循环)。但是加入中断,程序依然可以跑,但是我给串口一个中断,它并未响应,且没有执行相应中断处理函数

使用特权

评论回复
6
阿南| | 2015-11-9 20:26 | 只看该作者
测试下是否进入中断向量表,如果没有进入则串口的中断标志是否已经有效

使用特权

评论回复
7
yang5223536|  楼主 | 2015-11-10 09:02 | 只看该作者
阿南 发表于 2015-11-9 20:26
测试下是否进入中断向量表,如果没有进入则串口的中断标志是否已经有效

我可以监控是否进入中断处理函数,但是怎么测试是否进入中断向量表啊?
我的这个中断向量表有点特别的。跳转到SDRAM后,中断向量表在0xA0000000的地址上,但是VTOR中断偏移寄存器支持在1G的空间。所以,我把0xA0000000的中断向量表拷贝到了0x10000000的地址上了
目的:希望在0xA0000000开始运行后,当发生中断时,可以到0x10000000地址查表,然后进行中断处理
另外,SDRAM的程序基本无法打断点调试的,只能通过反汇编观察其运行状态(基本状态)

使用特权

评论回复
8
阿南| | 2015-11-10 09:20 | 只看该作者
如果有仿真器或调试器,SDRAM的断点通常没有限制的。你也可以在函数中从某个GPIO口中加指示灯等。CPU产生IRQ中断后他只会到一个固定地址,而且是唯一的,不管你的向量表在哪里。所以先确定这个固定地址在哪,且已经跑到该地址处,否则没有产生中断。

使用特权

评论回复
9
yang5223536|  楼主 | 2015-11-10 14:45 | 只看该作者
阿南 发表于 2015-11-10 09:20
如果有仿真器或调试器,SDRAM的断点通常没有限制的。你也可以在函数中从某个GPIO口中加指示灯等。CPU产生IR ...

我的是两套程序
1.我的主程序为FLASH启动,我设置中断什么的完全没问题的(中断会响应,会处理)
2.我的副程序为SDRAM上运行。运行是在FLASH主程序运行时(加载.bin到SDRAM地址),我给串口中断,
   然后进入中断处理,处理方式为跳转到SDRAM后运行SDRAM
3.在这个过程中,SDRAM运行了(while1或者亮灯),当我再使用串口中断的时候
   a.程序一直在运行(while1),给予中断,无响应
   b.检测中断是否产生
测试:在SDRAM中程序运行时,给串口中断,观察中断在哪里响应
1.程序未跳到FLASH内的中断处,2.中断也未跳到SDRAM内的中断处
使用仿真器,无法去为SDRAM内部的程序打断点,因为SDRAM里跑的是一个生成的.bin二进制文件
版主,是不是中断可能跑到了boot处?boot那里我没有办法测试。。。

使用特权

评论回复
10
阿南| | 2015-11-10 16:53 | 只看该作者
如果你能确定:程序一直在while里运行(可在while内闪烁亮灯),说明你的中断确实没有响应。因为如果响应,中断向量表又不正常,程序一定会是飞的。所以最好检查下中断mask等,这些是否已经打开,也可以想办法读出IRQ中断标志以确认是否有中断产生

使用特权

评论回复
11
yang5223536|  楼主 | 2015-11-10 18:06 | 只看该作者
阿南 发表于 2015-11-10 16:53
如果你能确定:程序一直在while里运行(可在while内闪烁亮灯),说明你的中断确实没有响应。因为如果响应, ...

想我这样的情况,配置中断向量表应该注意哪些方面呢?
我觉得我这边主要是中断向量表映射的有问题,本身程序应该在0xA0000000的地址上运行,向量表也在这个位置。但是由于芯片不支持的问题,这能把向量表拷贝到SRAM内(0x10000000的位置)。。。但程序是在0xA0000000这个位置跑的。。。好纠结啊~
版主,救俺一命嘞~

使用特权

评论回复
12
阿南| | 2015-11-10 19:42 | 只看该作者
10楼已经解释了,如果你确定一直在while里执行,说明还没有到向量表那里,你应该先查找处理器外设的中断的设置问题

使用特权

评论回复
13
yang5223536|  楼主 | 2015-11-11 19:03 | 只看该作者
阿南 发表于 2015-11-10 19:42
10楼已经解释了,如果你确定一直在while里执行,说明还没有到向量表那里,你应该先查找处理器外设的中断 ...

有没有可能是,芯片不支持这样的查表方式  程序放在0xA0000000 表放在0x10000000
我中断这边设置 就是1楼的那些代码  中断是使能的 可以看到中断由PC发出了

使用特权

评论回复
14
阿南| | 2015-11-11 20:56 | 只看该作者
yang5223536 发表于 2015-11-11 19:03
有没有可能是,芯片不支持这样的查表方式  程序放在0xA0000000 表放在0x10000000
我中断这边设置 就是1 ...

具体要看芯片手册了:lol

使用特权

评论回复
15
yang5223536|  楼主 | 2015-11-12 13:31 | 只看该作者
阿南 发表于 2015-11-11 20:56
具体要看芯片手册了

谢谢您这段时间的指导,为我提供了不一样的思路和想法
在研究过程中,您说的点,都是必要的操作方式。让我在这方面收货良多。
在这里,真心的感谢~

使用特权

评论回复
16
阿南| | 2015-11-12 20:37 | 只看该作者
呵呵,客气:)

使用特权

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

本版积分规则

6

主题

23

帖子

0

粉丝