

1 #include"gpio.h" 2 #include"def.h" 3 #include "system.h" 4 #include "intc.h" 5 /* 6 本例简单展示中断需要配置的 中断向量涉及的寄存器:void IRQINIT(void); 7 和 外部中断0的引脚关联的寄存器相关配置: void KeyInit(int key_num); 8 */ 9 10 11 #define BASE 0X7F008000 12 #define GPIO ((oGPIO_REGS*)BASE) 13 14 #define Inp32(ADDR) *((u32*)ADDR) 15 #define Outp32(ADDR,VAL) *((u32*)ADDR)=VAL 16 17 extern void SYSTEM_EnableVIC( void); 18 extern void SYSTEM_EnableIRQ( void); 19 void KeyInit(int key_num); 20 void EintClrPend(int key_num); 21 void EintClrMask(int key_num); 22 void BuzzerPlay(int count); 23 void Delay(int time); 24 void IRQINIT(void); 25 void BuzzerInit(void); 26 27 void __irq IsrEint(void); 28 29 int main(void) 30 { 31 SYSTEM_EnableVIC(); 32 SYSTEM_EnableIRQ(); 33 BuzzerInit(); 34 IRQINIT(); 35 KeyInit(1); 36 KeyInit(3); 37 KeyInit(5); 38 //BuzzerInit(); 39 while(1); 40 41 } 42 //中断向量控制器初始化; 43 void IRQINIT(void) 44 { 45 u32 uConValue; 46 // 1. 选择为IRQ模式: 47 uConValue = Inp32(rVIC0INTSELECT); 48 uConValue &= ~0x3; 49 Outp32(rVIC0INTSELECT,uConValue); 50 // 2. 使能中断向量寄存器对应的中断: 51 uConValue = Inp32(rVIC0INTENABLE); 52 uConValue |= 0x3; 53 Outp32(rVIC0INTENABLE,uConValue); 54 // 3. 注册中断程序地址: 55 Outp32(rVIC0VECTADDR,(u32)IsrEint); 56 Outp32(rVIC0VECTADDR+4,(u32)IsrEint); 57 // 4. 清零中断程序运行地址 58 Outp32(rVIC0ADDR,0); 59 60 } 61 62 //配置按键所在引脚的所有配置寄存器; 63 void KeyInit(int key_num) 64 { 65 u32 uConValue; 66 // 1. 将按键所在的GPN引脚 设为中断模式: 67 uConValue = GPIO->rGPIONCON; 68 uConValue &= ~(0x3<<((key_num -1) *2)); 69 uConValue |= 0x2 << ((key_num -1) *2); 70 GPIO->rGPIONCON = uConValue; 71 // 2. 除能按键所在的GPN引脚上下拉电阻; 72 uConValue = GPIO->rGPIONPUD; 73 uConValue &= ~(0x3<<(key_num -1)); 74 GPIO->rGPIONPUD = uConValue; 75 // 3. 配置GPN0的触发方式为下降触发 76 uConValue = GPIO->rEINT0CON0; 77 uConValue &= ~(0x7 << ((key_num -1)*3)); 78 uConValue |= (0x2 << ((key_num -1)*3)); 79 GPIO->rEINT0CON0 = uConValue; 80 // 4. 清除未决寄存器标志 81 EintClrPend(key_num); 82 // 5. 关闭ENT0MASK,解除屏蔽; 83 EintClrMask(key_num); 84 85 } 86 87 //按键清除未决寄存器具体实现: 88 void EintClrPend(int key_num) 89 { 90 GPIO->rEINT0PEND |= (0X1 << (key_num -1)); 91 } 92 //清除屏蔽位具体实现: 93 void EintClrMask(int key_num) 94 { 95 GPIO->rEINT0MASK &= ~(0x1<<(key_num -1)); 96 } 97 98 //服务函数 99 void __irq IsrEint(void) 100 { 101 EintClrPend(1); 102 EintClrPend(3); 103 EintClrPend(5); 104 BuzzerPlay(5); 105 Outp32(rVIC0ADDR,0); 106 107 } 108 109 110 //延时函数; 111 void Delay(int time) 112 { 113 int i; 114 for(; time >0; time--) 115 for(i=0;i<3000;i++); 116 } 117 118 //初始化buzzer; 119 void BuzzerInit(void) 120 { 121 u32 uConValue; 122 //设置GPF15为输出口 123 uConValue = GPIO->rGPIOFCON; 124 uConValue &= ~(0x3 << 30); 125 uConValue |= 0x1 << 30; 126 GPIO->rGPIOFCON=uConValue; 127 //除能上下拉电阻 128 uConValue = GPIO->rGPIOFPUD; 129 uConValue &= ~(0x2 << 15); 130 GPIO->rGPIOFPUD = uConValue; 131 } 132 //蜂鸣器工作 133 void BuzzerPlay(int count) 134 { 135 while(count--) 136 { 137 GPIO->rGPIOFDAT |= (0x1 << 15); 138 Delay(500); 139 GPIO->rGPIOFDAT &= ~(0x1 << 15); 140 Delay(500); 141 } 142 }