S5PV210中断处理

_start:

1、设置栈空间:防止之前的UBOOT代码被覆盖,应为c中需要栈空间

ldr sp, =0x40010000

2、设置CPSR的I,F位,A8打开IRQ,FIQ中断:

mov r0, #0x53
msr CPSR_cxsf, r0

b main

--main函数:

1、led灯引脚功能设置

GPJ2CON &= ~(0xf<<0);
GPJ2CON |= (1<<0);

2、中断初始化:

2、1 注册中断函数:

pExceptionFIQ  = (unsigned long)FIQ_handle;//FIQ

pExceptionIRQ  = (unsigned long)IRQ_handle;//IRQ

功能函数:

_start:

IRQ_handle: @CPSR会由硬件自动保存到SPSR_irq
ldr sp, =0xD0037F80
sub lr, lr, #4
stmfd sp!, {r0-r12, lr}
bl Irq_Isr 跳转到真正的中断处理函数  *irq= VIC0ADDRESS(存放了真正中断处理函数的首地址)
ldmfd sp!, {r0-r12, pc}^ @将SPSR_irq恢复给CPSR

中断处理函数的执行:

void Irq_Isr(void)
{
int i;
unsigned long vicaddr[4] = {VIC0ADDRESS,VIC1ADDRESS,VIC2ADDRESS,VIC3ADDRESS};
void (*isr)(void) = (void *)0;

for(i=0; i<4; i++)
{
if(intc_getvicirqstatus(i) != 0)
{
isr = (void (*)(void)) vicaddr[i];
break;
}
}
(*isr)();
}

2、2 关闭中断控制器:()

VIC0INTENCLEAR = 0xffffffff;
VIC1INTENCLEAR = 0xffffffff;

2、3 设置为何种中断(IRQ)

VIC0INTSELECT = 0x0;
VIC1INTSELECT = 0x0;

3、将真正的中断处理函数地址给对应的寄存器VIC0VECTADDR,

真正的中断处理函数:

电灯,清除VIC0VECTADDR中保存的地址,清除外部中断的标志位,PEND

void isr_key(void)
{
GPJ2DAT ^= (1<<0); //toggle
// clear VIC0ADDRESS
intc_clearvectaddr();
// clear pending bit
EXT_INT_2_PEND |= 1<<0;
}

4、设置按键功能,以及为何种触发方式

// GPH2_0 --> EXT_INT[16]
GPH2CON |= 0xF;
//EXT_INT[16]: Falling edge triggered
EXT_INT_2_CON &= ~(7<0);
EXT_INT_2_CON |= (2<<0);

5、打开外部中断

EXT_INT_2_MASK &= ~(1<<0);

6、打开中断控制器的中断功能:

void intc_enable(unsigned long intnum)
{
unsigned long temp;
if(intnum<32)
{
temp = VIC0INTENABLE;
temp |= (1<<intnum);
VIC0INTENABLE = temp;
}

}

7、进入死循环,等待中断

具体代码参考demo_irq

时间: 2024-08-29 22:51:26

S5PV210中断处理的相关文章

嵌入式Linux裸机开发(八)——S5PV210中断处理流程

嵌入式Linux裸机开发(八)--S5PV210中断处理流程 中断是一个过程,是CPU在执行当前程序的过程中因硬件或软件的原因插入了另一段程序运行的过程.因硬件原因引起的中断过程的出现是不可预测的,即随机的,而软中断是事先安排的.引起中断的信号源称之为中断源.根据中断源的来源将中断分为外部中断和内部中断.中断源来自SoC内部(内部外设)的中断称为内部中断.中断源来自SoC外部,通过中断对应的GPIO引脚产生的中断称为外部中断.中断有四种状态: Inactive(不激活):没有被激活或挂起的中断 

s5pv210中断处理过程

一.异常处理的两个过程 第一,异常向量表的跳转 第二,进入异常处理程序中 二.异常处理中的第一个过程 1.当发生异常时,CPU会自动跳转PC到异常向量表对应的地址处,软件需要处理的就是将这个异常处理的代码首地址填入这个异常向量地址处. 2.中断处理要先在汇编文件中进行,主要的过程是保护现场和恢复现场 保护现场:主要是设置IRQ栈.保存LR和保存r0-r12,中断返回时关键的就是对于PC和cpsr两个寄存器的保存.中断返回地址保存在LR中,而cpsr自动保存在(IRQ模式下的)spsr中. 恢复现

