s3c2440中断体系

发布者:alpha11最新更新时间:2024-07-15 来源: elecfans关键字:s3c2440  中断体系 手机看文章 扫描二维码
随时随地手机看文章

一、S3C2440的中断系统

1.1 S3C2440的7种模式

用户模式(usr):ARM处理器正常的程序执行状态 快速中断模式(fiq):用于高速数据传输或通道处理 中断模式(irq):用于通用的中断处理 管理模式(svc):操作系统使用的保护模式 数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护 系统模式(sys):运行具有特权的操作系统任务 未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真 除用户模式外,其他6种工作模式都属于特权模式,大多数程序运行于用户模式,进入特权模式是为了处理中断、异常,或者访问被保护的系统资源。

s3c2440中断体系

s3c2440中断体系

1.2 CPSR(current program state register,当前程序状态寄存器)

s3c2440中断体系

s3c2440中断体系

s3c2440中断体系

s3c2440中断体系

代码语言:javascript

ldr sp, =4096           @ 设置栈指针,以下都是C函数,调用前需要设好栈

bl  disable_watch_dog   @ 关闭WATCHDOG,否则CPU会不断重启

    

msr cpsr_c, #0xd2       @ 进入中断模式 0xd2=1101 0010ldr sp, =3072           @ 设置中断模式栈指针


msr cpsr_c, #0xd3       @ 进入管理模式 0xd3=1101 0011ldr sp, =4096           @ 设置管理模式栈指针,

                        @ 其实复位之后,CPU就处于管理模式,

                        @ 前面的“ldr sp, =4096”完成同样的功能,此句可省略


1.3 S3C2440的中断过程

s3c2440中断体系

s3c2440中断体系

首先,当有中断请求时,SUBSRCPND或者SRCPND中的相应位会被置1 然后,根据SUBMASK和MASK寄存器的设置值进行相应的屏蔽,如果一个中断请求发生但被屏蔽了,中断信号传递停止 最后,根据MODE寄存器判断该中断源的模式,如果是快中断模式(系统只有一个中断源为快中断其他的都为普通中断)直接执行,如果是普通中断则跟其他普通中断角逐出一个优先级最高的送到INTPND寄存器

二、S3C2440中断寄存器

s3c2440的中断系统一共需要设置5个寄存器,中断源寄存器SRCPND、SUBSRCPND,中断模式寄存器INTMOD,中断屏蔽寄存器INTMASK、INTSUBMASK,中断优先级寄存器PRIORITY,中断待决寄存器INTPND

2.1 中断源寄存器

s3c2440支持60个中断源,部分是子中断源(比如串口接收中断、串口发送中断、串口错误中断都属于串口中断)

SRCPND中断源寄存器地址为0X4A000000,它一共32位,每一位都代表一个中断源,相应的中断置1就表示有中断请求,置0就表示无中断请求(中断的置1系统自动完成,清0需要用户手动)。

清0的方法就是向SRCPND或者SUBSRCPND的相应位写1即可,清0的位置由用户决定。如果在中断处理程序结束处清0,那么在执行中断程序过程中即便该中断源又有中断请求,程序也无法响应。如果中断处理程序的开始处清0,那么在执行中断处理程序的过程中该中断源又有中断请求程序也能响应。

SRCPND寄存器中每位代表的中断源如下:

s3c2440中断体系

s3c2440中断体系

SUBSRCPND子中断源寄存器地址为0X4A000018,每位代表的中断源如下:

s3c2440中断体系

s3c2440中断体系

2.2 中断模式寄存器

INTMOD中断模式寄存器的地址为0X4A000004,一共32位,每位代表的中断源和SRCPND中一致。如果置1则相应位的中断源就为快中断,否则就为普通中断。(32个中断源中只有一个能设为快中断)

2.3 中断屏蔽寄存器

INTMSK中断屏蔽寄存器的地址为0X4A000008,一共32位,每位代表的中断源和SRCPND中一致。如果置1则相应的中断源将不被响应,否则可以响应相应的中断源。(中断屏蔽不影响:有中断请求SRCPND相应位置1)

2.4 中断优先级寄存器

s3c2440优先级仲裁模块示意图如下:

s3c2440中断体系

s3c2440中断体系

s3c2440优先级逻辑由7个仲裁器构成。每个仲裁器中REQ0优先级最高,REQ5优先级最低。余下的REQ1、REQ2、REQ3、REQ4优先级则由ARB_MODE(1位)和ARB_SEL(2位)来决定。

仲裁器的ARB_SEL位和各输入信号优先级对应关系表

s3c2440中断体系

s3c2440中断体系

当某个仲裁器的ARB_MODE被设置为0时,它的ARB_SEL位是不会自动变化的,此时该仲裁器的输入引脚的优先级固定不变。(当然可以通过软件修改ARB_SEL的值来改变它们的优先级)当ARB_MODE的值设置为1时,ARB_SEL会随着已被服务的IRQx(x为1~4)值而自动改变。

中断优先级仲裁器的ARB_SEL变化规则

s3c2440中断体系

s3c2440中断体系

s3c2440的优先级寄存器PRIORITY 的位置为0x4A00000C,为32位,7组仲裁器,每组使用3位,共使用21位,其寄存器每位的分布如下:

s3c2440中断体系

s3c2440中断体系

2.5 中断待决寄存器

中断待决寄存器INTPND地址为0X4A000010,一共32位,每位代表的中断源和SRCPND中一致。如果相应位置1则中断请求被受理。同一时间只允许一个中断源被受理。(INTPND置1系统自动,清0用户手动,在SRCPND清0后才清除)

INTOFFSET中断偏移寄存器地址为 0X4A000014,一共32位,表示INTPND中的置1位的位序号(0~31),它在INTPND和SRCPND清0后自动清0。


三.中断实例程序


3.1 外部中断实例


代码语言:javascript


@初始化的代码                                                                

@ 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


Reset:                  

    ldr sp, =4096           @ 设置栈指针,以下都是C函数,调用前需要设好栈

    bl  disable_watch_dog   @ 关闭WATCHDOG,否则CPU会不断重启

    

    msr cpsr_c, #0xd2       @ 进入中断模式

    ldr sp, =3072           @ 设置中断模式栈指针


    msr cpsr_c, #0xd3       @ 进入管理模式

    ldr sp, =4096           @ 设置管理模式栈指针,

                            @ 其实复位之后,CPU就处于管理模式,

                            @ 前面的“ldr sp, =4096”完成同样的功能,此句可省略

    bl  init_led            @ 初始化LED的GPIO管脚

    bl  init_irq            @ 调用中断初始化函数,在init.c中

    msr cpsr_c, #0x53       @ 设置I-bit=0,开IRQ中断

    

    ldr lr, =halt_loop      @ 设置返回地址

    ldr pc, =main           @ 调用main函数

halt_loop:

    b   halt_loop


HandleIRQ:

    sub lr, lr, #4                  @ 计算返回地址

    stmdb   sp!,    { r0-r12,lr }   @ 保存使用到的寄存器

                                    @ 注意,此时的sp是中断模式的sp

                                    @ 初始值是上面设置的3072

    

    ldr lr, =int_return             @ 设置调用ISR即EINT_Handle函数后的返回地址  

    ldr pc, =EINT_Handle            @ 调用中断服务函数,在interrupt.c中

int_return:

    ldmia   sp!,    { r0-r12,pc }^  @ 中断返回, ^表示将spsr的值复制到cpsr,此处将返回到主函数执行

代码语言:javascript


/*中断相关寄存器的初始化*/

#include 's3c24xx.h'


/*

 * LED1,LED2,LED4对应GPB5、GPB6、GPB7、GPB8

 */

#define GPB5_out (1<<(5*2))

#define GPB6_out (1<<(6*2))

#define GPB7_out (1<<(7*2))

#define GPB8_out (1<<(8*2))


#define GPB5_msk (3<<(5*2))

#define GPB6_msk (3<<(6*2))

#define GPB7_msk (3<<(7*2))

#define GPB8_msk (3<<(8*2))


/*

 * K1,K2,K3,K4对应GPF1、GPF4、GPF2、GPF0

 */

#define GPF0_int     (0x2<<(0*2))

#define GPF1_int     (0x2<<(1*2))

#define GPF2_int     (0x2<<(2*2))

#define GPF4_int     (0x2<<(4*2))


#define GPF0_msk    (3<<(0*2))

#define GPF1_msk    (3<<(1*2))

#define GPF2_msk    (3<<(2*2))

#define GPF4_msk    (3<<(4*2))


/*

 * 关闭WATCHDOG,否则CPU会不断重启

 */

void disable_watch_dog(void)

{

    WTCON = 0;  // 关闭WATCHDOG很简单,往这个寄存器写0即可

}


void init_led(void)

{

// LED1,LED2,LED3,LED4对应的4根引脚设为输出

GPBCON &= ~(GPB5_msk | GPB6_msk | GPB7_msk | GPB8_msk);

GPBCON |= GPB5_out | GPB6_out | GPB7_out | GPB8_out;

}


