启动文件head.S源码:

@******************************************************************************

@ File:head.S

@ 功能:初始化,设置中断模式、管理模式的栈,设置好中断处理函数

@******************************************************************************       

   

.extern     main

.text 

.global _start 

_start:

@******************************************************************************       

@ 异常向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用

@******************************************************************************       

    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

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”完成同样的功能,此句可省略

    bl  init_led                      @ 初始化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

HandleIRQ:

    sub lr, lr, #4                        @ 计算返回地址

    stmdb   sp!,    { r0-r12,lr }   @ 保存使用到的寄存器

                                                @ 注意,此时的sp是中断模式的sp

                                                @ 初始值是上面设置的3072

    

    ldr lr, =int_return                @ 设置调用ISR即EINT_Handle函数后的返回地址  

    ldr pc, =EINT_Handle         @ 调用中断服务函数,在interrupt.c中

int_return:

    ldmia   sp!,    { r0-r12,pc }^  @ 中断返回, ^表示将spsr的值复制到cpsr

    

=====================================================================

init.c源码:

// init.c: 进行一些初始化

  

#include "s3c24xx.h"

// LED1,LED2,LED4对应GPF4、GPF5、GPF6

 

#define    GPF4_out    (1<<(4*2))

#define    GPF5_out    (1<<(5*2))

#define    GPF6_out    (1<<(6*2))

#define    GPF4_msk    (3<<(4*2))

#define    GPF5_msk    (3<<(5*2))

#define    GPF6_msk    (3<<(6*2))

// S2,S3,S4对应GPF0、GPF2、GPG3

 

#define GPF0_eint     (0x2<<(0*2))

#define GPF2_eint     (0x2<<(2*2))

#define GPG3_eint     (0x2<<(3*2))

#define GPF0_msk    (3<<(0*2))

#define GPF2_msk    (3<<(2*2))

#define GPG3_msk    (3<<(3*2))

// 关闭WATCHDOG,否则CPU会不断重启

void disable_watch_dog(void)

{

    WTCON = 0;  // 关闭WATCHDOG很简单,往这个寄存器写0即可

}

void init_led(void)

{

    // LED1,LED2,LED4对应的3根引脚设为输出

    GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);

    GPFCON |= GPF4_out | GPF5_out | GPF6_out;

}

// 初始化GPIO引脚为外部中断

// GPIO引脚用作外部中断时,默认为低电平触发、IRQ方式(不用设置INTMOD)

void init_irq( )

{

    // S2,S3对应的2根引脚设为中断引脚 EINT0,ENT2

    GPFCON &= ~(GPF0_msk | GPF2_msk);

    GPFCON |= GPF0_eint | GPF2_eint;

    // S4对应的引脚设为中断引脚EINT11

    GPGCON &= ~GPG3_msk;

    GPGCON |= GPG3_eint;

    

    // 对于EINT11,需要在EINTMASK寄存器中使能它

    EINTMASK &= ~(1<<11);

        

    // 设定优先级:

    // ARB_SEL0 = 00b, ARB_MODE0 = 0: REQ1 > REQ3,即EINT0 > EINT2

    // 仲裁器1、6无需设置

    // 最终:

    // EINT0 > EINT2 > EINT11即K2 > K3 > K4

     

    PRIORITY = (PRIORITY & ((~0x01) | (0x3<<7))) | (0x0 << 7) ;

    // EINT0、EINT2、EINT8_23使能

    INTMSK   &= (~(1<<0)) & (~(1<<2)) & (~(1<<5));

}

=====================================================================

interrupt.c源码:

#include "s3c24xx.h"

void EINT_Handle()

{

    unsigned long oft = INTOFFSET;  //根据INTOFFSET的value区分中断源

    unsigned long val;

    

    switch( oft )

    {

        // S2被按下

        case 0: 

        {   

            GPFDAT |= (0x7<<4);     // 所有LED熄灭

            GPFDAT &= ~(1<<4);      // LED1点亮

            break;

        }

        

        // S3被按下

        case 2:

        {   

            GPFDAT |= (0x7<<4);     // 所有LED熄灭

            GPFDAT &= ~(1<<5);      // LED2点亮

            break;

        }

        // K4被按下

        case 5:

        {   

            GPFDAT |= (0x7<<4);     // 所有LED熄灭

            GPFDAT &= ~(1<<6);      // LED4点亮                

            break;

        }

        default:

            break;

    }

    //清中断

    if( oft == 5 ) 

        EINTPEND = (1<<11);   // EINT8_23合用IRQ5

    SRCPND = 1<

    INTPND = 1<

}

=====================================================================

main.c源码:

int main()

{

    while(1);

    return 0;

}

=====================================================================

Makefile文件:

objs := head.o init.o interrupt.o main.o

int.bin: $(objs)

    arm-linux-ld -Ttext 0x00000000 -o int_elf $^

    arm-linux-objcopy -O binary -S int_elf $@

    arm-linux-objdump -D -m arm int_elf > int.dis

    

