JZ2440 裸机驱动 第9章 中断体系结构
(1)“Request sources(without sub-register)”中的中断源被触发之后,SRCPND寄存器中
综上所述,使用中断的步骤如下:
sub lr, lr, # @计算返回地址
stmdb sp!, {r0-r12, lr} @保存使用的寄存器
... ... @处理中断
ldmia sp!, {r0-r12, pc}^ @中断返回
@^表示将spsr的值赋给cpsr
进入和退出IRQ
sub lr, lr # @计算计算返回地址
stmdb sp!, {r0-r7, lr} @保存使用到的寄存器
... ... @快速处理中断
sdmia sp!, {r0-r7, pc}^ @快速中断返回
@^表示将spsr的值赋给cpsr
进入和退出FIQ
@*************************************
@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
head.S
接上面
42行 Reset:
43行 ldr sp, = @设置栈指针,以下都是C函数,需要在调用前设置好栈
44行 bl disable_watch_dog @关闭看门狗
45行
46行 msr cpsr_c, #0xd2 @进入中断模式
47行 ldr sp, = @设置中断模式栈指针
48行
49行 msr cpsr_c, #0xdf @进入系统模式
50行 ldr sp, = @设置系统模式栈指针
51行 @起始复位之后,CPU就处于系统模式
52行 @前面的“ldr sp, =”完成同样的功能,此句可省略
53行
Reset代码
接上面
54行 bl init_led @初始化LED的GPIO管脚
55行 bl init_irq @调用中断管脚初始化函数,在init.c中
56行 msr cpsr_c, #0x5f @设置I-bit=,开启IRQ中断
57行
58行 ldr lr, =halt_loop @设置返回地址
59行 ldr pc, =main @调用main函数
60行 halt_loop:
61行 b halt_loop
接上面
62行 HandleIRQ:
63行 sub lr, lr # @计算返回地址
64行 stmdb sp!, {r0-r12, lr} @保存使用到的寄存器
65行 @注意,此时的sp是中断模式的sp
66行 @初始值是上面设置的3072
67行
68行 ldr lr, =int_return @设置调用ISR即EINT_Handle函数后的返回地址,即为第71行指令的地址
69行 ldr pc, =EINT_Handle @调用中断服务函数,在interrupt.c中
70行 int_return:
71行 ldmia sp!, {r0-r12, pc}^ @中断返回,^表示将spsr的值复制到cpsr
72行
HandleIRQ
37行 /*
38行 * 初始化GPIO引脚为外部中断
39行 * GPIO引脚为外部中断时,默认低电平触发,IRQ方式(不用设置INTMOD)
40行 */
41行 void init_irq()
42行 {
// S2,S3对应的2根引脚设为中断引脚 EINT0,ENT2
43行 GPFCON &= ~(GPF0_msk | GPF2_msk);
44行 GPFCON |= GPF0_eint | GPF2_eint;
// S4对应的引脚设为中断引脚EINT11
GPGCON &= ~GPG3_msk;
GPGCON |= GPG3_eint;
45行
46行 //对于EINT11,需要在EINTMASK寄存器中使能它们
47行 EINTMASK &= ~(<<);
48行
49行 /*
50行 *设定优先级
51行 *ARB_SEL0 = 00b,ARB_MODE0 = 0;REQ1 > REQ3,即EINT0 > EINT2
52行 *仲裁器1、6无须设置
53行 *最终:
54行 *EINT0 > EINT2 > EINT11, EINT19、即K4 > K3 > K1、K2
55行 *EINT11和EINT19的优先级相同
56行 */
57行 PRIORITY = (PRIORITY & ((~0x01) | (0x3 << ))) | (0x0 << );
58行
59行 //EINT0、EINT2、EINT8_23使能
60行 INTMSK &= (~( << )) & (~( << )) & (~( << ));
61行 }
init.c
#include "s3c24xx.h" void EINT_Handle()
{
unsigned long oft = INTOFFSET;
unsigned long val; switch( oft )
{
// S2被按下
case :
{
GPFDAT |= (0x7<<); // 所有LED熄灭
GPFDAT &= ~(<<); // LED1点亮
break;
} // S3被按下
case :
{
GPFDAT |= (0x7<<); // 所有LED熄灭
GPFDAT &= ~(<<); // LED2点亮
break;
} // K4被按下
case :
{
GPFDAT |= (0x7<<); // 所有LED熄灭
GPFDAT &= ~(<<); // LED4点亮
break;
} default:
break;
} //清中断
if( oft == )
EINTPEND = (<<); // EINT8_23合用IRQ5
SRCPND = <<oft;
INTPND = <<oft;
}
interrupt.c
int main()
{
while();
return ;
}
main.c
JZ2440 裸机驱动 第9章 中断体系结构的更多相关文章
- JZ2440 裸机驱动 第14章 ADC和触摸屏接口
本章目标: 了解S3C2410/S3C2440和触摸屏的结构: 了解电阻触摸屏的工作原理和等效电路图: 了解S3C2410/S3C2440触摸屏控制器的多种工作模式: ...
- JZ2440 裸机驱动 第12章 I2C接口
本章目标: 了解I2C总线协议: 掌握S3C2410/S3C2440中I2C接口的使用方法: 12.1 I2C总线协议及硬件介绍 12.1.1 I2C总线协议 1 I2C总线的概念 2 I2C总线的信 ...
- JZ2440 裸机驱动 第10章 系统时钟和定时器
本章目标 了解S3C2410/S3C2440的时钟体系结构 掌握通过设置MPLL改变系统时钟的方法 掌握在不同的频率下设置存储控制器的方法 掌握PWM定时器的用法 ...
- JZ2440 裸机驱动 第5章 GPIO接口
本章目标: 掌握嵌入式开发的步骤:编程.编译.烧写程序.运行 通过GPIO的操作了解软件如何控制硬件 5.1 GPIO硬件介绍 S3C2440A有130个多功能输入/输出口引脚 ...
- JZ2440 裸机驱动 第13章 LCD控制器(1)
本章目标 了解LCD显示器的接口及时序: 掌握S3C2410/S3C2440 LCD控制器的使用方法: 了解帧缓冲区的概念,掌握如何设置帧缓冲区来显示图像: 13.1 LCD和LCD控制器 13.1 ...
- JZ2440 裸机驱动 第11章 通用异步收发器UART
本章目标: 了解UART原理: 掌握S3C2410/S3C2440中UART的使用 11.1 UART原理及UART内部使用方法 11.1.1 UART原理说明 UART用于传输串行数据: ...
- JZ2440 裸机驱动 第6章 存储控制器
本章目标: 了解S3C2410/S3C2440地址空间的布局 掌握如何通过总线形式访问扩展的外设,比如内存.NOR Flash.网卡等 ························ ...
- JZ2440 裸机驱动 第8章 NAND Flash控制器
本章目标 了解NAND Flash 芯片的接口 掌握通过NAND Flash控制器访问NAND Flash的方法 8.1 NAND Flash介绍和NAND Flash控制器使用 NAND ...
- JZ2440 裸机驱动 第7章 内存管理单元MMU
本章目标: 了解虚拟地址和物理地址的关系: 掌握如何通过设置MMU来控制虚拟地址到物理地址的转化: 了解MMU的内存访问权限机制: 了解TLB.Cache.Write ...
随机推荐
- POJ 1128 拓扑排序 + 深搜
/* (⊙v⊙)嗯 貌似是一个建图 拓扑+深搜的过程.至于为什么要深搜嘛..一个月前敲得题现在全部推了重敲,于是明白了.因为题意要求如果有多个可能的解的话. * 就要输出字典序最小的那个.所以可以对2 ...
- DBLookupComboBox 的初始值
http://www.yourdelphi.com/topic_234544_e6b7.htm 试下在form的oncreate中加入 dblookupcombobox1.keyvalue:=tabl ...
- POJ 2242 The Circumference of the Circle
做题回顾:用到海伦公式,还有注意数据类型,最好统一 p=(a+b+c)/2; s=sqrt(p*(p-a)*(p-b)*(p-c));//三角形面积,海伦公式 r=a*b*c/(4*s);//这是外接 ...
- 根据ip,实现地址信息查询接口
偶然发现的360搜索的ip查询接口,记录下: 接口地址:https://m.so.com/position 使用方式1:传ip 如访问https://m.so.com/position?ip=47.1 ...
- pat 集合相似度
L2-005. 集合相似度 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定两个整数集合,它们的相似度定义为:Nc/Nt*1 ...
- cocos2d-x移植:xcode到eclipse
xcode程序移植到eclipse 必要组件: 1.macos gcc编译器,若没有,在xcode->preference->downloads中下载command line tools( ...
- Okhttp之CallServerInterceptor简单分析
在Okhttp源码分析专栏的几篇博客分析了Okhttp几个拦截器的主要功能,还剩下最后一个拦截器CallServerInterceptor没有分析,本篇博客就简单分析下该拦截器的功能. 在Okhttp ...
- python3:定时执行自动化测试脚本
转载请注明出处:https://www.cnblogs.com/shapeL/p/9172990.html 1.windows任务计划定时执行脚本 (1)创建 .bat 文件,执行脚本的命令(inte ...
- OO面向对象多线程编程作业总结
第五次作业:多线程电梯调度 设计策略 在本次电梯作业当中,我构造了一个电梯请求队列线程,一个调度器线程,三个电梯线程,一个文件输出线程,还有主线程. 调度器扫描用户的请求队列,将每个队列分配给 ...
- Windows 7 64bit Python 2 Install
安装 setuptools 出现 UnicodeDecodeError 文件 Lib/mimetypes.py 中的 bug, 通过以下 patch 修复: Index: Lib/mimetypes. ...