按键中断---那些年我们一起玩mini2440(arm9)裸机

ARM中断控制系统

按键驱动程序设计

一.Arm中断控制系统

1.查询方式

程序不断地查询设备的状态,并做出相应的反应。该方式实现比较简单,常用在比较单一的系统中,比如:一个温控系统中可以实用查询的方式不断检测温度变化。

特点:实现简单;但CPU利用率很低,不适合多任务的系统。

2.中断方式

当事件发生时,硬件会设置某个寄存器;CPU在每执行完一个指令时,查看这个寄存器,如果所关注的事件发生了,则中断当前程序,跳转到一个固定的地址处理这个事件,处理完后返回到被中断的程序中继续运行。

特点:实现相对复杂,但效率较高,是常用的方法。

中断处理流程:

(1)中断控制器汇集各类外设发出的中断信号,然后通知CPU;

(2)CPU保存当前程序的运行环境,然后调用中断服务程序(ISR)来处理中断;

(3)在ISR中通过读取外设的相关寄存器来识别中断的类型,并进行相应的处理。

(4)清除中断:通过读写在相关中断控制寄存器和外设相关寄存器来实现;

(5)恢复被中断程序的执行环境,继续执行被中断的程序。

简化版:

1.汇集中断信号,通知CPU;

2.CPU保存当前运行环境,调用中断服务程序ISR

3.ISR读取寄存器识别中断类型

4.清中断

5.恢复中断程序的执行环境;

速记版:会(汇集)C(CPU)I(IRS)请(清中断)回复(恢复);

S3c2440支持60个中断源,含子中断源

SUBSRCPND(用于标明子中断源有没有发生中断)【发生中断被置1,清除子中断写入1】

SUBSRCPND寄存器用来表明子中断(如:INT_RXD0)是否发生。S3C2440有15个子中断,SUBSRCPND中每一位对应一个子中断,当这些子中断发生时,相应的位置被置1.清除子中断只需向SUBSRCPND寄存器中相应位写入1.

INTSUBMSK(屏蔽SUBSRCPND的中断,置1时屏蔽子中断)

INTSUBMSK寄存器用来屏蔽SUBSRCPND寄存器所标的中断。INTSUBMSK

寄存器中某位被设为1时,相应的子中断被屏蔽。设为0时,表示子中断被允许。

 

SRCPND(用于标明中断源有没有发生中断)【发生中断被置1,清除(子)中断写入1】

SRCPND中某一位用来标明一个(或一类)中断是否已经发生。例如:SRCPND

寄存器中的子中断INT_RXD0发生了,且没有被INTSUBMSK屏蔽,则SRCPND的INT_UART0位被置1. SRCPND寄存器的清除与SUBSRCPND寄存器相似,若想清除某一位,往此位写入1.

INTMSK(被置1时,中断屏蔽; 置0时,中断允许)

INTMSK寄存器用来屏蔽SRCPND所表示的中断。INTMSK某位被置为1时,对应的中断被屏蔽;设置为0时,相应中断被允许。

INTMSK只能屏蔽设为IRQ的中断,不能屏蔽设为FIQ的中断。

INTMODE(置1时,FIQ模式;  置0时,IRQ模式

当INTMODE寄存器中某位被设置为1时,它所对应的中断源会被设置为FIQ模式,即此时中断发生时,      CPU将进入快速中断模式,这通常用来处理特别紧急的中断。当该位被置为0时,表示为IRQ模式。

FIQ & IRQ

(1)   IRQ模式下,中断处理程序需要自己保存R8到R12这几个寄存器,退出中断处理时需要自己恢复这几个寄存器,而FIQ模式由于这几个寄存器都有back寄存器(fiq_r8….),模式切换时CPU自动保存这些值到back寄存器,退出FIQ模式时自动恢复,所以这个过程FIQ比IRQ快。

(2)   FIQ比IRQ有高的优先级,优先处理FIQ。

pasting

  1. #define    GLOBAL_CLK             1
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "def.h"
  5. #include "option.h"
  6. #include "2440addr.h"
  7. #include "2440lib.h"
  8. #include "2440slib.h"
  9. #include "mmu.h"
  10. #include "profile.h"
  11. #include "memtest.h"
  12. void key_init(void);
  13. static void __irq key_handler(void);
  14. void beep_init(void);
  15. void beep_run(void);
  16. /*************************************************
  17. Description     : 延时函数
  18. **************************************************/
  19. void delay(int times)
  20. {
  21. int i,j;
  22. for(i=0;i<times;i++)
  23. for(j=0;j<400;j++);
  24. }
  25. /*************************************************
  26. Description     : 主功能函数
  27. **************************************************/
  28. void Main(void)
  29. {
  30. beep_init();//设置对应端口为输出
  31. MMU_Init(); //
  32. key_init();
  33. while(1);
  34. }
  35. /*************************************************
  36. Description     : 按键K1的初始化函数
  37. **************************************************/
  38. void key_init(void)
  39. {
  40. rGPGCON &= ~(0x3<<0);     /*set eint8 as interrupt*/
  41. rGPGCON |=  (0x2<<0);
  42. rEXTINT1 &= ~(0xf<<0);   /*set eint8 with low level*外部中断控制寄存器*/
  43. rEINTPEND |= (1<<8);  //写1清EINT8中断   /*外部中断待定寄存器*/
  44. rEINTMASK &= ~(1<<8); //使能中断不屏蔽  /*外部中断屏蔽寄存器*/
  45. /*设置ISR*/
  46. pISR_EINT8_23=(U32)key_handler;  //按键按下就会执行相应的中断函数
  47. EnableIrq(BIT_EINT8_23); //8-23共用一个中断号  /使能相应中断
  48. }
  49. /*************************************************
  50. Description     : 按键K1的中断服务子程序
  51. **************************************************/
  52. static void __irq key_handler(void)
  53. {
  54. /*判断是否是按键K1产生的中断*/
  55. if(rINTPND==BIT_EINT8_23) //rINTPND判断中断是否被响应,1响应;0不响应
  56. {
  57. ClearPending(BIT_EINT8_23); /进入中断处理函数第一件事就是清中断,如果不清中断无法产生下次中断
  58. if(rEINTPEND&(1<<8))//外部中断相应位来判断对应寄存器是否发生中断,EINT8是否发生中断
  59. {
  60. rEINTPEND |= 1<< 8;//清中断EINT8
  61. beep_run();
  62. }
  63. }
  64. }
  65. /*************************************************
  66. Description     : 初始化蜂鸣器
  67. **************************************************/
  68. void beep_init(void)//设置IO为输出
  69. {
  70. rGPBCON &= ~(0x3<<0);
  71. rGPBCON |=  (0x1<<0);
  72. }
  73. /*************************************************
  74. Description     : 运行蜂鸣器
  75. **************************************************/
  76. void beep_run(void)
  77. {
  78. rGPBDAT |= (0x1<<0);
  79. delay(50);
  80. rGPBDAT &= (0x0<<0);
  81. delay(50);
  82. }
时间: 2024-11-10 11:24:38

按键中断---那些年我们一起玩mini2440(arm9)裸机的相关文章

定时器中断---那些年我们一起玩mini2440(arm9)裸机

(时钟体系) 时钟概念: ★时钟脉冲:一个按一定电压幅度,一定时间间隔连续发出的脉冲信号: ★时钟频率:在单位时间(如:1秒)内产生的时钟秒冲数: 时钟的作用: 时钟信号是时序逻辑的基础,它用于决定逻辑单元中的状态何时更新.数字芯片中众多的晶体管都工作在开关状态,它们的导通和关断动作无不是按照时钟信号的节奏进行的. 时钟的作用(简洁版) 系统中的设备需要有个时间来和它进行同步—即靠时钟! 时钟的产生-晶振 晶振:晶体振荡器,是用石英晶体精密切割做成. 优点:振荡频率非常稳定:振荡频率很准确:结构

uart串口发送---那些年我们一起玩mini2440(arm9)裸机

Uart工作原理: 数据通信方式为:并行通信与串行通信两种: §并行通信:利用多条数据线将数据的各位同时传送. 它的特点是:传输速度快,是用于短距离通信: §串行通信:利用一条数据线将数据一位位地顺序传送. 特点是通信线路简单,利用简单的线缆就实现通信,低成本,是用于远距离通信.   异步通信: ª异步通信:以一个字符为传输单位,通过两个字符间的时间间隔是不固定的,然而同一字符中的两个相邻位之间的时间间隔是固定的. ª通信协议:是指通信双方约定的一些规则.在异步通讯时,对数据格式有如下约定:规定

AD电阻转换---那些年我们一起玩mini2440(arm9)裸机

ADC驱动程序设计 ADC:模/数转换器. 一种将模拟信号转换成数字信号的装置: DAC:数/模转换器. 一种将数字信号转换成模拟信号的装置. 模拟信号转换为数值信号的步骤: 1.     取值: 2.     量化: 3.     编码: S3C2440ADC S3C2440芯片内部共有8路A/D转换通道AIN0~AIN7,但是转换器只有一个. 转换精度为10位,故转换后的值最小时会接近0,最大时会接近1024. 最大的转换率在2.5MHZ转换时钟下能达到500KSPS(每秒采样5000千次)

ZYNQ随笔——PL端按键中断之裸机设计

1. ZYNQ中断简述ZYNQ中断类型:普通中断请求(IRQ, Interrupt Request)和快速中断请求(FIQ, Fast Interrupt Request).ZYNQ中断源:软件中断(SGI, Software Generated Interrupt).CPU私有设备中断(PPI, Private Peripheral Interrupt)和共享设备中断(SPI, Shared Peripheral Interrupt).而PL端的按键中断属于共享设备中断.2. 硬件平台搭建在B

nios II--实验4——按键中断硬件部分

按键中断 硬件开发 新建原理图 1.打开Quartus II 11.0,新建一个工程,File -> New Project Wizard-,忽略Introduction,之间单击?Next>?进入下一步.分别设置工程工作目录.工程名称.这里需要注意的是工程工作目录中请使用英文,不要含有空格等,否则在后面使用Nios II IDE的时候会出现问题.设置好后如图1所示.然后进行下一步.这里工程命名为lab3_bnt 2.添加已经存在的文件,这里没有需要添加的文件,直接单击?Next>?进入

2、CC2541芯片中级教程-OSAL操作系统(进一步了解-OLED &amp;&amp; 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~

本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 中级教程-OSAL操作系统(OSAL系统解基本套路) 中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~ 中级教程-OSAL操作系统(ADC-光敏电阻) OSAL操作系统-实验16 串口波特率扩展 OSAL操作系统-实验1

STM32学习之路-按键中断测试(外部中断)

终于有时间再来学习STM32了~ 这几天都在忙着该死的考试.直接进入正题 开发板:奋斗V5 这个按键中断测试的要求是:按键2(K2)按下,LED2(V7)亮, 再一次按下就灭,循环.. 好,先看看按键和LED的原理图 好吧~ 虽然图截得不是很好看,但是能看到K2接的是PC2, LED2接的是PD6 ok,剩下的就是配置工作了.. 先来理一理思路: (1)初始化系统时钟 (2)初始化外部时钟(你所用到的东西) (3)配置LED (4)配置中断优先级 (5)配置外部中断线 (6)中断处理函数 恩,差

6.6410和210的按键中断编程

6.6410和210的按键中断编程 首先是打开6410底板原理图: 可以看到OK6410有六个按键: 可以看到OK6410的六个按键对应的引脚是KEYINT1.KEYINT2.KEYINT3.KEYINT4.KEYINT5和KEYINT6.接着在核心板的原理图里搜索这个词: 可以看到按键中断与GPN系列寄存器的引脚是互用的,接着就是在芯片手册里查看有关GPN系列寄存器的信息,重点是关注GPN控制寄存器:GPNCON: 这里我们使用到的按键对应的中断,需要配置成中断的方式,对应的GPN位设置为10

第12章 GPIO输入-按键检测—零死角玩转STM32-F429系列

第12章 ????GPIO输入-按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege ? 本章参考资料:<STM32F4xx参考手册>.库帮助文档<stm32f4xx_dsp_stdperiph_lib_um.chm>. 按键检测使用到GPIO外设的基本输入功能,本章中不再赘述GPIO外设的概念,如您忘记了,可重读前面"GPIO框图剖析"小