历史上的今天

今天是:2024年10月13日(星期日)

正在发生

2018年10月13日 | S3C2440、S3C6410、S5PV210中断解析

发布者:九九归一74 来源: eefocus关键字:S3C2440  S3C6410  S5PV210  中断解析 手机看文章 扫描二维码
随时随地手机看文章

写完S5PV210的按键中断程序后,我才知道"6410只是一个过渡产品"确实是正确的,为什么这样说呢?下面我就给大家进行详细的阐述:

中断处理过程等等我就不讲了,一期视频里面已经讲得非常详细了,建议大家在学习本章前,把2440和6410的关于中断的视频再看一次。接下来,我就直接对比他们吧:

(1).对于2440:

中断向量只出现在start.s开始部分,类容如下:

.globl _start

_start:    b       reset

    ldr    pc, _undefined_instruction

    ldr    pc, _software_interrupt

    ldr    pc, _prefetch_abort

    ldr    pc, _data_abort

    ldr    pc, _not_used

    ldr    pc, _irq

    ldr    pc, _fiq

也就是说,中断向量的入口地址是固定的!!

(2).对于6410:

中断向量不仅出现在start.s开始部分,类容如下:

.globl _start

_start:    b       reset

    ldr    pc, _undefined_instruction

    ldr    pc, _software_interrupt

    ldr    pc, _prefetch_abort

    ldr    pc, _data_abort

    ldr    pc, _not_used

    ldr    pc, _irq

    ldr    pc, _fiq

还引入了向量地址寄存器(即VICxADDRESS),它会进一步存储中断处理函数的入口地址,详细类容,请大家学习一期的6410的视频的相关章节。

(注意:关于6410的讲述可能有问题,因为我没有6410开发板,无法验证,仅供参考)

(3).对于S5PV210:

       只说一说6410只是一个过渡产品,就中断角度而言,是因为在S5PV210中,中断向量舍弃了start.s开始的部分(因为从某种角度来讲,S5PV210上电后,不在是从0地址开始执行了,大家可以看下学习日记(2)中介绍的S5PV210的启动流程),而只保留了向量地址寄存器(即VICxADDRESS)部分,而该寄存器的功能和6410的一样。

问:既然S5PV210的start.s中不再有中断向量入口地址,那么S5PV210是怎么处理中断的呢?

答:以按键中断为例子,当中断发生时,PC不再是跳到0x00000018地址处,而是去访问向量地址寄存器(即VICxADDRESS),在该寄存器里面读出一个地址(即可以认为是我们的中断处理函数的地址),然后进一步跳到该地址处去执行。其他的过程和2440的处理过程一样(比如模式切换等等)

      接下来我一个具体的按键中断为例子(实现按K4,计数器加1,按K5,计数器减1的功能),代码放在了"Tiny210学习日记_代码"目录下了,名为"12_key_irq":

一上来,就写start.s,和2440的几乎无差别(不用写中断向量和关看门狗),需要初始化时钟,初始化nand,初始化内存,初始化需要模式的栈(用户模式,中断模式)等等操作,当然也会初始化中断,类容如下:

void irq_init(void)

{

    // 设置GPH2_3(K4),GPH3_0(K5)用于中断 

    GPH2CON |= 0xf<<12;

    GPH3CON |= 0xf<<0;

    // 设置触发方式为下降沿触发 

    EXT_INT_2_CON |= 0x2<<12;

    EXT_INT_3_CON |= 0x2<<0;

    // 使能中断(GPIO里面的) 

    EXT_INT_2_MASK &= ~(1<<3);

    EXT_INT_3_MASK &= ~(1<<0);

    // 设置为IRQ中断 

    VIC0INTSELECT &= ~(1<<16);

    // 使能中断(中断控制器里面的) 

    VIC0INTENABLE |= 1<<16;

    // 设置中断向量 

    VIC0VECTADDR16 = (int)key_IRQ; 

}

注意:

当中断发生时,VIC0VECTADDR16中的值(即中断处理函数的地址)会被自动的复制给向量地址寄存器(即VICxADDRESS),然后当中断发生时,就会访问向量地址寄存器(即VICxADDRESS),从而找到key_IRQ中断处理函数。(这些在6410视频里面有讲解)

问:以前2440在中断来时,我们会计算返回地址,保护现场等操作,难道S5PV210就不用了吗?

答:答案是否定的,S5PV210一样是要做的,而且一个不能够少,过程如下(这部分程序写在start.s中):

.global key_IRQ

key_IRQ:                         // 该函数就是在中断初始化中,VIC0VECTADDR16指向的函数 

    sub lr, lr, #4                // 1.计算返回地址 

    stmdb sp!, {r0-r12, lr} // 2.保护现场 

    // 3. 处理异常 

    bl do_irq

    

    // 4. 恢复现场 

    ldmia sp!, {r0-r12, pc}^    // ^表示把spsr恢复到cpsr 

最终,经过上面的处理后,又和我们的2440的中断函数完全一样了,因此我们就在do_irq函数中清中断,分辨中断,执行处理等操作,该部分程序中是这样做的,如下:

void do_irq(void)

{

    // 清中断 

    EXT_INT_2_PEND |= 1<<3;

    EXT_INT_3_PEND |= 1<<0;

    // 清中断向量 

    VIC0ADDRESS = 0;

    if(!(GPH2DAT & (1<<3)))      // 如果K4被按下 

    {

        wy_printf("counter(k4) : %d \n",i++); // 计数器加1 

    }

    if(!(GPH3DAT & (1<<0)))      // 如果K4被按下 

    {

        wy_printf("counter(K5) : %d \n",i--);// 计数器减1 

    }

}

