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

posted @   高傲的monkey  阅读(558)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束
点击右上角即可分享
微信分享提示