S3C2440的中断的那些事儿(二) C语言部分讲解

发布者:Enchanted2023最新更新时间:2023-09-04 来源: elecfans关键字:S3C2440  中断 手机看文章 扫描二维码
随时随地手机看文章

 1 void init_irq( )

 2 {

 3     // S2,S3对应的2根引脚设为中断引脚 EINT0,ENT2

 4     GPFCON &= ~(GPF0_msk | GPF2_msk);

 5     GPFCON |= GPF0_eint | GPF2_eint;

 6 

 7     // S4对应的引脚设为中断引脚EINT11

 8     GPGCON &= ~GPG3_msk;

 9     GPGCON |= GPG3_eint;

10     

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

12     EINTMASK &= ~(1<<11);

13         

14     /*

15      * 设定优先级:

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

17      * 仲裁器1、6无需设置

18      * 最终:

19      * EINT0 > EINT2 > EINT11即K2 > K3 > K4

20      */

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

22 

23     // EINT0、EINT2、EINT8_23使能

24     INTMSK   &= (~(1<<0)) & (~(1<<2)) & (~(1<<5));

25 }


上面就是韦东山的中断源代码:


第四行和第五行代码分析:把按键的引脚先变成中断引脚


第十二行:


EINTMASK &= ~(1<<11);  因为前3个中断是不能被masked的从第四个中断开始 当置0的时候是使能中断 这里是使能第十一个中断。 默认初始值是1

这个是对于外部中断使能

第二十一行:


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


此实验用到了仲裁器0 

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


第24行:

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

这个寄存器是对所有的中断 设置为0的时候是开启所有中断


下图中的函数是中断服务函数


 1 void EINT_Handle()

 2 {

 3     unsigned long oft = INTOFFSET;

 4     unsigned long val;

 5     

 6     switch( oft )

 7     {

 8         // S2被按下

 9         case 0: 

10         {   

11             GPFDAT |= (0x7<<4);   // 所有LED熄灭

12             GPFDAT &= ~(1<<4);      // LED1点亮

13             break;

14         }

15         

16         // S3被按下

17         case 2:

18         {   

19             GPFDAT |= (0x7<<4);   // 所有LED熄灭

20             GPFDAT &= ~(1<<5);      // LED2点亮

21             break;

22         }

23 

24         // K4被按下

25         case 5:

26         {   

27             GPFDAT |= (0x7<<4);   // 所有LED熄灭

28             GPFDAT &= ~(1<<6);      // LED4点亮                

29             break;

30         }

31 

32         default:

33             break;

34     }

35 

36     //清中断

37     if( oft == 5 ) 

38         EINTPEND = (1<<11);   // EINT8_23合用IRQ5

39     SRCPND = 1<40     INTPND = 1<41 }


INTOFFSET 里面的值显示了哪一个中断正在被执行

第三十八行 EINTPEND 如果清除(置1)这里面的位 则清除了中断

第三十九行和第四十行都是一样的清除中断


总结


下面总结一下如何写一个中断的程序:

1.给中断设置栈 然后进入管理模式

2.初始化中断 (EINTMSK和INTMSK 两个寄存器都要设置)还要设置优先级

3.开总中断

4.进入中断服务函数之后 先保存数据进栈 和计算返回地址

5.然后执行服务函数里面的程序

6.之后清除PEND寄存器里面的标志位

7.退出中断之后POP栈内保存的值

8.告知PC 现在寄存器的状态(ldmia   sp!,    { r0-r12,pc }^)



1. 第一步是在start.S 里面打开全局中断


(1). 在CPSR 中打开全局中断


2. 外部中断初始化


1. 在这里我们只是使用外部中断19 GPG11

2. 现在GPIO 里面设置EINT19

3. 设置EXTINT2 设置GPG11的中断是否是上升沿或者下降沿触发

4. 使能中断

5. 使能中断服务寄存器INTMSK

6. 在INTOFFSET 里面可以查询出所有的中断信息

当中断触发之后 需要清除INTPND (PEND位)还有source PEND位的相应中断


在Start.S

里面 触发了中断之后 先设置栈(用到c语言的时候一定要用栈)

然后保存所有的寄存器和保存地址的寄存器

进入中断服务函数

执行之后 需要恢复现场把 SPSR 的值给CPSR


关键字:S3C2440  中断 引用地址:S3C2440的中断的那些事儿(二) C语言部分讲解

上一篇:ARM WIFI AP 模式 使用 iptables nat 转发 通过 LAN 网线上网
下一篇:u-boot2009.11 s3c2440移植手记

推荐阅读最新更新时间:2024-11-02 10:39

51单片机-中断函数基础
单片机中断按照中断源类型的不同主要分为:外部中断、定时器中断、串口中断 而因为电路板上可能存在多个定时器或多个引起外部中断的位置,所以产生多个中断源,也因此单片机有多个中断函数 以51单片机为例: ==================================== 中断编号 中断源 0 外部中断0 1 T0定时器溢出中断 2 外部中断1 3 T1定时器溢出中断 4 串口中断 ==================================== C程序中使用中断的方法 EA=1; //打开中断总开关 ET0=1; //打开T0定时器中断 while(
[单片机]
MCS51单片机边沿触发中断响应时刻的测量
MCS51单片机系列属于8位单片机,它是Intel公司继MCS48系列的成功设计之后,于1980年推出的产品。由于MCS51系列具有很强的片内功能和指令系统,因而使单片机的应用发生了一个飞跃,这个系列的产品也很快成为世界上第二代的标准控制器。51系列单片机有5个中断源,其中有2个是外部输入中断源INT0和INT1。可由中断控制寄存器TCON的IT1(TCON.2)和IT0(TCON.1)分别控制外部输入中断1和中断0的中断触发方式。若为0,则外部输入中断控制为电平触发方式;若为1,则控制为边沿触发方式。这里是下降沿触发中断。    1 问题的引出    几乎国内所有的单片机资料对单片机边沿触发中断的响应时刻方面的定义都是不明确的或
[单片机]
MCS51单片机边沿触发<font color='red'>中断</font>响应时刻的测量
STM32F1笔记(五)外部中断EXTI
STM32的每个IO都可以作为外部中断的中断输入口。 STM32F103的中断控制器支持19个外部中断/事件请求。每个中断设有状态为,每个中断/事件都有独立的触发和屏蔽设置。 STM32F103的19个外部中断为: EXTI线0~15:对应外部IO口的输入中断。 EXTI线16:连接到PVD输出。(Programmable Votage Detector 可编程电压监测器。连到EXTI的电源电压检测(PVD)中断) EXTI线17:连接到RTC闹钟事件。 EXTI线18:连接到USB唤醒事件。 STM32供IO口使用的中断线只有16个,而STM32的IO口远超16个。 所以STM32的GPIOx.0
[单片机]
STM32F1笔记(五)外部<font color='red'>中断</font>EXTI
ARM中断处理及状态机嵌套实现
1.ARM7提供两种级别的中断, FIQ(Fast Interrupt Request快中断) 一般中断低速反应中断IRQ。 所有的中断请求一旦产生则中断反应会经过三个步骤 a.输入阶段这个逻辑可以根据中断源被实现,需要0-2个时钟周期 b.EIC自身处理 2个时钟周期 c.ARM7的逻辑处理 2.EIC Enhanced Interrupt Controller增强型中断控制器 EIC硬件处理多路中断,中断优先运算和矢能。 a.32路可屏蔽的中断,映射到ARM 的CPU中断请求总线 b.每路16级可编程优先级映射IRQ c.硬件支持最大16个中断嵌套 d.2路可屏蔽的中断通过FIQ中断请求总线 e.在0x18处
[单片机]
AVR单片机中的中断嵌套
AVR响应中断后,由硬件自动清零全局中断标志位,此时任何中断都无法响应。直到中断响应程序执行完毕后,全局中断自动打开。因此,若不作特别处理,AVR单片机是无法实现中断嵌套的。 但,如果在中断服务程序中开放全局中断,一旦有中断(包括中断级别较低的,或者是自己本身)申请,AVR将立即响应中断,打断当前正在执行的任何程序(包括正在执行中断服务程序),进入新的中断服务程序,从而实现中断嵌套。此时如有多个中断申请同时存在,MCU响应高优先权的中断。 可见,AVR单片机中,若软件合理设计,即可实现中断嵌套。 和MCS51特别不同的是,AVR中断嵌套不仅可处理优先级更高的中断,也可以处理同优先级甚至优先级较低的中断。这能满足一些特殊的设计,
[单片机]
STM32中断没有子优先级?
看到一个交流群在讨论关于【关于STM32中断优先级的话题】,其中就有小伙伴提到:为什么有些STM32中断没有【子优先级】? 比如,有时候你在使用STM32CubeMX配置时,你会发现只有Preemption Priority【抢占优先级】,而没有Sub Priority【次优先级】: 然而,有时候你会发现又有Sub Priority【次优先级】: 这个问题就牵涉到STM32,准确的来说的是 Cortex-M NVIC嵌套向量中断控制器的问题。 下面就展开来说说关于ARM单片机NVIC的内容。 关于Cortex-M的NVIC NVIC:Nested Vectored Interrupt Controller,嵌套向量中断
[单片机]
STM32<font color='red'>中断</font>没有子优先级?
STM8L151C8单片机学习例程(6)——外部中断上升沿触发
STM8L_6_EXIT: 1.User:工程及main文件 2.Hardware:EXIT,CLK,LED,Delay 3.STM8L15x_StdPeriph_Driver:STM8自带库文件 4.Debug:hex文件存放于EXE文件夹 5.Function: 外部中断上升沿触发,翻转LED /** ****************************************************************************** * @file main.c * @author Alex——小白 * @version V1.0 * @date 2019
[单片机]
STM8L151C8单片机学习例程(6)——外部<font color='red'>中断</font>上升沿触发
基于S3C2440嵌入式系统主板的电磁兼容性设计
作者:许凯华,董淑云,刘玉华,胡立祥 华中师范大学  随着电子设备的频率越来越高,世界各国对电子产品电磁辐射标准的执行变得越来越严格,如何保证能在有限时间很好地在设计阶段发现并解决EMI/EMC问题非常重要,而PCB往往是一个电子系统的核心构成部分,一个经仔细电磁干扰设计的PCB板,能大幅度降低阻抗不匹配、传输线问题、信号互相耦合等现象引发的信号反射、延迟等线路不稳定因素,同时也可达到降低电磁辐射发射干扰,大大提高系统的稳定性和可靠性。本文将以嵌入式系统主板为平台,运用 EMIStream仿真软件,并采用源端串联端接阻抗的方法分析了解决嵌入式高速主板存在的电磁干扰问题。 1 电磁兼容性 1.1 电磁兼容和电磁干扰
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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