有点入门了,好吧,开始学点稍微复杂的,写一个单按键的程序。
有人可能会笑,这个复杂?的确,只有一个按键是比较简单的,关键是我们要通过这个按键引出中断处理的部分,这个就比较核心了。中断是学习某个CPU最重要的部分之一。
这次我们将使用realview提供的初始化文件,学会自己配置(以后还有自己写呢)。然后完成一次按键触发一次中断处理函数的功能。怎么判断有没有触发中断呢?我们不是写了串口的程序吗,中断一次由串口向PC机发送个数据好了。
1 配置(s3c2410a.s 对应的configuration):
等会儿截几个图吧,现在手头没有截图工具。
2 s3c2410a.s 的几个片段,着重关注中断部分。
159IntVT_SETUP
EQU
1
160IntVTAddress
EQU
0x33FFFF20
...........
795
AREA
RESET
,
CODE
,
READONLY
796
ARM
799; Exception Vectors
800; Mapped to Address 0.
801; Absolute addressing mode must be used.
802; Dummy Handlers are implemented as infinite loops which can be modified.
803
804Vectors
LDR
PC
,
Reset_Addr
805
LDR
PC
,
Undef_Addr
806
LDR
PC
,
SWI_Addr
807
LDR
PC
,
PAbt_Addr
808
LDR
PC
,
DAbt_Addr
809
NOP
; Reserved Vector
810
LDR
PC
,
IRQ_Addr
811
LDR
PC
,
FIQ_Addr
813
814
IF
IntVT_SETUP
<>
0
816;Interrupt Vector Table Address
817HandleEINT0
EQU
IntVTAddress
818HandleEINT1
EQU
IntVTAddress
+
4
819HandleEINT2
EQU
IntVTAddress
+
4
*
2
820HandleEINT3
EQU
IntVTAddress
+
4
*
3
821HandleEINT4_7
EQU
IntVTAddress
+
4
*
4
822HandleEINT8_23
EQU
IntVTAddress
+
4
*
5
823HandleReserved
EQU
IntVTAddress
+
4
*
6
850IRQ_Entry
851
sub
sp
,
sp
,
#4 ;reserved for PC
852
stmfd
sp!,{r8-r9} ;备份r8 r9
853
854
ldr
r9
,=
INTOFFSET ;取的中断偏移
855
ldr
r9
,[
r9
]
856
ldr
r8
,=
HandleEINT0 ;得到中断处理函数地址的基地址
857
add
r8
,
r8
,
r9
,
lsl
#2 ;根据基地址和偏移得到实际中断处理函数地址
858
ldr
r8
,[
r8
]
859
str
r8
,[
sp
,
#8]
860
ldmfd
sp!,{r8-r9,pc} ;修改pc指针,跳转到二级中断处理函数处
861
862
ENDIF
863
864Reset_Addr
DCD
Reset_Handler
865Undef_Addr
DCD
Undef_Handler
866SWI_Addr
DCD
SWI_Handler
867PAbt_Addr
DCD
PAbt_Handler
868DAbt_Addr
DCD
DAbt_Handler
869
DCD
0
; Reserved Address
870IRQ_Addr
DCD
IRQ_Handler
871FIQ_Addr
DCD
FIQ_Handler
872
873Undef_Handler
B
Undef_Handler
874SWI_Handler
B
SWI_Handler
875PAbt_Handler
B
PAbt_Handler
876DAbt_Handler
B
DAbt_Handler
877
878
IF
IntVT_SETUP
<>
1
879IRQ_Handler
B
IRQ_Handler
880
ENDIF
881
882
IF
IntVT_SETUP
<>
0
883IRQ_Handler
B
IRQ_Entry
884
ENDIF
885
886FIQ_Handler
B
FIQ_Handler
可见触发irq中断时,cpu自动把cpsr保存到spsr,把pc指针置为0x18。经过LDR PC,IRQ_Addr,IRQ_Handler B IRQ_Entry,两次跳转,最终跳到了IRQ_ENTRY, 这其实就是一级中断处理函数,一级中断处理函数的作用就是根据中断偏移寄存器查的其处理函数的地址,请看代码中的注释。
因为用html粘贴的代码,所以提示我文章过长,只有另开一文喽。
上一篇:S3c2410裸板程序入门---串口
下一篇:阅读ARM Memory(L1/L2/MMU)笔记
推荐阅读最新更新时间:2024-11-06 10:16
设计资源 培训 开发板 精华推荐
- EVAL-AD9874EB,AD9874 评估板是一款通用 IF 子系统,可将低电平 10-MHz 至 300-MHz IF 输入数字化,信号带宽范围为 6.8-kHz 至 270-kHz
- EVAL-AD7719-EB,使用 AD7719、24 位、双 Sigma Delta 模数转换器的评估板
- S1R72U06EV,基于S1R72U06 USB接口IC的评估板
- 使用 Microchip Technology 的 MIC45116-1YMP 的参考设计
- STM32F407ZGT6最小系统核心板(标准版工程)
- PICDEM MSC1,用于 PIC16C782 遥测红外通信的开发板
- LTC4257-1 的典型应用 - 具有双电流限制的 IEEE 802.3af PD 以太网供电接口控制器
- 用于便携式的 1.4 至 18V 模拟放大器
- 适用于汽车应用的 LT3973HMSE-3.3 3.3V 降压转换器的典型应用
- LMV358DMR2G 维恩桥振荡器典型应用电路