查看:7086|回复:1
实验目的:掌握S3C2440微控制器I/O和外部中断的使用方法
实验内容:
用外部中断的方式,实现:
(1)按下K11,LED1闪烁2次;
(2)按下K12,LED2闪烁2次;
(3)按下K13,LED3闪烁2次;
(4)按下K14,LED4闪烁2次;
(5)按下K15,LED1与LED3一起闪烁2次;
(6)按下K16,LED2与LED4一起闪烁2次;
要求使用下降沿触发外部中断。
复制代码
全部资料51hei下载地址:
外部中断实验.zip(127.18 KB, 下载次数: 11)
实验内容:
用外部中断的方式,实现:
(1)按下K11,LED1闪烁2次;
(2)按下K12,LED2闪烁2次;
(3)按下K13,LED3闪烁2次;
(4)按下K14,LED4闪烁2次;
(5)按下K15,LED1与LED3一起闪烁2次;
(6)按下K16,LED2与LED4一起闪烁2次;
要求使用下降沿触发外部中断。
- #include "2440addr.h"
- #include "2440lib.h"
- #define rGPBCON (*(volatile unsigned *)0x56000010) //Port B control
- #define rGPBDAT (*(volatile unsigned *)0x56000014) //Port B data
- #define rGPBUP (*(volatile unsigned *)0x56000018) //Pull-up control B
- U16 i,a;
- int delay(int times);
- void INIT_interrupt(void);
- static void __irq Eint1_ISR(void)
- {
- U8 j = 0;
- for( j=0;i<2;i++){
-
rGPBDAT=(rGPBDAT&~(0xf<<5))|0x1c0; //LED1亮 1110
- delay(50000000);
-
rGPBDAT=(rGPBDAT&~(0xf<<5))|0x1E0; //全灭 1111
- delay(50000000);
-
rSRCPND=(rSRCPND&~(0x1<<1))|(0x1<<1);
-
rINTPND=(rINTPND&~(0x1<<1))|(0x1<<1);
- }
- }
- static void __irq Eint2_ISR(void)
- {
- U8 j = 0;
- for(j=0;i<2;i++){
-
rGPBDAT=(rGPBDAT&~(0xf<<5))|0x1a0; //LED2亮 1101
- delay(50000000);
-
rGPBDAT=(rGPBDAT&~(0xf<<5))|0x1E0; //全灭 1111
- delay(50000000);
-
rSRCPND=(rSRCPND&~(0x1<<2))|(0x1<<2);
-
rINTPND=(rINTPND&~(0x1<<2))|(0x1<<2 );
- }
- }
- static void __irq Eint3_ISR(void)
- {
- U8 j = 0;
- for(j=0;i<2;i++){
-
rGPBDAT= (rGPBDAT&~(0xf<<5))|0x160; //LED3亮 1011
- delay(50000000);
-
rGPBDAT=(rGPBDAT&~(0xf<<5))|0x1E0; //全灭 1111
- delay(50000000);
-
rSRCPND=(rSRCPND&~(0x1<<3))|(0x1<<3);
-
rINTPND=(rINTPND&~(0x1<<3))|(0x1<<3 );
- }
- }
- static void __irq Eint4_7_ISR(void)
- {
- U8 j = 0;
-
if(rEINTPEND == (rEINTPEND&~(0x1<<4))|(0x1<<4)){
- for(j=0;i<2;i++){
-
rGPBDAT= (rGPBDAT&~(0xf<<5))|0x0e0; //LED4亮 0111
- delay(50000000);
-
rGPBDAT=(rGPBDAT&~(0xf<<5))|0x1E0; //全灭 1111
- delay(50000000);
- }
- rEINTPEND=(1<<4);
-
ClearPending(BIT_EINT4_7);
-
}else if(rEINTPEND == (rEINTPEND&~(0x1<<5))|(0x1<<5)){
- for(j=0;i<2;i++){
-
rGPBDAT= (rGPBDAT&~(0xf<<5))|0x140; //LED1,3亮 1010
- delay(50000000);
-
rGPBDAT=(rGPBDAT&~(0xf<<5))|0x1E0; //全灭 1111
- delay(50000000);
- }
- rEINTPEND=(1<<5);
-
ClearPending(BIT_EINT4_7);
-
}else if(rEINTPEND == (rEINTPEND&~(0x1<<6))|(0x1<<6)){
- for(j=0;i<2;i++){
- rGPBDAT= (rGPBDAT&~(0xf<<5))|0xA0; //LED2,4亮 0101
- delay(50000000);
-
rGPBDAT=(rGPBDAT&~(0xf<<5))|0x1E0; //全灭 1111
- delay(50000000);
- }
- rEINTPEND=(1<<6);
-
ClearPending(BIT_EINT4_7);
- }
-
rSRCPND=(rSRCPND&~(0x1<<1))|(0x1<<1);
-
rINTPND=(rINTPND&~(0x1<<1))|(0x1<<1 );
-
rEINTPEND=(rEINTPEND&~(0x7<<4))|(0x7<<4);
- }
- void INIT_interrupt()
- {
-
rINTMSK=(rINTMSK&~(0x1<<1)); //中断屏蔽(INTMSK)寄存器
- //56000050 11 10
-
rGPFCON = (rGPFCON&~(0x3<<2))|(0x2<<2);//GPF1设置为 外部中断1
-
rGPFCON = (rGPFCON&~(0x3<<4))|(0x2<<4);//GPF2设置为 外部中断2
-
rGPFCON = (rGPFCON&~(0x3<<6))|(0x2<<6);//GPF3设置为 外部中断3
-
rGPFCON = (rGPFCON&~(0x3<<8))|(0x2<<8);//GPF4设置为 外部中断4
-
rGPFCON = (rGPFCON&~(0x3<<10))|(0x2<<10);//GPF5设置为 外部中断5
-
rGPFCON = (rGPFCON&~(0x3<<12))|(0x2<<12);//GPF6设置为 外部中断6
-
-
rEXTINT1 =(rEXTINT1&~(0x7<<4))|(0x2<<4) //外部中断1,使用下降沿触发
-
rEXTINT1 =(rEXTINT1&~(0x7<<8))|(0x2<<8) //外部中断2,使用下降沿触发
-
rEXTINT1 =(rEXTINT1&~(0x7<<12))|(0x2<<12) //外部中断3,使用下降沿触发
-
rEXTINT1 =(rEXTINT1&~(0x7<<16))|(0x2<<16) //外部中断4,使用下降沿触发
-
rEXTINT1 =(rEXTINT1&~(0x7<<20))|(0x2<<20) //外部中断5,使用下降沿触发
-
rEXTINT1 =(rEXTINT1&~(0x7<<24))|(0x2<<24) //外部中断6,使用下降沿触发
-
pISR_EINT1=(U32)Eint1_ISR;//把EINT1的中断入口地址放进去
-
pISR_EINT2=(U32)Eint2_ISR;//把EINT2的中断入口地址放进去
-
pISR_EINT3=(U32)Eint3_ISR;//把EINT3的中断入口地址放进去
-
pISR_EINT4_7=(U32)Eint4_7_ISR;//把EINT4_7的中断入口地址放进去
-
rSRCPND=(rSRCPND&~(0xF<<1))|(0xF<<1); //初始化时也清除一下挂起寄存器
-
rINTPND=(rINTPND&~(0xF<<1))|(0xF<<1);
-
rEINTPEND=(rEINTPEND&~(0x7<<4))|(0x7<<4);
-
-
- //如果有外部中断4-23,则中断挂起寄存器也要清零一下,中断屏蔽寄存器也要改为可服务
-
rINTMSK=(rINTMSK&~(0xF<<1))|(0x0<<1); //中断屏蔽(INTMSK)寄存器 EINT1\ENIT2\ENIT3\ENIT4_7使能
-
rEINTMASK = (rEINTMASK&~(0x7<<4))|(0x0<<4);//子中断屏蔽寄存器 EINT4\ENIT5\ENIT6使能
- }
- /* 自定义简单延迟程序 */
- int delay(int times)
- {
- int i;
- for(i=0;i<times;i++);
- return 0;
- }
- void xmain(void)
- {
- ChangeClockDivider(3,1);
- ChangeMPllValue(127,2,1); //405MHZ
- //Rtc_Init(); //实时时钟初始化
- Isr_Init();
- Uart_Init(0, 115200);
- Uart_Select(0);
-
- rGPBCON=(rGPBCON& ~(0xFF<<10)) | (0x55<<10);//GPB5-8 set output
- rGPBUP |= (0xFF<<5); //disable GPB pull up
- INIT_interrupt();
-
- while(1);
- }
全部资料51hei下载地址:
外部中断实验.zip(127.18 KB, 下载次数: 11)