下面的程序讲解是基于FL2440开发板的程序讲解,有不对的地方希望大家能够指教
中断控制程序编写步骤
主程序
1.先清除中断源挂起寄存器( SRCPND SRCPND)和中断挂起寄存器( INTPND),可用 rSRCPND= rSRCPND 和rINTPND=rINTPND =来完成;
2.设中断模式,这里使用通用中断,rINTMOD=0x00000000因上电或复位时rINTMOD是清 0的,这步也可以不做。
3.I/O 口初始化,有些中断源要通过 I/O 口向 CPU 申请中断,如外部中断 0(EXTINT0通过 )F口的 GPF0 、外部中断11(EXTINT11)通过G口的 GPG3 向CPU 申请中断,此时两个口的控制寄存器 GPFCON 和GPGCON 的要设置成:GPFCON[1:0]=1,0;GPGCON[7:6]=1,0。
4设中断服务函数地址, S3C2410 在2410addr.h 中定义了 40个宏,设置了系统支持的中断服务函数的指针,设中断服务函数地址就是把我们编写的中断服务函数的地址(就是中断服务函数的名字)赋予相应的函数指针。每个中断源的中断服务函数指针名是固定的:pISR+中断源。
5.设中断触发方式,触发方式有 5种,有上升沿、下降沿、双沿、低电平、高电平触发方式,外部中断触发方式在外部中断控制寄存器 (EXTINTn)中设定。如 EINT0 触发方式在 EXTINT0[2:0] 中设定,[2:0]=000 低电平、 001 高电平、 01X 下降沿、 10X 上升沿、 11X 双沿触发,详见:http://blog.sina.com.cn/s/blog_6c73c98d0100t3l6.html
6取消总中断屏蔽和子中断屏蔽,等待中断。例如通过 rEINTMASK rEINTMASK&=~(1<<11);
rINTMASK&=~(BIT_EINT0|BIT_EINT8_23);来实现。
中断服务程序
1.在中断服务程序中,先屏蔽中断,防止其他中断产生干扰我们中断服务程序的执行;
2.执行中断服务程序;
3.清中断源挂起寄存器( SRCPND)和中断挂起寄存器(INTPND);
4.取消总中断屏蔽和子中断屏蔽,等待新中断产生;
5.中断返回
下面是具体的程序应用:
#include "2440addr.h" //头文件,包含宏定义及清除挂起寄存器的ClearPending()函数
static void __irq Key_ISR();//中断函数声明
void delay(int x)//延时函数
{
while(x)
{
int k,j;
for(k=0xff;k>0;k--)
for(j=0xff;j>0;j--);
x--;
}
}
void ledMain(void)
{
rGPBCON = 0x1dd7fc; // GPB5,GPB6,GPB8,GPB10设置为输出,连接了4个LED
rGPBDAT|=0x560;//4个LED全灭
rGPFCON &=~((3<<0)|(3<<4)|(3<<6)|(3<<8)) ;
rGPFCON |= ((2<<0)|(2<<4)|(2<<6)|(2<<8)) ;//GPF0,GPF2,GPF3,GPF4工作在第二功能状态,即中断
//rEXTINT0=0x0;
rEINTPEND=(1<<4); //清外部中断挂起寄存器,清的是外部中断4
ClearPending(BIT_EINT0|BIT_EINT2|BIT_EINT3|BIT_EINT4_7);//清外部中断0,2,3,4
pISR_EINT0= pISR_EINT2 =pISR_EINT3 = pISR_EINT4_7=(int)Key_ISR;//设中断服务函数地址
EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT3|BIT_EINT4_7);//使能中断,即使INTMSK相应位为0
rEINTMASK=~(1<<4); //使能外部中断4
while(1);//等待中断发生
}
static void __irq Key_ISR()//中断服务函数,__irq用来声明通用中断函数
{
char key;//用来标识是哪一个按键按下
unsigned int r;
rINTMSK=0xffffffff;//这是屏蔽所有中断
if(rINTPND==BIT_EINT0) { //因为4个中断用的是同一个中断服务函数,所以判断是哪一个中断发生
ClearPending(BIT_EINT0); //并清除挂起寄存器,获得键值
key=1;
}
else if(rINTPND==BIT_EINT2) {
ClearPending(BIT_EINT2);
key=2;
}
else if(rINTPND==BIT_EINT3) {
ClearPending(BIT_EINT3);
key=3;
}
else if(rINTPND==BIT_EINT4_7){
rEINTPEND=(1<<4);
ClearPending(BIT_EINT4_7);
key=4;
}
switch(key){ //根据键值控制4个LED亮灭变化
case 1:
rGPBDAT^=(1<<5);
break;
case 2:
rGPBDAT^=(1<<6);
break;
case 3:
rGPBDAT^=(1<<8);
break;
case 4:
rGPBDAT^=(1<<10);
break;
}
EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT3|BIT_EINT4_7);//再打开中断
}
下面在说一下用到的ClearPending()
该函数在头文件2440addr.h中:
__inline void ClearPending(int bit)//输入参数是相应位为1的值
{
register i;//定义一个寄存器变量
rSRCPND=bit;//向相应位置写1清除源挂起寄存器
rINTPND = bit;//向相应位置写1清除源挂起寄存器
i = rINTPND;//没有该语句也能正常运行,可能是保证寄存器能清除的
}
关于中断暂时就想到这些,就先写这些吧
关键字:S3C2440 中断系统
引用地址:
一 ARM9(S3C2440)的中断系统——程序实例讲解
推荐阅读最新更新时间:2024-03-16 14:33
基于S3C2440处理器SPI移植全过程
环境 硬件:S3C2440(ARM920T) 嵌入式操作系统:Linux2.6.24内核 文件系统:Yaffs2文件系统 服务器:SuSe10.0 Linux服务器 第一步:内核配置 需要在内核中选择以上几个选项: 很多网友发邮件说Linux2.6.24内核在SPI选项上未发现有Samsung S3C2440 series SPI 或 Samsung S3C24XX series SPI 和User mode SPI device driver support这两个选项。 其实在Linux2.6.24内核里已经兼容了对SPI的操作。只是在Linux2.6.24/drivers/spi/Kconfig中未能选中此选项
[单片机]
S3C2440的SDRAM驱动
SDRAM(Synchronous Dynamic Random Access Memory,同步动态随机存储器)也就是通常所说的内存。内存的工作原理、控制时序、及相关控制器的配置方法一直是嵌入式系统学习、开发过程中的一个难点。我们从其硬件的角度来分析其原理,然后再引出SDRAM的驱动编写过程。 内存是代码的执行空间,以PC机为例,程序是以文件的形式保存在硬盘里面的,程序在运行之前先由操作系统装载入内存中,由于内存是RAM(随机访问存储器),可以通过地址去定位一个字节的数据,CPU在执行程序时将PC的值设置为程序在内存中的开始地址, CPU会依次的从内存里取址,译码,执行,在内存没有被初始化之前,内存好比是未建好的房子,是不能读
[单片机]
S3C2440的LCD编程
S3C2440的LCD编程 1. LCD工作的硬件需求: 要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以 COF/COG的 形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S3C2410/2440等。通 过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。 2. S3C2440内部LCD控制器结构图: 我们根据数据手册来描述一下这个集成在S3C2440内部的LCD控制器: a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VID
[单片机]
网上S3C2440驱动TFT屏资料
网上资料 TFT屏 -支持单色、4级灰度、256色的调色板显示模式 -支持64K和16M色非调色板显示模式 -支持分辩率为640*480,320*240及其它多种规格的LCD 对于控制TFT屏来说,除了要给它送视频资料(VD )以外,还有以下一些信号是必不可少的,分别是: VSYNC(VFRAME) :帧同步信号 HSYNC(VLINE) :行同步信号 VCLK :像数时钟信号 VDEN(VM) :数据有效标志信号 一般的TFT屏工作时序 外部引脚信号: VSYNC: 垂直同步信号,表示扫描1帧的开始。 HSYNC: 水平同步信号,表示扫描1行的开始。 VDEN:数据使能信号。 VD : LCD像素数据输出端口。 VCLK:像素
[单片机]
基于ARM9的嵌入式3G无线视频监控系统设计
国内外市场上主要推出的是数字控制的模拟视频监控和数字视频监控两类产品。前者的技术发展已经非常成熟,产品性能稳定, 在实际工程中得到了广泛应用。 后者是新近崛起的以计算机技术及图像视频压缩技术为核心的新型视频监控系统, 该系统在解决模拟视频监控系统的部分弊端的基础上迅速崛起。在互联网的普遍推广和网络带宽逐渐提高的背景下,视频监控技术飞速发展, 出现了集多媒体技术、网络通信技术、嵌入式技术于一体的嵌入式网络视频监控系统。 目前国内嵌入式视频监控系统的研究有了很大的发展, 但是国内对嵌入式无线视频监控系统的研究还比较少。本文介绍了自主开发的基于ARM 的嵌入式无线视频采集系统设计方案。该方案采用S3C2410 嵌入式处理器和ARML
[单片机]
51单片机学习笔记【四】——定时器和中断系统
一.定时器 1.基础介绍 (1).时钟周期 时钟周期T是单片机时序中的最小单位,具体计算的方法就是时钟源分之一。 (2).机器周期 单片机完成一个操作的最短时间,51单片机的一个机器周期是12个时钟周期。 (3).定时器应用 定时器是用来计时的,内部有一个寄存器,开始计时后,寄存器的值每经过一个机器周期就会自动加一,可以把机器周期理解为定时器的计数周期。16位的定时器,加到65535,再加1就算溢出,溢出后值变为0。 2.定时器的寄存器 标准51单片机内部有T0和T1两个定时器,TH0/TH1用于T0,TH1/TH0用于T1.复位值都为0x00. 名称 描述 SFR地址 TH0 定时器0高子节 0x8C T
[单片机]
【s3c2440】第三课:代码重定位
什么是重定位 简单来说就是把程序从内存的一个位置复制到另一个位置。 重定位的重要性 若s3c2440使用Nand Flash启动,则CPU会将Nand Flash的前4k拷贝到s3c2440 soc内部的SRAM。如果程序没有重定位代码,则只能运行Nand flash前4k的程序。 若s3c2440使用Nor Flash启动,则CPU无法修改Nor Flash内存中的数据。如果程序没有重定位代码,则会因为无法修改全局变量、静态变量的值导致程序运行出错。 链接脚本 链接脚本的格式如下: SECTIONS { sectname start BLICK(align) (NOLOAD) : AT( ldadr ) {
[单片机]
s3C2440 Memory controller
硬件设计篇 首先是BANK0 的选择, 如果是把BANK0 选择连接NAND Flash,需要引脚OM1 和OM0的状态 如果是都设置成0 是NAND FLASH 模式。。 NANDFlash 模式会自动的 NANDFLASH前4MB的内容拷贝到内存中来。 其次是S3C2440 的SDRAM的引脚如下: nSRAS: SDRAM行选择引脚 nSCAS: SDRAM 列选择引脚 nSCS: 片选信号 DQM : 掩码,就是为了屏蔽不需要的位, 比如一个连接了32位的芯片需要写入一个8bit的数据,那么其他的的位就会被掩码屏蔽 SCLK:时钟 SCKE: 时钟使能 nBE :DATA mask。 因为每次SDRAM只能从内核
[单片机]