s5pv210中断体系

一.什么是中断? 1.中断的发明是用来解决宏观上的并行需要的.宏观就是从整体上来看,并行就是多件事情都完成了. 2.微观上的并行,就是指的真正的并行,就是精确到每一秒甚至每一刻,多个事情都是在同时进行的.宏观上面的并行并不等于围观的并行,有时候宏观上是并行的,微观上 是串行的. 3.为什么需要中断?因为单核CPU实际无法并行的,但是通过中断机制,可以实现假并行(宏观上的并行,微观上实际还是串行的). 二.异常和中断的区别和联系 1.针对SoC来说,发生复位.软中断.中断.快速中断.取指令异常.数

s5pv210——中断

1:s5pv210的中断步骤 (1):建立异常向量表: (2):写入中断处理函数: (3):中断初始化: (4):建立中断号与中断处理函数的联系,使能中断: 当中断发生时,中断处理函数会自动处理中断: 流程如下: 2:建立异常向量表: s5pv210异常向量表的基地址为0xD003_7400,下图为异常对于基地址的偏移量: 第一步建立异常向量表: 代码如下: /* * s5pv210 裸机 * * 异常向量表初始化 * */ #define VECTOR_TABLE_BASE 0xD003740

[S5PV210] PWM

概述 PWM:Pulse Width Modulation, 脉冲宽度调制. 通过PWM调整高低电平的占空比,我们可以实现调节如LCD的背光亮度.蜂鸣器的音调等,本文采用蜂鸣器作为实例. 在S5PV210中,PWM定时器的特点如下: 拥有5个PWM定时器,其中,Timer0-Timer3各拥有一个PWM输出Pin. 时钟输入源为APB-PCLK,我在时钟初始化时将PCLK配为66.7MHz,通过一系列的分频,实现预期的tick周期. PWM的每次tick结束都会产生一个内部中断,我们可以在中断处

S5PV210开发系列四_uCGUI的移植

S5PV210开发系列四 uCGUI的移植 象棋小子          1048272975 GUI(图形用户界面)极大地方便了非专业用户的使用,用户无需记忆大量的命令,取而代之的是可以通过窗口.菜单.按键等方式进行操作.在某些场合,设计一款人机界面丰富友好的嵌入式产品能赢得更多的用户.笔者此处就S5PV210基于uCGUI图形用户界面的使用作一个简单的介绍. 1. uCGUI移植概述 1.1. S5PV210 Bootloader 笔者的S5PV210的Bootloader设置最高的CPU主频

S5PV210开发系列三_简易Bootloader的实现

S5PV210开发系列三 简易Bootloader的实现 象棋小子          1048272975 Bootloader是嵌入式系统上电后第一段执行的代码.对于功能简单的处理器,可能并没有Bootloader的概念,但对于应用处理器,有不同的启动方式,不同的存储设备(Nand flash.sd/mmc.DDR2.SRAM等),不同的操作系统等,往往需要一个Bootloader先初始化CPU和相关的硬件,建立内存空间映射,把内核或应用程序加载到相应的内存执行位置,最后调用内核或应用程序,释

S5pv210中断体系结构分析

我们按照Tiny210官方的裸板程序来梳理S5PV210的中断体系. 关于 S5PV210 的中断体系结构 S5PV210 的中断控制器是由 4 个向量中断控制器(VIC). ARM PrimeCell PL192 和 4 个 TrustZone Interrupt Controller (TZIC)共同组成. S5PV210 共支持 93 个中断源(具体见官方手册). 首先看 Start.S .global _start .global IRQ_handle _start: @ 关闭看门狗 l

s5pv210——初始化SDRAM

1:SDRAM基础: 通过s3c2440的内存原理以及时序来理解s5pv210 SDRAM原理.时序. 首先看一下核心板内存如何连接的 可以看一下两个内存芯片接的地址总线均为Xm1_ADDR[13:0],数据总线Xm1_DATA[15:0].Xm1_DATA[31:16],两个内存芯片是并联的,当地址总线Xm1_ADDR[13:0]寻址时, 可以同时在两个内存芯片上各获取16位数据来组成一个32位数据,并由32位数据总线输出. 在看下面这幅图:下图为每个内存芯片内部框图:Block Diagra