ARM—2410中断控制LED裸机程序

发布者:创新脑细胞最新更新时间:2016-08-14 来源: eefocus关键字:ARM  中断控制  LED 手机看文章 扫描二维码
随时随地手机看文章
读者注意:>>后面跟的是文件名,下面是代码,程序分为几个文件!!文件使用2410开发板调试,如换其他开发板需做部分修改!

>>一/汇编部分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, #0x5f       @ 设置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
 
>>main.c
int main()
{
    while(1);
    return 0;
}

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

#include "s3c24xx.h"

/*
 * LED0,LED1,LED2对应GPc4、GPC5、GPC6
 */

#define GPC5_mask    (3<<(5*2))
#define GPC6_mask    (3<<(6*2))
#define GPC7_mask    (3<<(7*2))

#define    GPC5_out    (1<<(5*2))
#define    GPC6_out    (1<<(6*2))
#define    GPC7_out    (1<<(7*2)) 


/*
 * KEY0对应GPF5
 */
#define GPF5_eint     (0x2<<(5*2))
#define GPF5_mask    (3<<(5*2))



/*
 * 关闭WATCHDOG,否则CPU会不断重启
 */
void disable_watch_dog(void)
{
    WTCON = 0;  // 关闭WATCHDOG很简单,往这个寄存器写0即可
}

void init_led(void)
{
    // LED0,LED1,LED2对应的3根引脚设为输出
    GPCCON &= ~(GPC5_mask | GPC6_mask | GPC7_mask);    
    GPCCON |= GPC5_out | GPC6_out | GPC7_out;
    GPCDAT |= (0x7<<5);   // 所有LED熄灭    
}

/*
 * 初始化GPIO引脚为外部中断
 * GPIO引脚用作外部中断时,默认为低电平触发、IRQ方式(不用设置INTMOD)
 */ 
void init_irq( )
{
    // key0对应的引脚设为中断引脚 EINT5
    GPFCON &= ~GPF5_mask;
    GPFCON |= GPF5_eint;


    
    // 对于EINT5,需要在EINTMASK寄存器中使能它
    EINTMASK &= ~(1<<5);
        
    /*
     * 设定优先级:
     * 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<<4);
}



>>interrupt.c
#include "s3c24xx.h"
static void delay(int n);

void EINT_Handle()
{
    unsigned long oft = INTOFFSET;
    
    switch( oft )
    {
        // key0被按下
        case 4: 
        {   
            GPCDAT &= ~(1<<5);      // LED0点亮
            delay(300000);
            GPCDAT |= (0x7<<5);   // 所有LED熄灭
            break;
        }
        default:
            break;
    }

    //清中断
    if( oft == 4 ) 
        EINTPEND = (1<<5);   // EINT4_7合用IRQ4
    SRCPND = 1<     INTPND = 1< }

static void delay(int n)
{
    int i = 0;
    for(i = 0; i }

>>Makefile(注意makefile编写时候命令前面是一个制表符Table)
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        
    
>>s3c24xx.h
/* WOTCH DOG register */
#define     WTCON           (*(volatile unsigned long *)0x53000000)

/* SDRAM regisers */
#define     MEM_CTL_BASE    0x48000000
#define     SDRAM_BASE      0x30000000

/* NAND Flash registers */
#define NFCONF              (*(volatile unsigned int  *)0x4e000000)
#define NFCMD               (*(volatile unsigned char *)0x4e000004)
#define NFADDR              (*(volatile unsigned char *)0x4e000008)
#define NFDATA              (*(volatile unsigned char *)0x4e00000c)
#define NFSTAT              (*(volatile unsigned char *)0x4e000010)

/*GPIO registers*/
#define GPBCON              (*(volatile unsigned long *)0x56000010)
#define GPBDAT              (*(volatile unsigned long *)0x56000014)

#define    GPCCON        (*(volatile unsigned long *)0x56000020)
#define    GPCDAT        (*(volatile unsigned long *)0x56000024)

#define GPFCON              (*(volatile unsigned long *)0x56000050)
#define GPFDAT              (*(volatile unsigned long *)0x56000054)
#define GPFUP               (*(volatile unsigned long *)0x56000058)

#define GPGCON              (*(volatile unsigned long *)0x56000060)
#define GPGDAT              (*(volatile unsigned long *)0x56000064)
#define GPGUP               (*(volatile unsigned long *)0x56000068)

#define GPHCON              (*(volatile unsigned long *)0x56000070)
#define GPHDAT              (*(volatile unsigned long *)0x56000074)
#define GPHUP               (*(volatile unsigned long *)0x56000078)



/*UART registers*/
#define ULCON0              (*(volatile unsigned long *)0x50000000)
#define UCON0               (*(volatile unsigned long *)0x50000004)
#define UFCON0              (*(volatile unsigned long *)0x50000008)
#define UMCON0              (*(volatile unsigned long *)0x5000000c)
#define UTRSTAT0            (*(volatile unsigned long *)0x50000010)
#define UTXH0               (*(volatile unsigned char *)0x50000020)
#define URXH0               (*(volatile unsigned char *)0x50000024)
#define UBRDIV0             (*(volatile unsigned long *)0x50000028)


/*interrupt registes*/
#define SRCPND              (*(volatile unsigned long *)0x4A000000)
#define INTMOD              (*(volatile unsigned long *)0x4A000004)
#define INTMSK              (*(volatile unsigned long *)0x4A000008)
#define PRIORITY            (*(volatile unsigned long *)0x4A00000c)
#define INTPND              (*(volatile unsigned long *)0x4A000010)
#define INTOFFSET           (*(volatile unsigned long *)0x4A000014)
#define SUBSRCPND           (*(volatile unsigned long *)0x4A000018)
#define INTSUBMSK           (*(volatile unsigned long *)0x4A00001c)

/*external interrupt registers*/
#define EINTMASK            (*(volatile unsigned long *)0x560000a4)
#define EINTPEND            (*(volatile unsigned long *)0x560000a8)
关键字:ARM  中断控制  LED 引用地址:ARM—2410中断控制LED裸机程序

上一篇:S3C2410 MMU(存储器管理单元)
下一篇:arm汇编之冒泡排序

推荐阅读最新更新时间:2024-03-16 15:05

“使LED照明系统更简便”访涉足LED电源模块的力康
    LED照明的设置事例在不断增加,市场有望扩大。新涉足LED照明业务的企业也很多,随着涉足厂商的范围扩大,希望能够简便设计LED照明器具的需求不断增强。从事电源模块业务的德国力康公司(RECOM Electronic GmbH)为满足这一需求正加紧扩充LED驱动模块产品线。除了LED照明电源用小型DC-DC转换器的LED驱动模块之外,该公司还于2010年下半年推出了可以直接用商用交流电源来点亮LED照明的AC-DC转换器LED驱动模块。日前,本站记者就该公司产品的特点及开发目标等,采访了力康亚洲私人有限公司(RECOM Asia Pte Ltd.) 大中华区、香港、台湾及日本销售总监Harry Gu,以及RECOM Distr
[电源管理]
传苹果缩编Mini LED团队,转移人力做OLED
集微网消息,苹果研发Micro LED的团队传出缩编,恐影响Micro LED大量应用的时程。 Micro LED被视为是下一代的显示器技术,与AMOLED分庭抗礼,苹果在台湾龙潭设立研发基地,研发的主要项目包括AMOLED与Micro LED等先进的显示器产品。原先外界传出,Apple Watch因为屏幕最小,最快在2018年可以采用Micro LED作为屏幕。 外界认为,苹果2018年将推出两款OLED版的iPhone,而Micro LED量产时程短期内看不到成果,因资源有限之下,苹果转移部分人力去做OLED,减少Micro LED的研发人力。 苹果2014年砸下3亿至4亿美元,从台厂手中买下LuxVue,成为全球拥有Micr
[手机便携]
ARM Linux内核启动要求
这篇文章英文原版 ARM Linux Kernel Boot Requirements ,是ARM Linux内核的维护者Russell King写的。在此我将其简易的翻译成中文,方便大家学习下。 原版:http://www.arm.linux.org.uk/developer/booting.php Author: Russell King Initial date: May 18, 2002 Revision: 1 - 17 September 20042 - 30 September 2004 为了启动ARM Linux,首先,你需要一个bootloader,它是一个很小的程序(在内核运行之前启动)。bootloade
[单片机]
LED灯珠对LED显示屏的影响
   LED灯珠 作为 LED显示屏 成本最高、用量最大的元器件,对于 LED 显示屏的品质影响起着主导作用。今天我们来为你介绍一下为什么 LED灯 珠是LED显示屏最关键的部件,如何鉴别LED灯珠的优劣?    全彩LED显示屏的最关键部件是LED灯珠。原因有三:   第一,LED是全彩屏整机中使用数量最多的关键器件,每平方米会使用几千至几万只LED;   第二,LED是决定整屏光学显示性能的主体,直接影响观众对显示屏的评价;   第三,LED在显示屏整体成本中所占比例最大,从30%至70%不等。    如何鉴别LED显示屏灯珠优劣   一、看焊点。正规的LED灯带厂家生产的LED灯带是采用SMT贴片
[电源管理]
Diodes发表电流高达1.5A新型LED驱动IC
      近日,美国达尔科技(Diodes)上市了新型LED驱动IC“AL8806”,供电电流最大为1.5A。       该LED驱动IC与之前提供的LED驱动IC相比具有以下优势:        1、供电电流最大。对LED灯串的最大供电电流可以使用外部电阻进行调整。输出电流的误差最大为±5%。转换效率最大为98%。       2、具有减小印刷基板的封装面积优势。因其采用的是降压型DC-DC转换器,集成有开关元件(功率MOSFET)。导通电阻最大值为0.35Ω,输入电压范围在+6~30V,开关频率最大为1MHz。因此,外置被动部件能够采用小型部件。       3、具有输出开路保护功能。待机时的消耗电流最大值
[电源管理]
并入软银 9 个月,ARM 发生了哪些改变?
2016 年 7 月,日本软银集团以 243 亿英镑(约新台币 1.03 兆元)天价收购英国 IP 矽智财大厂 ARM 的消息,震撼全球科技圈。自从 2016 年 9 月软银完成收购至今,9 个多月过去了,软银创办人孙正义眼中“集团未来成长战略的核心之一”──这块烫金拼图 ARM,发生了哪些变化?又面临哪些新的挑战? 首先,ARM 为了扩大生态圈,更积极走到台前和市场沟通。在刚落幕的 2017 台北国际电脑展中,ARM 以过去罕见的盛大规模参展,IP、物联网两大事业群总裁亲自来台发表演说,多位高阶主管轮番召开记者会、解说新产品,相当重视台湾市场。 ARM 物联网事业群总裁 Dipesh Patel 表示,ARM 除了和研华
[半导体设计/制造]
LED日光灯电源设计十大关键点
  目前,LED日光灯照明市场比较活跃,LED驱动电源厂家主要分成3大类型:第一类是开发做LED芯片或LED灯的工厂,顺势向下游渗透;第二类是原来做是做普通照明的工厂;第三类是完全新开的工厂,他们以前做电源或其他产品或新创业。   LED日光灯电源是LED日光灯中非常重要的一个部件,要是选择不当,LED日光灯发挥不出他应有的性能,甚至还有可能不能正常照明使用。下面我就LED日光灯照明做了一些小小的建议,供大家参考参考。   1、LED日光灯电源为什么一定要恒流的呢?   LED照明的特性决定其受环境影响较大,譬如温度升高,LED的电流会增加;电压的增加,LED的电流也会增加。长期超过额定电流工作,会大大缩短LED的使用寿命。而
[电源管理]
聚焦AI,探析边缘智能新动向,研华AI on Arm合作伙伴会议开启报名!
研华Arm人工智能合作伙伴会议将于3月28日于上海古井假日酒店召开,此次会议将汇集芯片厂家和软件生态合作伙伴,共同探讨Arm平台的AI技术创新及服务升级,开拓边缘智能在多行业全方位的应用机会。 议程一览: 上午主会场:边缘运算未来趋势 迎接新兴产业应用新时代 下午分会场1:硬件设计构建AI可靠基础 下午分会场2:软件服务助力AI应用落地 演讲嘉宾: 本次活动邀请到来自高通,瑞芯微,Hailo,瞰瞰智能,微软,麒麟,海华为各位带来关于生态伙伴AI技术的新成果分享和落地应用经验。 活动亮点: 与业界专家面对面交流,了解Arm平台AI技术的新动态。 分享研华硬件可靠性设计经验,探索工控行业品质标兵。
[工业控制]
聚焦AI,探析边缘智能新动向,研华AI on <font color='red'>Arm</font>合作伙伴会议开启报名!
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved