资源简介
用ADS编译测试通过,外部中断按键测试程序,可以通过uboot下载至NAND里运行,直接下载到SDRAM无法运行(因为没有开启MMU)。
http://blog.csdn.net/forsakening/article/details/8998027
这里是我对S3C2440代码及中断的分析。
代码片段和文件信息
#include “2440addr.h“
/* 延时 */
void Delay1s(void)
{
int i=0;
for (;i<1000000;i++);
}
/* LED部分 */
#define Led1_On() {rGPBDAT &= (~(1 << 5));}
#define Led1_Off() {rGPBDAT |= (1 << 5);}
#define Led2_On() {rGPBDAT &= (~(1 << 6));}
#define Led2_Off() {rGPBDAT |= (1 << 6);}
#define Led3_On() {rGPBDAT &= (~(1 << 7));}
#define Led3_Off() {rGPBDAT |= (1 << 7);}
#define Led4_On() {rGPBDAT &= (~(1 << 8));}
#define Led4_Off() {rGPBDAT |= (1 << 8);}
void Led_Init(void)
{
rGPBCON &= ~((3 << 10) | (3 << 12) | (3 << 14) |(3 << 16));
rGPBCON |= ((1<<10) | (1<<12) | (1<<14) | (1<<16)) ;
rGPBUP &= ~((1 << 5) | (1 << 6) | (1 << 7) || (1 << 8) ) ;
rGPBDAT |= (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) ;
}
/* 外部中断:按键中断,控制LED灯的亮灭 */
/*
* 1.设置IO口为外中断模式
*/
#define KEY1 (2 << 2)
#define KEY2 (2 << 8)
#define KEY3 (2 << 4)
#define KEY4 (2 << 0)
void Key_Init(void)
{
rGPFCON &= ~((3 << 0) | (3 << 2) | (3 << 4) | (3 << 8)) ;
/* GPFCON: 00:input 01:output 10:EINT */
rGPFCON |= KEY1 | KEY2 | KEY3 | KEY4 ;
rGPFDAT |= (1 << 0) | (1 << 1) | (1 << 2 ) | (1 << 4) ;//将键盘对应的四个引脚置为高电平,完成初始化工作
}
/*
* 2.使能中断:打开INTMSK中断屏蔽
* INTMSK有单独位来屏蔽外部中断0-3。对于4-7用EINTMASK来区分
*/
void Irq_Init(void)
{
rINTMSK &= ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 4)) ;//使能外部中断0,1 ,2 4
rEINTMASK &= (~(1 << 4)) ;//使能外部中断4
}
/*
* SRCPND和INTPND的每一个位代表一个中断源,当有中断产生时,对应的位置会自动置1
* 清除此中断需要往对应位置写1
* 对于外部中断4-7,由于是由子中断控制,还需要向EINTPEND中对应位置写1
* 对于启动代码中所说的INTOFFSET寄存器,其用来标识INTPND的哪种类型中断发生了,
* 当SRCPND和INTPND对应的中断标志位清除后,INTOFFSET对应位会被自动清零
*/
void __irq Eint0_Isr(void)
{
Led1_On();Delay1s() ;Led1_Off() ;
rSRCPND |= 1 << 0 ;//清除这一位的话,会自动清除INTOFFSET这一位的;
rINTPND |= 1 << 0 ;
}
void __irq Eint1_Isr(void)
{
Led2_On();Delay1s() ;Led2_Off() ;
rSRCPND |= 1 << 1 ;//清除这一位的话,会自动清除INTOFFSET这一位的;
rINTPND |= 1 << 1 ;
}
void __irq Eint2_Isr(void)
{
Led3_On();Delay1s() ;Led3_Off() ;
rSRCPND |= 1 << 2 ;//清除这一位的话,会自动清除INTOFFSET这一位的;
rINTPND |= 1 << 2 ;
}
void __irq Eint4_7_Isr(void)
{
if(rEINTPEND & (1 << 4) ) //EINTPEND记载着具体是哪个外部中断发生了
{
Led4_On();Delay1s() ;Led4_Off() ;
rEINTPEND |= 1 << 4 ;
}
rSRCPND |= 1 << 4 ;
rINTPND |= 1 << 4 ;
}
/*
* 3.中断服务程序:a)中断向量表的安装
* b)中断处理,记得清除中断
*/
/*
* #define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x20))
* _ISR_STARTADDRESS是中断的入口地址
* 在启动代码中提到,若发生中断,(以IRQ为例)动作是
* 1)b HandlerIRQ 一级查找
* 2)HandlerIRQ HANDLER HandleIRQ,执行HandleIRQ对应的程序
* 3)根据INTOFFSET确定是哪个中断源,计算出偏移量,
* 在HandleEINT0的基础上偏移,执行中断程序,二级查找
* 4)HandleEINT0的地址和pISR_EINT0所在的地址实际上是一样的,代表的就是中断服务程序
* 不过HandleEINT0是一个地址,pISR_EINT0代表地址里存放的数值(实际上是真正服务程序的地址Eint0_Isr)
*/
#define _ISR_STARTADDRESS 0x33ffff00
void Isr_Init(void)
{
pISR_EINT0 = (unsigned int)Eint0_Isr ;
pISR_EINT1 = (unsigned int)Eint1_Isr ;
pISR_EINT2 = (unsigned int)Eint2_Isr ;
pISR_EINT4_7 = (unsigned int)Eint4_7_Isr ;/**/
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 197856 2013-05-31 15:29 EINT0_Test\EINT0_Test.mcp
文件 3450 2013-05-31 15:29 EINT0_Test\EINT0_Test_Data\CWSettingsWindows.stg
文件 18264 2013-05-31 15:26 EINT0_Test\EINT0_Test_Data\DebugRel\EINT0_Test.axf
文件 3156 2013-05-31 15:26 EINT0_Test\EINT0_Test_Data\DebugRel\EINT0_Test.bin
文件 54666 2013-05-31 15:29 EINT0_Test\EINT0_Test_Data\DebugRel\TargetDataWindows.tdt
文件 53120 2013-05-31 15:29 EINT0_Test\EINT0_Test_Data\Release\TargetDataWindows.tdt
文件 54494 2013-05-31 15:29 EINT0_Test\EINT0_Test_Data\Debug\TargetDataWindows.tdt
文件 28550 2011-05-19 15:18 EINT0_Test\startcode\2440addr.h
文件 3908 2011-05-19 15:18 EINT0_Test\startcode\2440addr.inc
文件 7209 2013-05-30 23:58 EINT0_Test\startcode\2440init.s
文件 516 2011-05-19 15:19 EINT0_Test\startcode\config.h
文件 444 2011-08-10 14:15 EINT0_Test\startcode\def.h
文件 548 2011-05-24 19:35 EINT0_Test\startcode\Memcfg.inc
文件 7818 2011-11-10 21:02 EINT0_Test\startcode\nand.c
文件 4204 2011-08-17 13:46 EINT0_Test\startcode\Nand.h
文件 327 2011-05-24 22:23 EINT0_Test\startcode\Option.inc
文件 3604 2013-05-31 15:25 EINT0_Test\main.c
目录 0 2013-05-31 15:22 EINT0_Test\EINT0_Test_Data\DebugRel\ob
目录 0 2013-05-31 15:09 EINT0_Test\EINT0_Test_Data\DebugRel
目录 0 2013-05-31 15:09 EINT0_Test\EINT0_Test_Data\Release
目录 0 2013-05-31 15:09 EINT0_Test\EINT0_Test_Data\Debug
目录 0 2013-05-31 15:09 EINT0_Test\EINT0_Test_Data
目录 0 2013-05-31 15:10 EINT0_Test\startcode
目录 0 2013-05-31 15:09 EINT0_Test
----------- --------- ---------- ----- ----
442134 24
相关资源
- stm32用外部中断测试脉冲个数,测量脉
- STM32F103C8T6外部中断.rar
- TQ2440 mp3 源程序
- 在Keil MDK 4上 将ucosii和ucgui移植MINI24
- 基于IAR的STM8L152的USART+ADC(双通道)带
- OK6410实现外部中断控制led与蜂鸣器
- DSP 外部中断
- 基于IAR的STM8L152的USART、ADC(双通道)
- 51单片机外部中断流水灯汇编语言
- CC2530 外部中断控制流水灯
- TQ2440从norflash nandflash sdram启动总结
- UCOSIII外部中断和串口中断管理
- F28027外部中断控制LED流水灯
- 实验5 外部中断实验.zip
- 基于TQ2440和DHT11的温湿度监控系统源码
- TQ2440摄像头模块原理图 OV9650原理图
- dsp2812外部中断控制实验程序
- TQ2440开发板中断处理裸机程序
- TQ2440的触摸屏应用与校正
- 用verilog语言写的CPU,支持外部中断与
- 天嵌TQ2440 USB驱动
- 51单片机通过外部中断检测霍尔感应器
- AT89X51单片机中断嵌套程序,定时器
- 51单片机流水灯实验
- STM32外部中断程序,简单好用稳定
- C51单片机实验 外部中断
评论
共有 条评论