打印

一 ARM9(S3C2440)的中断系统——程序实例讲解

[复制链接]
6489|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mizhongqin|  楼主 | 2011-9-13 00:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面的程序讲解是基于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;//没有该语句也能正常运行,可能是保证寄存器能清除的
}
关于中断暂时就想到这些,就先写这些吧

相关帖子

沙发
ADaiPlay| | 2011-9-13 12:28 | 只看该作者
这个还是放在自己博客里面比较合适吧,在这里好像有点那啥。。。
楼下怎么认为?

使用特权

评论回复
板凳
yinguangwei| | 2011-9-13 18:15 | 只看该作者
顶一个~~

使用特权

评论回复
地板
yinguangwei| | 2011-9-13 18:15 | 只看该作者
顶一个~~

使用特权

评论回复
5
randyhsd| | 2011-11-10 22:22 | 只看该作者
这个是 ADS 的吗 keil 的 怎么搞?
求指导

使用特权

评论回复
6
randyhsd| | 2011-11-10 22:22 | 只看该作者
这个是 ADS 的吗 keil 的 怎么搞?
求指导

使用特权

评论回复
7
randyhsd| | 2011-11-10 22:23 | 只看该作者
这个是 ADS 的吗 keil 的 怎么搞?
求指导

使用特权

评论回复
8
randyhsd| | 2011-11-10 22:29 | 只看该作者
这个是 ADS 的吗 keil 的 怎么搞?
求指导

使用特权

评论回复
9
jiangyuelong| | 2011-12-13 16:56 | 只看该作者
需要嵌入式arm和linux入门资料,项目资料,linux驱动资料的可以加我QQ哦!!愿意和你分享,希望大家多多支持
QQ:1653687969

        项目分享内容:

一.           嵌入式无线网络智能化家电产品试验系统项目

二.           嵌入式μ/COS-II下的智能温度测控仪

三            基于ARM Linux环境下嵌入式网络图像视频采集环境监控系统

四             舞台灯具可靠性试验系统嵌入式测控节点

五             网络视频监控项目

六             mini2440+TD035STED4实现类似手写板功能

七             mini2440制作的无线视频小车

八          STC12C5A60S2 + VS1003B模块 + SD卡模块把MP3做出来啦

九.         伟纳杯比赛-一等奖作品

十          DIY简易数码照相机(有图有源码)

十一.       医学图像系统(只支持隐式大部分的CT,DR,CR)

十二      STM32F103VBT6超屏解决OV7660高速数据同步读取

十三.     DIY的wav播放器(有图有源码)

十四.    DIY的STM32驱动OV7660摄像头成功

十五.    AVR作实用的电源设备作品, (有图有源码)

十六.   基于ARM LINUX的网络监控系统 (有图有源码)

十七.   基于KMZ52磁场传感器电子指南针设计与制作

十八.   愚作——基于ARM和CPLD的图像系统(完全开源)

十九.   基于ARM7的手持式导航仪(附件源程序和GPS手册)

二十.   ARM(S3C2440)上运行的 MP3
二十一


        共享国嵌高级项目:

       项目1(H.264远程视频监控)
       项目2(移动图像监控系统)
       项目3(安全文件传输系统)

QQ:1653687969联系

     linux驱动分享内容:

    一    18b20驱动+温度显示linux

    二    mini6410 红外 驱动程序+测试程序 (源码)

    三    通过Web远程浏览并控制Mini6410上的摄像头

    四    驱动红外接收头,接收遥控器信号

    五    mini2440上驱动步进电机实现控制

    六    mini2440上驱动2.4g无线射频模块发送数据,无线通讯
    红外接收头+遥控器+步进电机

    七    mini2440上实现iic驱动

    等等······

    QQ:1653687969联系

       QT分享内容:

二  ARM Linux 下基于Qt的免驱摄像头通用预览程序

三  自己写的一个秒表和世界时间表(QT4 开发模式的入门例子)

四  QT4写的,可用于嵌入式的文件管理器

五  第一个QT程序。空气物性的计算

六   一个完整的 音乐播放器源代码

七   一个开源的Qt4播放器界面程序,带电视输出功能

八    Qt编写串口通信程序
九  基于Mplayer的多媒体应用开发指南(开源的广告*程序)
医疗药费管理程序(已更新)
ARM Linux 下基于Qt的免驱摄像头通用预览程序
ftp客户端
QT GPS 定位系统(更新源代码)

初初级的一个小东西, 记账用, 功能超级简单
大数据量绘图 demo
红旗杯比赛时写的程序
解决clientserver聊天程序聊天窗口退出时出现错误报告
基于Qt phonon 实现的跨平台播放器,支持KTV歌词显示
BPMS美容院商品和顾客资料管理程序v0.0.2
基于qt4 和mplayer的开发 ;实现视频音频播放功能


QQ:1653687969联系



需要嵌入式arm和linux入门资料,项目资料,QT项目界面资料,ucosii项目和ucGUI资料,linux驱动资料加我QQ!!希望我的一些项目经验和资料可以带你进入嵌入式之门,在浩瀚的linux世界里找到属于你自己的舞台!!

使用特权

评论回复
10
embedded_wty| | 2012-6-27 16:48 | 只看该作者
一个上道的人  对我有帮助  顶哈!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

67

帖子

1

粉丝