%.o:%.c

    arm-linux-gcc -Wall -O2 -c -o $@ $<

%.o:%.S

    arm-linux-gcc -Wall -O2 -c -o $@ $<

clean:

    rm -f int.bin int_elf int.dis *.o        

    

=====================================================================

测试:详细的中断服务函数使用可以参考“i2c设备裸板之AT24C02读写”章节

    放到服务器上直接make编译即可,编译完成后用dnw下载到开发板上运行即可。


关键字:JZ2440  裸板  中断控制器 引用地址:JZ2440裸板之中断控制器

上一篇:JZ2440裸板之系统时钟和UART实验
下一篇:JZ2440裸板之nand flash操作

推荐阅读

       即便近年来不遗余力在专利领域大肆布局,但国产手机厂商却再一次遭遇专利诉讼车轮战的命运。  国庆节前,一家名为DARELTECH公司在美国向小米发起诉讼,称在美销售的小米涉嫌侵犯DARELTECH名下4项专利。就在焦点集中于小米之时,DARELTECH又针对性起诉以美国为重要市场的国内无人机头部公司大疆。  《IT时报》记者独家获悉,小米代理律师...
10月8日,从国网基建部获悉,今年前三季度,国家电网有限公司110千伏及以上电网基建工程投产36134千米、21683万千伏安,完成年度计划的72.7%和77.4%;开工34856千米、21344万千伏安,完成年度任务的73.5%和69.9%,开工投产均超额完成里程碑计划。 年初以来,公司基建战线认真贯彻党中央、国务院决策部署,深入落实公司三届四次职代会暨2019年工作会议...
Imagination Technologies宣布与全球性高速混合电路知识产权(IP)和芯片定制(ASIC)一站式提供商芯动科技(Innosilicon)达成新的授权合作协议。凭借其高度创新的系统级芯片设计(SoC)和多晶粒封装芯片(chiplet)架构,芯动科技已将Imagination最新推出的IMG B系列BXT高性能多核图形处理器(GPU)IP,集成到能支持桌面和数据中心应用的PCI-E规格的G...
Digi-Key Electronics 宣布通过 Digi-Key 市场平台与 QuickLogic Corporation 建立全球合作伙伴关系全球供应品类极丰富、发货极快速的现货电子元器件分销商 Digi-Key Electronics 日前宣布与 QuickLogic® Corporation 达成全球合作伙伴关系,通过 Digi-Key 市场平台 分销 QuickLogic 的低功耗、多核 MCU、FPGA 和嵌入式 FPGA、语音...

史海拾趣

问答坊 | AI 解惑

基于DM642的视频编码Cache优化策略

基于DM642的视频编码Cache优化策略…

查看全部问答∨

智能手机上可以使用的3G模组都有哪些?

我们现在需要用ARM的CPU做两款产品,一个是Netbook,一个是Barcode scanner,都需要加上CDMA2000/EVDO/HSxPA的3G模组,其中Netbook使用Android系统,Barcode scanner使用WM6.5系统,请问大家在开发类似产品的时候使用的都是哪家的3G模组呢? 我有 ...…

查看全部问答∨

Windows Mobile 5.0,Windows Mobile 60设备,如何在我的程序运行过程中禁用上面的Power电源按钮

Windows Mobile 5.0,Windows Mobile 60设备,如何在我的程序运行过程中禁用上面的Power电源按钮…

查看全部问答∨

如何上传图片?ADS调试C和汇编混合编程 只显示反汇编内容 怎么按照C逐行调试

就这么多分了   如题问题 不知道怎么上传图片 知道告诉一声…

查看全部问答∨

ST32X103做电机控制好得不得了,服务也天下第一好.

                                 ST32X103做电机控制好得不得了,服务也天下第一好.…

查看全部问答∨

stm32f107phy搭配问题

                                 最近想寻找一款PHY,工业级要求,10-100M的,dp83848或者类似产品,想找一款价格和货期合适的,不知道大家有什么建 ...…

查看全部问答∨

建议增加psoc版块

&nbsp; psoc是赛普拉斯半导体公司生产的可编程片上系统,具有模拟系统和数字系统,学校做工程实践时候用到,现在正在学习,希望本论坛能够增加这个版块给大家学习交流。…

查看全部问答∨

无线通信模块在M2M领域的应用(四)

无线通信模块在M2M领域的应用(四) 传统农业生产的物质技术手段落后,主要依靠人力、畜力和各种手工工具以及一些简单机械。在现实中主要存在农业科技含量低,装备水平低,农业污染和水资源浪费严重,农业产出少,农民收入低,农产品品种少等问题。 ...…

查看全部问答∨

F28027用SPI操作SD卡

大家好,最近在做一个比赛,需要使用SD卡来记录工作状态下的数据。但是对于文件系统和怎样对于SD卡进行操作不是很了解,所以和大家商讨一下。我先把我的两个函数放上来,大家帮我看看。 了、我没有使用FIFO功能,因为我觉得对于SD卡返回的信息的读 ...…

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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