keil下基于arm9的TX2440开发板的外部中断编写

本文介绍了在keil环境下,基于ARM9芯片S3C2440的TX2440开发板如何编写外部中断程序,以按键控制LED灯为例,详细讲解了中断向量表、启动代码、中断处理函数的设置,并提供了C语言代码示例。
摘要由CSDN通过智能技术生成

S3c2440可以说是学习arm9最常用的芯片了,这方面有很多开发板,例如TQ2440,MINI2440,JZ2440。
当时学习了业界很火的郭天祥老师的51单片机教程,书写的很长很好。因此在学习arm上也想学习郭老师的教程,在他的天祥淘宝店铺上,花了很贵的价钱买了TX2440开发板。满心欢喜的进行学习。
然鹅,我大失所望,和五一单片机完全不一样,这个arm9的开发板看不到一点郭老师的影子,完全是另一个人在讲,而且讲的也是十分的粗糙。
基本上的讲法就是:这部分内容很多,不可能一个个说,好了给你们推荐一些资料哈,下去自己看吧。。。。(省略10000字)(说话还漏口水)。
这里还是先劝劝大伙学arm不要入郭老师的坑了,人家重点根本不放在arm教学上。所以没有详细的指导给你。推荐去看看韦东山老师的书和视频吧,讲的很细。
好了不吐槽了。
首先说一下我的开发板是TX2440的板子。这次目的是用按键实现外部中断,从而控制led灯的亮灭。还有我的程序是完全裸机下的程序。
首先我们编写最开始的启动代码,这部分需要汇编完成(我也不喜欢汇编)。
我们随便建立个.s文件,输入如下代码

    IMPORT main 
    IMPORT disable_watch_dog
    IMPORT init_irq  
    IMPORT EINT_Handle
    AREA RESET,code,readonly
    arm
    entry 

最开始是一些声明,import是表示声明一个本文件之外而在本文件被引用的标号。申明的这些标号会在后边用到,arm表示现在是arm模式,entry表示这里是所有程序的最开始的起点。


  b   Reset

                    ; 0x04: 未定义指令中止模式的向量地址
HandleUndef
    b   HandleUndef 

                    ; 0x08: 管理模式的向量地址,通过SWI指令进入此模式
HandleSWI
    b   HandleSWI

                    ; 0x0c: 指令预取终止导致的异常的向量地址
HandlePrefetchAbort
    b   HandlePrefetchAbort

                    ; 0x10: 数据访问终止导致的异常的向量地址
HandleDataAbort
    b   HandleDataAbort

                    ; 0x14: 保留
HandleNotUsed
    b   HandleNotUsed

                            ; 0x18: 中断模式的向量地址
    b   HandleIRQ

                            ; 0x1c: 快中断模式的向量地址
HandleFIQ
    b   HandleFIQ

上面是设置中断(异常)向量表,在我的芯片受到外部中断或者内部中断时,会通过硬件将pc(程序指针)指向最开始的一些特定地址,比如我们的复位中断,在开发板最开始的上电的时候就会进入复位中断。这时pc自动指向的0x0的地址上,我们就应该在0x0的地址出写入一个处理复位中断的程序。
上面的程序是最开始的启始程序,第一句是b reset,这就是处理中断的语句,是一个跳转指令,类似于c语言的jump,(后面我们会把生成的整个代码烧到nor flash中起始地址为0x0的地方,所以b reset这条语句对应的地址就是0x0,也就是处理复位中断的位置)
上面共设定了有7,8条中断向量表,每个表都是一条指令“ b xxx”意思是
跳转的特定的中断处理函数中。
但这里我们只使用IRQ中断,因为键盘的中断就是IRQ中断。所以在在上面程序中对于其他中断我们都是原地循环跳转(不处理),对于IRQ和复位reset中断我们设置的单独的处理函数
注意:在正规的BootLoader代码中需要对所有的中断向量表都设置处理函数,下面是复位中断的处理函数:


Reset                
    ldr sp, =4096           ;设置栈指针,以下都是C函数,调用前需要设好栈
    bl  disable_watch_dog   ; 关闭WATCHDOG,否则CPU会不断重启

    msr cpsr_c, #0xd2       ; 进入中断模式
    ldr sp, =3072           ; 设置中断模式栈指针

    msr cpsr_c, #0xd3       ; 进入管理模式
    ldr sp, =4096           ; 设置管理模式栈指针,
                            ; 其实复位之后,CPU就处于管理模式,
                            ; 前面的“ldr sp, =4096”完成同样的功能,此句可省略

              ; 初始化LED的GPIO管脚
    bl  init_irq            ; 调用中断初始化函数,在init.c中
    msr cpsr_c, #0x53       ;@ 设置I-bit=0,开IRQ中断

    ldr lr, =halt_loop      ;@ 设置返回地址
    ldr pc, =main           ;@ 调用main函数
halt_loop
    b   halt_loop

disable_watch_dog,init_irq这些是在其他的.c文件中定义的c语言函数。.c文件后面会给出来,这里是用bl跳转过去执行c函数,执行完成后,会自动返回原来的汇编程序的地址的继续执行程序
刚开始关看门狗中断,是所有程序必须执行的一个步骤,不管多简单的程序都需要先关看门狗。
c语言的执行必须要使用栈,所以我们给sp装入一个合适的值。这里栈的大小和位置自己确定,只要合理即可,但是注意使用nandflash的同学sp的值不能超过4

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值