根据您提供的图片,我们可以看到一个S3C2440微控制器的中断处理流程图。这个流程图展示了从中断请求源到CPU的整个中断处理过程。以下是流程图中各个部分与您提供的寄存器之间的关系:
-
请求源(带sub寄存器):
-
这些是具体的中断源,例如UART0-ERR、UART0-RXD、UART0-TXD等。
-
每个请求源可能有一个对应的子中断源挂起标志(SUBSRCPND),用于指示该请求源下的具体中断事件。
-
-
子中断源开关(SUBMASK):
-
这个开关用于使能或禁用子中断源的中断请求。
-
例如,如果
SUBMASK
寄存器的某位被清除(即设置为0),则对应的子中断源的中断请求将被屏蔽。
-
-
源挂起标志(SRCPND):
-
这个寄存器用于记录哪些中断源的中断请求已经发生但尚未被处理。
-
在流程图中,
SRCPND
寄存器的值会被传递到开关(MASK)和优先级(MODE)模块。
-
-
开关(MASK):
-
这个模块用于使能或禁用中断请求的传递。
-
它使用
INTMSK
寄存器的值来决定是否允许中断请求通过。 -
在代码中,
INTMSK &= ~(1 << 5);
操作使能了EINT8_23中断组。
-
-
优先级(MODE):
-
这个模块用于设置中断的优先级。
-
它可能涉及到优先级寄存器(例如
INTPR
),但在您提供的代码中没有直接使用。
-
-
中断挂起标志(INTPND):
-
这个寄存器用于记录哪些中断已经发生但尚未被处理。
-
在流程图中,
INTPND
寄存器的值会被传递到CPU。 -
在代码中,
INTPND = INTPND;
操作用于清零中断挂起寄存器。
-
-
CPSR(I, F):
-
这是当前程序状态寄存器(CPSR)中的两个位,用于控制中断使能和禁止。
-
CPSR
寄存器的I
位用于使能或禁止IRQ中断,F
位用于使能或禁止FIQ中断。 -
在代码中,通过修改CPSR寄存器来使能IRQ中断。
-
-
CPU(ARM920T):
-
最终,处理完的中断请求会被传递到CPU进行处理。
-
CPU会根据中断的优先级和当前的中断使能状态来决定是否响应中断。
-
总结来说,流程图中展示了从中断请求源到CPU的整个中断处理过程,而您提供的寄存器在这个过程中起到了关键的作用。每个寄存器都有其特定的功能,共同协作以确保中断能够被正确地处理。
发生中断处理
-
mrs r0, cpsr
-
这条指令将当前程序状态寄存器(CPSR)的值移动到通用寄存器
r0
中。 -
CPSR包含了处理器的状态信息,如条件标志、中断使能位等。
-
-
bic r0, r0, #0x1f
-
这条指令对
r0
寄存器进行位清除(Bit Clear)操作,用于清除CPSR中的模式位(最低的5位,即0x1F)。 -
这样做是为了将当前的处理器模式位清零,为下一步设置新的模式做准备。
-
-
orr r0, r0, #0x12
-
这条指令对
r0
寄存器进行位或(Bit OR)操作,将模式位设置为0x12。 -
在ARM架构中,0x12代表IRQ模式。
-
-
msr cpsr_c, r0
-
这条指令将
r0
寄存器的值移回CPSR。 -
由于使用了
cpsr_c
而不是cpsr
,这条指令仅修改CPSR中的条件码标志位和模式位,而不会影响其他位(如中断使能位)。 -
这一步完成了处理器模式从当前模式切换到IRQ模式的操作。
-
-
ldr sp, =0x40000C00
-
这条指令将立即数
0x40000C00
加载到栈指针(SP)寄存器中。 -
这样做是为了初始化IRQ模式的栈指针,为即将到来的中断处理程序准备栈空间。
-
0x40000C00
是为IRQ模式预设的栈地址。
-
INTOFFSET为中断的偏移量,反映的是那种中断
在S3C2440微控制器中,涉及到中断处理的寄存器有多个,每个寄存器都有其特定的作用。以下是您提供的代码中涉及到的寄存器及其作用的详细说明:
1. GPGCON
-
作用:配置GPIO端口G的引脚功能。
-
操作:
-
GPGCON &= ~(0x3 << 0);
:清除GPG0引脚的功能设置,确保其不被其他功能占用。 -
GPGCON |= (0x2 << 0);
:将GPG0引脚设置为外部中断(EINT8)模式。
-
2. EXTINT1
-
作用:外部中断控制寄存器,用于设置外部中断的触发方式。
-
操作:
-
EXTINT1 &= ~(0x7 << 0);
:清除EINT8的触发方式设置,确保其不被其他设置影响。 -
EXTINT1 |= (0x2 << 0);
:将EINT8设置为下降沿触发。
-
3. EINTMASK
-
作用:外部中断屏蔽寄存器,用于使能或禁用特定的外部中断。
-
操作:
-
EINTMASK &= ~(1 << 8);
:使能EINT8中断,即清除屏蔽位,允许EINT8中断请求被发送到中断控制器。
-
4. INTMSK
-
作用:中断屏蔽寄存器,用于使能或禁用一组中断。
-
操作:
-
INTMSK &= ~(1 << 5);
:使能EINT8_23中断组,即清除屏蔽位,允许EINT8_23组中的中断请求被发送到中断控制器。
-
5. EINTPEND
-
作用:外部中断挂起寄存器,用于记录哪些外部中断已经发生但尚未被处理。
-
操作:
-
EINTPEND |= (1 << 8);
:清零EINT8的挂起位,表示EINT8中断已经被处理。
-
6. SRCPND
-
作用:源挂起寄存器,用于记录哪些中断源的中断请求已经发生但尚未被处理。
-
操作:
-
SRCPND |= (1 << irq_num);
:清除特定中断源的挂起位,表示该中断已经被处理。
-
7. INTPND
-
作用:中断挂起寄存器,用于记录哪些中断已经发生但尚未被处理。
-
操作:
-
INTPND = INTPND;
:通过将寄存器的值写回自身,清零所有挂起的中断位,表示所有挂起的中断已经被处理。
-
8. INTOFFSET
-
作用:中断偏移量寄存器,用于提供当前发生的中断的编号。
-
操作:
-
unsigned int irq_num = INTOFFSET;
:读取当前中断的编号,用于确定是哪种中断发生了。
-
这些寄存器共同工作,实现了S3C2440微控制器的中断处理机制,确保了系统能够正确响应和处理各种中断请求。
将value读取出来计算电压为3.3/1024*value