历史上的今天
返回首页

历史上的今天

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

正在发生

2018年10月13日 | JZ2440裸板之中断控制器

2018-10-13 来源:eefocus

启动文件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下载到开发板上运行即可。


推荐阅读

史海拾趣

Aavid Niagra公司的发展小趣事

为了拓展市场份额,Aavid Niagra公司开始实施全球化战略布局。公司先后在多个国家和地区设立了生产基地和研发中心,以便更好地服务当地客户。同时,公司还积极参与国际电子行业的交流与合作,不断提升自身的国际影响力。全球化战略的实施为公司带来了更多的发展机遇,也使其在全球电子散热市场上占据了重要地位。

CETC公司的发展小趣事

CETC深知人才是企业发展的根本。因此,公司一直注重人才培养和团队建设。公司设立了完善的培训体系,为员工提供各种学习和发展的机会。同时,CETC还积极引进国内外优秀人才,打造了一支高素质、专业化的团队。这支团队在公司的各个领域都发挥着重要作用,为公司的持续创新和发展提供了有力保障。

BK Precision公司的发展小趣事

BK Precision一直将品质管理视为企业发展的核心。公司建立了严格的质量管理体系,从原材料采购到产品生产、检验、出厂等各个环节都进行严格把控。同时,公司还注重持续创新,不断推出符合市场需求的新产品。通过引进先进的生产设备和技术手段,BK Precision不断提高生产效率和产品质量,为客户提供更优质的产品和服务。

亿佰特(EBYTE)公司的发展小趣事

亿佰特在发展过程中,荣获了多项荣誉和奖项。公司成功入选2022年度四川省“专精特新”中小企业名单,这是对公司在细分市场专业化、企业管理精细化、产品或服务特色化、科技成果新颖化等方面的认可。同时,亿佰特还积极履行社会责任,关注环保和公益事业,展现了企业的良好形象和责任感。

以上五个故事方向涵盖了亿佰特在电子行业中的发展过程中的重要方面,希望能够帮助您了解该公司的成长历程。

AXTAL公司的发展小趣事

随着业务的不断发展,AXTAL公司开始在全球范围内进行布局和扩展。公司的设施位于德国南部的“水晶谷”地区,靠近海德堡。这一地区以其丰富的石英资源和技术优势而闻名,为AXTAL提供了得天独厚的条件。此外,公司还积极拓展海外市场,与全球多家知名企业建立了紧密的合作关系,进一步提升了公司的国际影响力。

Heatron公司的发展小趣事

随着全球对环保和节能问题的日益关注,Heatron公司积极响应号召,致力于研发和生产环保节能的电加热产品。公司投入大量资源于新材料、新技术的研发中,成功推出了一系列低能耗、高效率的加热器产品。这些产品不仅满足了市场对环保节能的需求,还进一步巩固了Heatron在电子行业中的领先地位。

问答坊 | AI 解惑

通信工程的管理

工程实施控制管理流程 随着信息行业腾飞猛进的发展,各个行业对通讯行业服务的依赖性日益增具,满足客户越来越高的要求是对我们严峻的考验。通信建设管理在通信领域也就是一个至关重要的环节,如果由于那一个步伐拖延受阻,影响的将是大面 ...…

查看全部问答>

汽车CAN数据传输系统的原理及故障实例

(1)什么是数据总线     一辆汽车不管有多少块电控单元,不管信息容量有多大,每块电控单元都只需引出两条线共同接在两个节点上,这两条导线就称作数据总线。以前各电控单元之间好比有许多人骑着自行车来来往往,现在是这些人乘坐公共汽 ...…

查看全部问答>

GPRS模块发送文本文件?

怎么用GPRS模块发送文本文件到智能手机?(由于是采集的数据太多,用短信好像很烦哦)彩信协议可不可以直接发送这个txt文件呢?(AT命令好像只有图片的)请教各位具体at命令,或者是其他方法?…

查看全部问答>

高分求wifi驱动开发资料

如题!有做过wifi驱动开发的大虾们么,给些资料学习学习!有的话发到邮箱里!小弟不胜感谢!…

查看全部问答>

各位请进,一个关于任务优先级的菜鸟级问题

有两个任务,优先级一高一低,高优先级任务等待低优先级任务释放一个信号量,低优先级任务这时处于死循环状态,请问下面会发生什么,多谢!…

查看全部问答>

这个怎么修改

本帖最后由 paulhyde 于 2014-9-15 09:44 编辑 …

查看全部问答>

【求助】这个错误是什么意思,有谁遇到过吗?

Error[e16]: Segment INTVEC (size: 0x20 align: 0x1) is too long for segment definition. At least 0x12 more bytes needed. The pro××em occurred while processing the segment placement command "-Z(CONST)INTVEC=FFE0-FFFF", w ...…

查看全部问答>

新人报道

小弟之前是做WLAN产品生产及测试方面的,差不多7年经验,目前正打算转型设计这块,希望能跟论坛的高人们学习,请多多指教。…

查看全部问答>

谷歌眼镜开箱评测:比想象更精致

本帖最后由 jameswangsynnex 于 2015-3-3 20:04 编辑 北京时间4月17日下午消息,随着谷歌眼镜开始向开发者发货,这款产品的开箱照片和视频也陆续在网上流传开来。科技博客Androidos.in今天放出了谷歌眼镜的开箱组图和视频。这款设备或许还要等上几 ...…

查看全部问答>

“我来评论,太阳能光伏发电解决方案

太阳能光伏系统原理介绍太阳能光伏发电系统是利用光伏组件半导体材料的“光伏效应”将太阳光辐射能直接转换为电能的一种新型发电系统。    太阳能光伏发电的能量来源于取之不尽,用之不竭的太阳能,且在太阳能光伏发电的过程中,不会给 ...…

查看全部问答>