/*

 * 初始化GPIO引脚为外部中断

 * GPIO引脚用作外部中断时,默认为低电平触发、IRQ方式(不用设置INTMOD)

 */ 

void init_irq( )

{

// K1,K2,K3,K4对应的4根引脚设为中断功能

GPFCON &= ~(GPF0_msk | GPF1_msk | GPF2_msk | GPF4_msk);

GPFCON |= GPF0_int | GPF1_int | GPF2_int | GPF4_int;


    // 对于EINT4,需要在EINTMASK寄存器中使能它

    EINTMASK &= ~(1<<4);

            

    /*

     * 设定优先级:

     * ARB_SEL0 = 00b, ARB_MODE0 = 0: REQ1 > REQ2 > REQ3,即EINT0 > EINT1 > EINT2

     * 仲裁器1、6无需设置

     * 最终:

     * EINT0 > EINT1> EINT2 > EINT4 即K4 > K1 > K3 > K2

     */

    PRIORITY = (PRIORITY & ((~0x01) | ~(0x3<<7)));


    // EINT0、EINT1、EINT2、EINT4_7使能

    INTMSK   &= (~(1<<0)) & (~(1<<1)) & (~(1<<2)) & (~(1<<4));

}

代码语言:javascript


/*中断处理函数*/

#include 's3c24xx.h'

void EINT_Handle()

{

    unsigned long oft = INTOFFSET;

    unsigned long val;

/*

* K1,K2,K3,K4对应GPF1、GPF4、GPF2、GPF0

*            即 EINT1, ETIN4, EINT2, EINT0

*            oft为 1, 4, 2, 0 (对应INTMSK寄存器)

*/  

    switch( oft )

    {

        // K1被按下

        case 1: 

        {   

            GPBDAT |= (0xF<<5);   // 所有LED熄灭

            GPBDAT &= ~(1<<5);      // LED1点亮

            break;

        }       

        // K2被按下

        case 4:

        {   

            GPBDAT |= (0xF<<5);   // 所有LED熄灭

            GPBDAT &= ~(1<<6);      // LED2点亮

            break;

        }

        // K3被按下

        case 2:

        {   

            GPBDAT |= (0xF<<5);   // 所有LED熄灭

            GPBDAT &= ~(1<<7);      // LED3点亮

            break;

        }

        // K4被按下

        case 0:

        {   

            GPBDAT |= (0xF<<5);   // 所有LED熄灭

            GPBDAT &= ~(1<<8);      // LED4点亮

            break;

[1] [2]
关键字:s3c2440  中断体系 引用地址:s3c2440中断体系

上一篇:S3C2440 LED驱动总结
下一篇:S3C2440C语言点灯

推荐阅读最新更新时间:2024-11-09 10:24

s3c2440移植Linux内核,移植Linux-3.4.2内核到S3C2440
一、BootLoader引导内核过程 1、Bootloader的工作 1.1、将内核读入内存 1.2、保存内核启动参数到指定位置,内核启动时去这个位置解析参数 1.3、启动内核、传入机器ID 二、内核的启动流程 内核首要目的是挂载根文件系统,启动应用程序,内核启动的过程大致为以下几步: 1.检查CPU和机器类型 2.进行堆栈、MMU等其他程序运行关键的东西进行初始化 3.打印内核信息 4.执行各种模块的初始化 5.挂接根文件系统 6.启动第一个init进程 对于ARM的处理器,内核第一个启动的文件是arc/arm/kernel下面的head.S文件 第一阶段: 首先截取部分head.S文件 ENTRY(stext) THUMB
[单片机]
s3c2440中断学习笔记
进入异常时cpu将做如下工作 1.将中断时pc的值copy到lr(此时pc的值为中断指令位置+8,所以返回的指令地址应该是当前pc值+4) 2.CPSR- SPSR_(irq)  (相当于bl跳转) 3.强制进入irq,ARM工作模式 4.跳转到异常制定的指令位置 进入异常时应该保护寄存器:stmdb sp!, { r0-r12,lr } 退出时恢复寄存器:    ldmia  sp!,  {r0-r12,pc}^   ^ :当 register list 中有pc寄存器时,表示执行指令后spsr中的值自动复制到cpsr中,如果没有pc寄存器是,^表示操作的是用户模式下的寄存器,而不是当前特权模式的寄存器,也就是说在特权模式下
[单片机]
S3C2440串口通讯的相关配置
UART配置的相关寄存器如下(按s3c2440手册中的顺序列出): 1. ULCONn寄存器:线性控制寄存器 功能:设置奇偶校验,停止位, 数据位(5-8位) 注意:一般设置为无校验,一个停止位,数据位为8位,也就是常说的“8N1”,此时寄存器值为0x3。(bit =0为正常模式,否则为红外模式); 2. UCONn寄存器:通道n控制器 功能:选择UART时钟源、设置UART中断方式 注意:可选择PCLK、UEXTCLK或FCLK/n。bit =1为回送模式,用于测试;bit 和bit 分别控制传输和接收模式,初学者常设置为中断请求或查询模式,bit =bit =01。 3. UFCONn寄存器:FIFO控制寄存器 功能:用于设置
[单片机]
Boa Web服务器在PC和S3C2440开发板上移植
  boa是一个非常小巧的Web服务器,可执行代码只有约60KB。它是一个单任务Web服务器,只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行。下面我们讲解以下boa如何在PC机(虚拟机RedHatAS5环境)完成移植修改工作。 一、下载Boa源码 下载地址: http://www.boa.org/或 http://labs.nevion.com/open-source/ 目前最新发行版本:0.94.13(05年更新版本)   下载 boa-0.94.13.tar.gz(注意:若从boa上下载的是boa-0.94.13.tar.tar,解压方式
[单片机]
s3c2440裸机-电阻触摸屏编程(3.触摸屏TSC的初始化和中断服务程序框架)
1. ADC中断产生流程 中断源: 这里是ADC和TSC共用一个中断源。 SRCPND表示哪个中断源产生了中断请求。 INTMODE:配置中断模式 配置中断屏蔽寄存器 中断挂起寄存器(用来显示当前优先级最高的、正在发生的中断, 需要清除对应位) 从SRCPND寄存器可以读到ADC和TSC复用的同一个中断源,那么如何区分呢? 可以从SUBSRCPND寄存器配置,如下: 当bit 9被置1时,表示TSC中断。那么我们需要打开subsrcmask寄存器 所以TSC中断的产生流程如下: 2. TSC编程实现   ①初始化TSC,ADCTSC寄存器   ②设定TSC处于“等待中断模式”
[单片机]
<font color='red'>s3c2440</font>裸机-电阻触摸屏编程(3.触摸屏TSC的初始化和<font color='red'>中断</font>服务程序框架)
基于ADS1256的地震数据采集电路设计
本文为大家介绍以ARM内核S3C2440为处理器,24位自带模拟开关的ADS1256芯片为A/D转换和信号输入通道选择,利用其特性、工作原理来设计具有高精度、多通道、实时操作性强的地震数据采集系统电路。数据通过桥式低通滤波输入,有效地抑制了长导线共模信号,并且大大提高了整个电路抗电磁干扰能力,从而可以实现地震数据采集系统的高精度、高质量、低功耗和便携式等特点。 系统总体结构框图 电路总体结构如图1所示,采用三星公司生产的ARM9系列S2C2440微处理器作为核心控制芯片,由地震检波器输出微弱、复杂的地震信号首先经模拟信号调理电路的放大、跟随以及滤波等处理后,再通过控制模拟开关进行选择通道,然后再应用ADS1256进行模/数转换
[单片机]
基于ADS1256的地震数据采集电路设计
s3c2440移植openharmony
s3c2440移植openharmony。OpenHarmony是开放原子开源基金会的一个孵化项目,OpenHarmony完全开源开放,OpenHarmony轻量和小型系统比较适合内存小的IOT设备。 OpenHarmony同时提供许多可选的系统组件,设备开发者能够按需配置。系统能够把这些能够选择的组件合成一个系列的系统能力让设备开发者更好的理解和开发。 想对OpenHarmony进行开发、编译、烧录、调测能够使用DevEco Device Tool。 现在的openharmony轻量和小型系统搭建系统环境Windows版本不支持在Windows平台编译,Hi3861除外,其它的只能在Ubuntu平台下编译。
[单片机]
S3C2440 中断解析(各个中断相关寄存器分析)
S3C2440外部中断操作 这两天在调试2440外部中断的时候,通过jlink来调试,老是进不了中断。 因为借鉴了网上很多程序,感觉不应该是程序的问题。后来通过USB口,利用 supervivi的download&run功能,把编译产生的bin文件下载到内存中。超级终 端就提示:Dummy_isr error, interrupt number: 5, INTMSK = 0xffff16ff已是网上查 了这个错误。才知道是什么原因。因为SDRAM的起始地址为0x30000000,把 程序烧写进SDRAM,起始地址不为0而不程序中断后,PC默认指向0x00-0x1C, 内部SRAM的地址0处都不存在你要调试的程序的中断向量表,所以不
[单片机]
<font color='red'>S3C2440</font> <font color='red'>中断</font>解析(各个<font color='red'>中断</font>相关寄存器分析)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved