背景知识:
2440中断控制器接收60个中断源。
中断被分为多种类别,此处为32类别,正好用32位。
图上可以很好的表示整个中断的流程。有些中断源对应一个中断类别,比如串口中断发送,接收最后都对应到串口中断。submask屏蔽子类别,未屏蔽的会引起srcpnd相应位置位,如果mask未屏蔽的话,就会紧接着判断优先级,最后导致intpnd置位,然后产生了IRQ,而FIQ不需要优先级判断,会直接产生,由intmod设置。
注意的是:进入ISR后,清除中断的顺序很重要,首先是srcpnd接着是intpnd,如果还需要清除eintpnd的话,要最先清除。
实验过程:
编译工具--MDK4.22
硬件图
首先需要配置GPF0/1/2/4的脚为EINT0/1/2/4。
由于用到了外部4-7中断,需要开启EINTMASK寄存器相应位。设置优先级寄存器,设置INTMSK寄存器。
在2440A.s中已经设置了I F位开启,可以接收中断了。
在中断初始化代码里,需要将中断函数的地址安装到中断向量表中。
程序如下:
MDK4.22的启动代码设置
配置了堆,栈,以及中断向量表的地址为0x33ffff20处。配置了B口和F口,B口试LED的灯显示,F口是连接按键的外部中断。按一个键会亮一个LED。
int.c代码
- #include "S3C2440.h"
- #include "int.h"
-
-
- void init_irq(void)
- {
-
- pHandleEINT0 = EINT0_Handle;
- pHandleEINT1 = EINT1_Handle;
- pHandleEINT2 = EINT2_Handle;
- pHandleEINT4_7 = EINT4_7_Handle;
-
-
-
- rEINTMASK &= (~(1<<4));
- rPRIORITY = (rPRIORITY & (~(0x01))) | (0x01<<7);
-
- rINTMSK &= (~(1<<0)) & (~(1<<1)) & (~(1<<2)) & (~(1<<4));
- }
-
- void __irq EINT0_Handle(void)
- {
- rSRCPND = 1<<0;
- rINTPND = 1<<0;
-
- rGPBDAT |= (0x0f<<5);
- rGPBDAT &= ~(1<<8);
- }
-
- void __irq EINT1_Handle(void)
- {
- rSRCPND = 1<<1;
- rINTPND = 1<<1;
-
- rGPBDAT |= (0x0f<<5);
- rGPBDAT &= ~(1<<5);
- }
-
- void __irq EINT2_Handle(void)
- {
- rSRCPND = 1<<2;
- rINTPND = 1<<2;
-
- rGPBDAT |= (0x0f<<5);
- rGPBDAT &= ~(1<<7);
- }
-
- void __irq EINT4_7_Handle(void)
- {
- rEINTPEND = (1<<4);
- rSRCPND = 1<<4;
- rINTPND = 1<<4;
-
- rGPBDAT |= (0x0f<<5);
- rGPBDAT &= ~(1<<6);
- }
主程序:
- #include "S3C2440.h"
- #include "int.h"
-
-
- int main(void)
- {
- rGPBDAT |= (0xf<<5);
-
- init_irq();
-
- while(1);
- }
scatter文件如下:
LR_ROM1 0x00000000 0x00001000 { ; load region size_region
ER_ROM1 0x00000000 0x000001000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_RAM1 0x30000000 0x40000000 { ; RW data
.ANY (+RW +ZI)
}
ISR 0x31000000{
int.o(*)
}
HEAP 0x30000800 {
S3C2440A.o(HEAP)
}
STACK 0x30000c00{
S3C2440A.o(STACK)
}
}
验证,可以按一个键亮一个键。
over
关键字:S3C2440 中断操作 MDK4.22
引用地址:
S3C2440之中断操作(MDK4.22)
推荐阅读最新更新时间:2024-03-16 14:56
LINUX中s3c2440总线频率、时钟的设置
很多硬件的正常运行需要有总线时钟的支持,比如LCD、I2C等设备。本文分析一下s3c2440的总线时钟,以及在linux中对s3c2440总线时钟频率的相关操作。首先分析硬件s3c2440的总线时钟。 1. s3c2440的FCLK HCLK PCLK: 时钟源首先来自外部晶振12MHz。对于必须运行在200MHz以上的ARM920t内核来说,这个频率实在太低了,不能直接使用,所以首先要通过s3c2440片上的pll硬件电路将12MHz的晶振时钟信号升频,而具体升到多少MHz是通过MPLL控制寄存器来控制的。比如MPLLCON赋值为 0x5c 12 | 2 4 | 1就可以将PLL电路的输出时钟设置为400MHz,也就是将
[单片机]
s3c2440裸机-内存控制器(三-1、norflash编程之NorFlash原理)
1.flash种类与特性: flash一般分为nand flash和nor flash,各自特性如下表: - Nor NAND XIP(片上执行) yes no 性能(擦除) 非常慢(5s,块太大) 快(3ms) 性能(写) 慢 快 性能(读) 快 快 可靠性 高 一般(容易出现位反转) 可擦除次数 10000 ~ 100000 100000 ~ 1000000 接口 与ram类似,可直接访问任意地址 I/O接口(无地址线,必须串行访问,命令、地址、数据共用8位IO) 易用性 容易 复杂 主要用途 常用于保存代码和关键数据 用于保存数据 价格 高 低 容量 小 大 常用文件系统类型 jffs yaff
[单片机]
S3C2440串口通信基本功能的代码(注释+学习)
功能:将通过串口接收到的内容再发送出去,在PC机上看到的现象就是在串口通信软件中输入什么就会实时地显示什么。 主文件:serial.c 1 //最常用的寄存器是ULCON、UCON、UBRDIV、UTRSTAT、UTXH、URXH这六个寄存器 2 #define ULCON0 (*(volatile unsigned *)0X50000000) //UART线控制寄存器 3 #define UCON0 (*(volatile unsigned *)0X50000004) //UART控制寄存器 4 #define UFCON0 (*(volatile unsigned *)0X5000
[单片机]
S3C2440 输入子系统学习笔记 第一节
接触S3C2440已经有一段时间了,可是总是没有去坚持学习,刚毕业的我深受到自身技能的缺乏和工作中的压力,决定痛改前非,坚持每天下班都去学习,在这里我不敢说自己能把2440学完,因为技术永无止境。但是我相信我能一直坚持下去。我是一个热爱思考,并且将思考的东西通过各种方法实现,我要做我思想的造物主。考虑到每个章节知识容量不一的问题,博客从今天开始不定时更新,前期会根据韦东山老师的视频教程目录来更新,如果有写得不好的地方请大家指点指点。 好了废话不多说,进入正题。 本博客的起点是韦东山老师的第2期的学习视频。 在第一期视频中,我们学到了简单的驱动结构,比如 LED驱动, 按键驱动等,但是这些驱动仅仅适合我们平时使用,没有
[单片机]
s3c2440头文件之2440slib.h
//=================================================================== // File Name : 2440lib.h // Function : S3C2440 // Date : February 26, 2002 // Version : 0.0 // History // 0.0 :Feb.20.2002:SOP : Programming start // 0.01:Mar.29.2002:purnnamu: For Sleep_wake_up, the START... label is added //==================
[单片机]
1.2__S3C2440时钟简介
S3C2440的时钟和电源管理模块由三个部分构成:时钟控制,USB控制和电源控制。 有两个锁相环,一个用来提供FCLK,HCLK和PCLK,另一个则用于USB时钟。其中,FCLK的最大频率达到400MHz,HCLK的最大频率达到136MHz,PCLK的最大频率达到68MHz。 这些时钟为CPU和外设的正常运行提供时钟信号,其中CPU使用的是FCLK,外设使用的是PCLK,还有一部分使用高速总线HCLK。 要想程序按计划运行,时钟的选择和设置至关重要,下图为S3C2440的时钟发生器块图。 首先,S3C2440的时钟源可以选择外部晶振或外部时钟信号,一般情况下我们都使用的是外部晶振。时钟源的选择是通过设置OM 来进行
[单片机]
S3C2440的NAND Flash控制器
首先还是启动方式NAND Flash的过程,因为NAND Flash是不支持程序在NAND内部运行的所以要把NAND搬到内存中运行,由于S3C2440内部的SRAM只有4K,当程序远大于4K时,这种方法是行不通的,于是我们可以让NAND中4K之后的程序搬到SDRAM中来运行 正如数据手册上所说,NOR的价格较NAND来说比较昂贵,再加上NOR的容量远比NAND小的多,再比如NOR一页的字节数也比NAND大的很多,而要在某个地址写入数据,必须先把地址所在的页擦除,所以更多的时候NAND用来存储数据,NOR用来存储程序。 如上图模型,当程序的容量大于4K的时候,NAND的前4K的程序将会被硬件自动引导到2440的S
[单片机]
嵌入式中基于Qt/Embedded的键盘接口设计
引言
随着嵌入式系统的不断发展,特别是嵌入式处理器运算能力的不断增强,嵌入式系统被广泛应用于信息家电、移动通信、手持信息设备以及工业控制等众多领域。与此同时,用户对于嵌入式系统图形用户界面的需求也不断提高。嵌入式Linux作为一种流行的嵌入式系统平台,它所具备的稳定、高效、易裁剪、易移植、硬件支持广泛等优点,结合其源码开放的特征,使得Linux在嵌入式操作系统中的地位日益重要。Qt/Embedded是一个完整的自包含GUI和基于 Linux的嵌入式平台开发工具,因其面向对象、跨平台、界面设计更美观和友好而得到广泛的应用。Qt/Embedded具有客户/服务器模型,直接向帧缓冲写入数据,摒弃了X窗口系统,节省了内存。同时
[嵌入式]