注意:

1.参考代码放在了"Tiny210学习日记_代码"目录下了,名为"12_key_irq"。

2.测试方法,当终端有显示后,直接按开发板上面的K4,K5键,就能实现计数功能。


关键字:S3C2440  S3C6410  S5PV210  中断解析 引用地址:S3C2440、S3C6410、S5PV210中断解析

上一篇:Tiny210裸机之按键中断
下一篇:Tiny210裸机之LCD显示图片

推荐阅读

一、需要Jlink烧写Nor Flash。 这只能在windows下操作。a.开发板设置为Nor Flash启动,连接电脑,上电。 b.启动j-flash。J-flash操作如下: 在J-Flash里操作:1.选择菜单“File -> Open -> Open Project…”,打开附件里的s3c2440.jflash。 图 打开S3C2440工程2.选择菜单“Target -> Connect” 图 连接开发板3. 选择菜单“File -> Open...
湖南视比特机器人有限公司(以下简称“视比特”)近日宣布完成新一轮千万级战略融资,由同威资本领投,老股东道生资本跟投,毅仁资本继续担任本轮融资的财务顾问。此前,视比特在今年7月天使轮获得图灵资本、道生资本和小智创投的投资。 据了解,视比特于2018年8月入孵“柳枝行动”落地长沙国家高新区,是一家深度融合3D视觉感知与机器人柔性控制交互...
数据基础设施半导体解决方案的全球领导厂商Marvell(NASDAQ:MRVL)今日宣布,其定制化专用集成电路(ASIC) 产品完全有能力为数据中心和汽车市场提供下一代人工智能 (AI) 加速器解决方案。 Marvell的定制化 ASIC 产品为 AI 及机器学习应用提供了不同功能,包括具备领先密度和性能的 SRAM、最高性能的 SerDes 和全系列预认证的高带宽内存接口。它同时拥有最...
思特威推出4MP全系列升级图像传感器新品SC400AI / SC401AI / SC43362021年10月13日,中国上海 — 技术先进的CMOS图像传感器供应商思特威(SmartSens),正式推出三款面向智能安防应用的4MP图像传感器新品——SC400AI / SC401AI / SC4336。三款产品作为思特威安防应用高、中、低层级全系列升级的代表,将进一步助推思特威深化智能视频应用4MP产品...

史海拾趣

问答坊 | AI 解惑

FPGA控制网卡芯片数据收发如何判断接到的是命令还是数据

我用FPGA控制网卡芯片做一个数据收发的东西,但是怎样让FPGA开始发送数据呢?具体就是, FPGA接收到命令就开始发数据,接收到数据就存储,可是怎样判断接到的是命令还是数据呢?…

查看全部问答∨

【晒电路】马达调速电路

1.长假,预祝大家双节快乐 2.大家【晒电路】,才是真的【晒电路】,晒 完我就回家了 3.正题 在许多应用场合,需要随时通过调整马达的转速实现调整风量、流量等目的。过去通常采用通过调整串入马达的电感量来实现对马达转速的控制,这种方法存在 ...…

查看全部问答∨

vs2005 mfc 程序,动态链接,出了问题!

WINCE5.0(操作系统已添加 MFC 组件) VS2005 MFC 动态链接 利用向导制作了一个最简单的对话框程序,复制到开发板中运行,结果提示: 缺少库,可是在操作系统中已经添加了 MFC 组件,难道 VS2005 MFC 程序需要自己的 MFC 库吗?…

查看全部问答∨

招聘WINDOW CE 应用软件工程 2名

1.精通C++或C语言,能熟练使用EVC或VS2005等工具开发应用软件. 2.有多媒体,GPRS网络应用开发经验者优先. 3.有游戏软件编程经验着优先. 4.熟悉windows ce 系统优先. 5.有较强的团队合作精神,富有责任心. 6.待遇面议. 请把您的简历和作品发送到s ...…

查看全部问答∨

ARM7芯片哪个口接按键?

我想用D1口接按键,可以吗? 用什么指令可以让D1口设置为高电平?(MOV D1 #0FFH行吗?)…

查看全部问答∨

求助

我写了一个测脉冲宽度的程序,但是执行时总出现乱码,哪位高手给指点一下 #include<reg51.h>sbit CK=P3^2;int a,n,m;unsigned char x[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(int coda){ int i,j; for(i ...…

查看全部问答∨

LED驱动中的问题

有个LED工作电流1A电压3.1V,现在选用芯片LM3405A来驱动LED,3.6V锂电池供电,手工搭的电路图以及芯片资料如附件。首先芯片的第一管脚是不是正对着芯片上的字左下角第一个管脚就是第一脚(我搭电路时就是这么搭的)?电路搭好(第四脚使能端与第五 ...…

查看全部问答∨

M3简单收发源码

RT,也是学校发的,有需要的拿走吧…

查看全部问答∨

修改从DSP56F803中提取的文件

从DSP56F803BU80E 中读取的程序,保存为BIN或S19格式,现在希望修改其中的一些字符型数据,但在Hex编辑器下找不到校验位,修改后再写入芯片就无法使用。恳请会该款DSP开发或能直接修改文件内容的高人出手相助,修改成功愿奉万元酬劳。…

查看全部问答∨

富士通工业测控DIY活动总结

怀着对ARM的好奇和学习的冲动参加了这个活动。只会一点点51的我显然是低估了ARM的复杂程度。 因为没有接触过ARM,加上自己擅长的是结构设计。以为只有设计个外壳和内部结构还有面板就可以了。没想到项目只是做个板子就结束了。并不是以搞个成型的 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved