当前位置:首页 > 单片机 > 单片机
[导读].externmain.text.global_start_start:bResetHandleUndef:bHandleUndefHandleSWI:bHandleSWIHandlePrefetchAbort:bHandlePrefetchAbortHandleDataAbort:bHandleDataAbortHandleNotUsed:bHandleNotUsedbHandleIRQHand

.externmain
.text
.global_start
_start:

bReset


HandleUndef:
bHandleUndef


HandleSWI:
bHandleSWI


HandlePrefetchAbort:
bHandlePrefetchAbort


HandleDataAbort:
bHandleDataAbort


HandleNotUsed:
bHandleNotUsed


bHandleIRQ


HandleFIQ:
bHandleFIQ

Reset:
ldrsp,=4096
bldisable_watch_dog

msrcpsr_c,#0xd2
ldrsp,=3072

msrcpsr_c,#0xd3
ldrsp,=4096

blinit_led
blinit_irq
msrcpsr_c,#0x5f

ldrlr,=halt_loop
ldrpc,=main
halt_loop:
bhalt_loop

HandleIRQ:
sublr,lr,#4
stmdbsp!,{r0-r12,lr}

ldrlr,=int_return
ldrpc,=EINT_Handle

int_return:
ldmiasp!,{r0-r12,pc}^



#include "s3c2440.h"


#define GPF4_OUT(1<<(4*2))
#defineGPF5_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))


#define GPF0_EINT(0x2<<(0*2))
#define GPF2_EINT(0x2<<(2*2))
#define GPG3_EINT(0x2<<(3*2))
#define GPG11_EINT(0X2<<(11*2))

#define GPF0_MSK(3<<(0*2))
#define GPF2_MSK(3<<(0*2))
#define GPG3_MSK(3<<(3*2))
#define GPG11_MSK(3<<(11*2))


void disable_watch_dog(void)
{
WATCH_DOG=0;//置0,关闭WATCH
}


void init_led(void)
{
GPFCON&=~(GPF4_MSK|GPF5_MSK|GPF6_MSK);
GPFCON|=GPF4_OUT|GPF5_OUT|GPF6_OUT;
}



void init_irq(void)
{
//GPIO设置为中断引脚
GPFCON&=~(GPF0_MSK|GPF2_MSK);
GPFCON|=GPF0_EINT|GPF2_EINT;

GPGCON&=~(GPG3_MSK|GPG11_MSK);
GPGCON|=GPG3_EINT|GPG11_EINT;
//EINT8~23要使能
//使能EINT11,EINTMASK11置0
EINTMASK&=(~(1<<11))&(~(1<<19));

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

//EINT0 、EINT2、EINT8_23使能
INTMSK&=(~(1<<0))&(~(1<<2))&(~(1<<5));
}


#include "s3c2440.h"

void EINT_Handle(void)
{
unsigned long oft=INTOFFSET;
unsigned long val;

switch(oft)
{
//S2被按下
case 0:
{
GPFDAT|=(0x7<<4);
GPFDAT&=~(1<<4);
break;
}
//S3被按下
case 2:
{
GPFDAT|=(0x7<<4);
GPFDAT&=~(1<<5);
break;
}
//S4被按下
case 5:
{
GPFDAT|=(0x7<<4);//所有LED为0

//寄存器为5即位【5】为1时,EINT8~EINT23中至少有一个中断发生呢个,需进读取EINTPEND寄存器判断
val=EINTPEND;
if(val&(1<<19))
{
GPFDAT|=(0x7<<4);
GPFDAT&=~(1<<6);
}
if(val&(1<<11))
{
GPFDAT|=(0X7<<4);
GPFDAT&=~((1<<4)|(1<<5)|(1<<6));
}
break;
}
default:
break;
}

//清除中断
if(oft==5)
EINTPEND=(1<<11)|(1<<19);
SRCPND=1<INTPND=1<}

int main()
{
while(1);
return0;
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

有时候做设计时,我们会遇到外部按键比较多,IO口不够用的情况。这时大部分人会考虑通过其它芯片扩展IO,或者直接换一个IO口足够的MCU。其实,还有个方法可以实现一个IO上挂多个按键———即采用ADC扫描。

关键字: IO口 MCU 外部按键

中断服务程序

关键字: 时钟 中断程序

中断系统有两个控制寄存器IE和IP,它们分别用来设定各个中断源的打开/关闭和中断优先级。此外,在TCON中另有4位用于选择引起外部中断的条件并作为标志位。1.中断允许寄存器--IEIE在特殊功能寄存器中,字节地址为A8

关键字: 中断程序 中断系统 控制寄存器

UART程序:一、head.S文件的编写 作用是启动代码@******************************************************************************@ F...

关键字: arm笔记 uart程序

leds.bin:crt0.Sleds.carm-linux-gcc -g -c -o crt0.o crt0.Sarm-linux-gcc -g -c -o leds.o leds.carm-linux-ld -Tte...

关键字: arm笔记 gpio口 led程序

使用定时器来计时,每隔1s让led等发生变化:#include#include "Config.h"int count =0;int a;void Port_Init(){LED8DIR = 0xff...

关键字: 中断程序 430f149 定时器a

前段时间用STM32F103VBT6写了一个中断的函数,借此机会想了解下STM32的中断机制,用过之后发现STM32的中断配置相当灵活,稳定行很高,测试发现几乎没出过什么差错。我在程序里开了三个中断,一个计数器用于精确延...

关键字: STM32 中断程序

在程序开始时需要对定时器及中断寄存器做初始化设置:对TMOD——定时器/计数器工作方式寄存器赋值,以确定T0和T1的工作方式。计算初值,并将初值写入TH0,TL0或TH1,TL1。对IE——中断允许寄存器的EA和ET0或...

关键字: Linux 中断程序 单片机 精确计时

.equMEM_CTL_BASE,0x48000000.equSDRAM_BASE,0x30000000.text.global _start_start:bldisable_watch_dog@关闭WATCHDOG,否...

关键字: arm笔记 内存控制器程序

.text.global _start_start:ldrsp,=4096@设置栈指针,以下都是C函数,调用前需要设好栈bldisable_watch_dog@关闭WATCHDOG,否则CPU会不断重启blmemsetu...

关键字: arm笔记 mmu 单元控制器
关闭
关闭