5.2440的按照中断编程

发布者:平凡幸福最新更新时间:2024-11-04 来源: cnblogs关键字:中断编程 手机看文章 扫描二维码
随时随地手机看文章

首先是打开底板的原理图,找到按键的信息:

可以找到四个按键:

可以看到四个按键对应的引脚是EINT1、EINT4、EINT2和EINT0. 然后在核心板原理图里去搜索这四个按键,可以看到下面的信息:

可以看到,按键中断与寄存器组GPF的引脚是互用的。所以接下来就是查看芯片手册里的GPF组寄存器的信息:重点是关注GPF控制寄存器:GPFCON

由于是按键,要配置成中断的方式,所以对应的GPF位设置为10=EINT[*]的方式。由上面知道要设置的位是EINT0、EINT4、EINT1和EINT2.

其实上面的这些设置就是中断源的设置。

代码:

上面就是初始化按键,也就是初始化中断源。

接下来是中断控制器的初始化:interrupt.c

由芯片手册知道,中断从发生到CPU响应的流程:

由于这里是按键中断,不用考虑SUBMASK,而且主要是讲按键中断的MASK操作,所以中断的模式MODE也不考虑和Priority保持为默认值。所以找到中断控制器的MASK寄存器:

它是由很多位构成的,每个位控制一种中断:

上面的信息知道对应的位如果是1,该中断会被屏蔽。由于我们要使用四个按键,对应的中断是EINT4、EINT2、EINT1和EINT0,所以要把这四位设置为0.但是这里需要注意的是[4]位控制了EINT4_7四个中断,所以要设置EINT4的时候,还需要在EINTMASK寄存器里进行相应的设置。

从上面知道,只有把该寄存器的第[4]位设置为0即可。

注意的是EINT4在EINTMASK寄存器里的设置必须在前面。

上面就完成了中断控制器的设置。

由于前面把中断给屏蔽了,现在就要把它打开,通过CPSR寄存器的I位:

重要位的解释:

可以看到只要将对应的位置为0就是打开中断。这里CPSR的末尾8位是属于control域的,我们使能中断也只是需要操作这8位。中断打开实现代码:

上面到这里才完成了中断的初始化。接下来是中断处理的部分。

中断处理:

保存环境的流程示意图:

可以看到,当中断产生的时候,系统会把处理完中断要跳转回来继续执行的位置lr-4的地址保存入lr寄存器里,用于保存环境。然后批量的保存现场的寄存器里的值:

stmfd sp!, {r0-r12, lr} /* 保护现场 */

这里的sp是堆栈指针,就是不r0-r12,13个寄存器的值和lr寄存器的值都保存到堆栈里。注意sp后面的!是指每一次的修改都将改变sp指针的值。

这样就保存好了现场,接下来就是中断处理程序的执行:

跳转到handle_int来处理不同的中断处理:

  1. 判断产生中断的中断源

  2. 根据中断源执行相应的中断处理程序。

1.要判断产生中断的中断源,需要通过一个寄存器INTOFFSET,它的每一个位代表一种中断信号:

所以接下来定义一个值,把这个寄存器里的值读出来。

由按键的原理图:

 

从上图知道,当一号按键K1被按下的时候,产生的中断是EINT1,当二号按键K2被按下的时候,产生的是EINT4,当三号按键被按下的时候,产生的是EINT2,当四号按键被按下的时候,产生的是EINT0.这四种中断源对应的OFFSET的值如下图:

下面是通过switch语句来实现不同按键按下相应的中断处理程序:

上面就完成了按键中断处理程序,但是此时我们还不能进行编译执行,再回去看中断处理的流程图:

/

在这流程图中还有SRCPND和INTPND寄存器没有设置。这两个寄存器是干啥用的呢?先来看芯片手册:

原来这个寄存器的作用是把处理完的中断对应的中断位清0的,这样,下一次中断产生才会被相应而得到相应的处理。所以我们处理完按键中断后,也需要对相应的位进行清0操作。

该寄存器对应的位的信息:

INTPND寄存器也是同理的,INTPND寄存器对应的参数:

接着就是对上面两个寄存器对应的位进行清零操作:对于这两个寄存器要注意的是,如果我们想往对应的位写入0,需要将该位设置为1,这是跟其他寄存器不同的地方。

这里由于我们用到了EINT4产生的中断源,它是属于EINT4_7寄存器组的,所以我们也需要设置清除EINTPND寄存器。

同理就是往对应的位写入1就是清零。

最后实现中断清零的代码:

处理完中断后就是恢复现场,把保存在堆栈里寄存器的值全部恢复回来,只是现在lr寄存器要变成pc程序状态寄存器了。

到这里我们就完成了中断的设置工作,执行make进行编译操作,将bin文件烧写到开发板,发现LED灯不亮,就是说我们的程序还存在着问题。那么这问题究竟出在哪呢?

    其实问题就出在没有初始化堆栈,因为刚开始初始化的堆栈是在SVC模式下的:

可以看到程序一开始就工作在SVC模式,而我们的按键中断是工作在irq模式的。我们需要这是工作在irq模式的堆栈,才能让程序正常运行。要设置系统工作在irq模式,需要将CPSR的模式位设置为10010:

实现代码:

这里的cpsr_c是CPSR寄存器的末尾8位:

这里设置的值为0xd2=0b 11010010,可以看到该值把中断打开了,而且还设置系统工作在irq模式。

最后的代码是:

我们给irq模式下的sp堆栈设置了值,接着给SVC模型下的sp堆栈设置了值。重新编译一下烧写到开发板,当我们按下相应的按键的时候,可以看到对应的LED灯亮了。


关键字:中断编程 引用地址:5.2440的按照中断编程

上一篇:6.6410和210的按键中断编程
下一篇:4.中断处理流程分析

推荐阅读最新更新时间:2026-03-21 23:39

s3c2440裸机-电阻触摸屏编程(3.触摸屏TSC的初始化和中断服务程序框架)
1. ADC中断产生流程 中断源: 这里是ADC和TSC共用一个中断源。 SRCPND表示哪个中断源产生了中断请求。 INTMODE:配置中断模式 配置中断屏蔽寄存器 中断挂起寄存器(用来显示当前优先级最高的、正在发生的中断, 需要清除对应位) 从SRCPND寄存器可以读到ADC和TSC复用的同一个中断源,那么如何区分呢? 可以从SUBSRCPND寄存器配置,如下: 当bit 9被置1时,表示TSC中断。那么我们需要打开subsrcmask寄存器 所以TSC中断的产生流程如下: 2. TSC编程实现   ①初始化TSC,ADCTSC寄存器   ②设定TSC处于“等待中断模式”
[单片机]
s3c<font color='red'>2440</font>裸机-电阻触摸屏<font color='red'>编程</font>(3.触摸屏TSC的初始化和<font color='red'>中断</font>服务程序框架)
STM32中断编程三步曲教你弄会中断设置以及中断优先级设置
中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本。   所以今天就来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工。问题是什么呢?项目中我用到了一个触摸键盘TTP229,结果在测试键盘时,不能够输入密码?最终,调试出bug就是由于中断优先级的影响。   本项目使用到的是STM32F030C8型号的MCU,我们可以从官方下载到的标准库文件中的启动汇编文件中,查看到本型号单片机的外部中断向量表。(如下图所示)   首先,我们了解一下NVIC是什么,在core_cm0.h文件中的标准库中的NVIC结构体。   其中,我们一般只用到ISER、ICER、IP这3个寄存器。ISER用于使能中断
[单片机]
STM32<font color='red'>中断</font><font color='red'>编程</font>三步曲教你弄会<font color='red'>中断</font>设置以及<font color='red'>中断</font>优先级设置
stm32 HAL库开发-EXTI外部中断编程
1 编写流程 如下图所示,作用于外部IO口的信号,实际上经过三个部分进入NVIC控制器:GPIO、EXTI控制器、NVIC控制器。 我们在程序配置中也需要对这三个部分依次设置。 2 外部中断实验 实验设计 Nuelco-F091RC开发板的PA10引脚配置上拉电阻并配置下降沿中断,PA10外接一按键用于接地触发中断。 开发板PB3引脚配置为推挽输出并外接LED灯泡,外部中断服务函数将PB3引脚电平翻转从而控制LED亮灭。 实验程序 宏定义LED和按键的引脚和端口 声明并定义两个部分的初始化函数 一定要记得开时钟,这是Stm32与AVR非常不一样的地方, KEY_EXTI_Init()函数中最后要配置NVIC
[单片机]
80C51单片机中断编程使用方法介绍
1、单片机中断: 找了一张 80C51 单片机的图如下: 其中,在 P3.2、P3.3 的位置,即 12 ,13 引脚处,标有 INT0 和 INT1,那两个引脚就是外部中断的输入。上面一个横杠代表低电平有效,给 P3.2、P3.3 赋值 0,就可以运行已经写好的中断服务程序。具体怎么用,还要熟悉一些中断寄存器的使用。 2、中断寄存器: (1)、IE (Interrupt Enable):中断允许控制寄存器 EA (IE.7):EA=0 时,所有中断禁止(即不允许中断) EA=1 时,各中断的产生由个别的允许位决定 ET2 (IE.5):定时器 2 溢出中断允许(8052 用,博主用的 STC89C54RD+ 也有) ES
[单片机]
80C51单片机<font color='red'>中断</font>的<font color='red'>编程</font>使用方法介绍
STM32入门编程总结4 (中断+串口)
系统异常中断与外部中断统称为中断,复位中断的优先级最高, NVIC(NestedVectored Interrupt Controller)嵌套向量中断控制器,调整各个中断的优先级,中断优先级 =抢占优先级(1-4bit)+子优先级(0、1)如果两个中断的抢占优先级与子优先级参数一致,则按照中断向量表里的顺序区分优先级。GPIO的中断,EXTI(External interrupt/event controller)外部中断/事件(event)控制器,外部中断为用户自定义中断内容(用户编写程序发生中断后要干啥事儿),外部事件为具体对应外设自动执行,EXTI 0-15总共16个,GPIO A-G当中的pin尾数与EXTI尾数对应
[单片机]
STM32入门<font color='red'>编程</font>总结4 (<font color='red'>中断</font>+串口)
C51编程19-中断篇(串行通讯3)
MCS-51单片机提供了4种串口的方式,但是我们只有方式1最常用(可变的10位串行通讯方式),下面就方式1的使用进行讲解。 在开始之前先明确一个概念,中断会产生中断标志位,而CPU检测到中断标志位后,如果没有其他更高的中断在执行,CPU会响应该中断,并进入中断服务函数。串行通讯属于中断方式的一种,它服从这个概念。此外串行通讯并不是需要进入串行通讯的时候,会产生中断标志位;而是发送或者接收成功后,会产生中断标志位。 通过中断向量,可以知道串行通讯只有一个中断号4,也就是说当进入无论是发送或者接收成功,都会触发中断服务函数,因此如果需要区分发送与接收需要在中断服务函数中实现区分,可以通过判断中断标志位(TI == 1或者RI
[单片机]
C51编程18-中断篇(串行通讯2)
MCS-51单片机内部有两个独立的接收与发送SBUF,接收SBUF不能发送,发送SBUF不能接收,它们共用一个地址(99H)。内部逻辑结构下图所示: 在串行内部逻辑结构中可以看到,串行通信除了与SBUF有关外,还与串行口控制寄存器SCON(地址为98H)、定时器T1有关,此外还有一个寄存器PCON(地址为87H),该寄存器只有一位与串行通讯有关。 PCON寄存器的功能 串行口控制寄存器SCON(地址为87H),复位初始值为0;寄存器不可以位寻址。 SCON寄存器的功能 串行口控制寄存器SCON(地址为98H),复位初始值为0;寄存器可以位寻址。 SM0与SM1的设置工作方式 工作方式0:8位的同步移位寄
[单片机]
C51<font color='red'>编程</font>18-<font color='red'>中断</font>篇(串行通讯2)
C51编程17-中断篇(串行通讯1)
在实际的工作中,通常不是一个CPU将所有的事情处理完。为了提高工作效率,通常都是多个CPU之间的合作完成某一项功能。 计算机与键盘之间的数据交换,键盘的所有案件并不是直接连接到计算机的CPU中,而是由键盘中CPU将键盘按键信息处理完后,通过USB-HID的通讯方式上传计算机的CPU。这样子的处理方式计算机(主控)CPU任务处理,更有利于设备更换(不至于键盘坏了,需要换一台计算机)。 计算机之间的基本数据通讯方式有并行通讯与串行通讯两种。 并行通讯:数据各位同时进行传输(发送或接收)的通信方式,数据有多少位,就需要多少根线。 串行通讯:数据的各位一位一位顺序传送的通讯方式,数据传送线少,相对于并行输送速率低。 按
[单片机]
C51<font color='red'>编程</font>17-<font color='red'>中断</font>篇(串行通讯1)
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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