主题 : 【裸机】学习2440外部按键中断后的理解和疑问 复制链接 | 浏览器收藏 | 打印
no z no d
级别: 侠客
UID: 12281
精华: 1
发帖: 68
金钱: 750 两
威望: 79 点
贡献值: 1 点
综合积分: 156 分
注册时间: 2010-01-03
最后登录: 2015-08-09
楼主  发表于: 2010-04-16 11:17

 【裸机】学习2440外部按键中断后的理解和疑问

此帖售价 2 金钱,已有 1 人购买
若发现会员采用欺骗的方法获取财富,请立刻举报,我们会对会员处以2-N倍的罚金,严重者封掉ID!
[ 此帖被cumt2009在2015-08-09 22:12重新编辑 ]
附件设置隐藏,需要回复后才能看到
级别: 侠客
UID: 11461
精华: 0
发帖: 89
金钱: 450 两
威望: 93 点
贡献值: 0 点
综合积分: 178 分
注册时间: 2009-12-08
最后登录: 2017-08-29
1楼  发表于: 2010-09-10 20:25
有点不理解:外部按键中断中,当中断发生时,寄存器INTPND,SRCPND,EINTPEND为什么是置1来清除中断请求而不是写0来清除呢?当外部按键没有中断时,寄存器INTPND,SRCPND,EINTPEND中对应的按键中断位会自动写0吗?寄存器INTPND,SRCPND,EINTPEND中各个位的"0=Not occur,1=Occur interrupt"该怎样理解呢

写“1”来清除这个中断是2440的硬件设置的,你只需要遵守这样的游戏规则就可以了,
就像很多其他CPU是只要你读取了这个寄存器,这个寄存器的值就自动清除了一样的道理


没有中断发生时,INTPND,SRCPND,EINTPEND中的所有位都为 0的,
只有当有中断发生了,INTPND,SRCPND,EINTPEND中的中断源对应位会被置1,
这个时候如果你不去清除它的话,下一次中断来了就不会进中断服务函数了,

级别: 侠客
UID: 11461
精华: 0
发帖: 89
金钱: 450 两
威望: 93 点
贡献值: 0 点
综合积分: 178 分
注册时间: 2009-12-08
最后登录: 2017-08-29
2楼  发表于: 2010-09-10 20:35
三、关于中断提示:超级终端提示Dummy_isr error, interrupt number: 5, INTMSK = 0xffffffdf
论坛里面有人求助,看了贴说要把MMU加进去,是这样做的,在Main.c中包含头文件#include "mmu.h" 把
mmu.c和mmu.h加到工程中,接着在主函数中调用MMU_Init();初始化MMU,好像就解决了,不过自己也不知道为什么要这样做,呵呵。


仿真的时候,你的程序是运行在sdram里面的,也就是0x3000_0000处开始运行
你的中断向量表通过仿真器已经放在了0x3000_0000处,

打开mmu是为了把0x3000_0000地址处的值映射到0x0的地方,
因为你的中断向量表是保存在0x0开始的地方,当中断发生时的第一时间
CPU会去0x0地方查中断向量表看是发生了什么中断,是reset还是IRQ还是FIQ还是取数据终止或取指令终止
按键外部中断是IRQ中断,然后CPU会去IRQ开始的地方找到你的中断服务函数,这个时候轮到了你的中断服务函数运行的时间了
所以你不打开MMU就不会进入中断服务函数

还有一种方法就是烧写一个简单的小程序到nandflash的block 0,这个小程序要包含中断向量表
当你上电的时候block 0的东西被CPU复制到了叫作stepping stone的地方,他的地址也是0
这个时候你仿真你的程序,不打开mmu也是可以找到中断服务函数了,因为你有中断向量表了

以上是我个人的一些理解,不一定正确,呵呵