📄 interrupt.c
字号:
#include "reg7202.h"
#include "interrupt.h"
#include "hms7202lib.h"
#include "usb.h"
static int ExtInt1Happen=0;
void GPIOE(void);
void init_int(void)
{
*(volatile unsigned int *)INTC_STAT=0x0;//clear interupt pending bit
*(volatile unsigned int *)IntEnR = UNMASK_EXT1 | UNMASK_GPIOE;//ExtInt1,GPIOE enable
pISR_EXT1 = (unsigned int)EXT1;
pISR_GPIOE = (unsigned int)GPIOE;
}
void EXT1(void)
{
*(volatile unsigned int *)IntEnR &= ~UNMASK_EXT1;
*(volatile unsigned int *)INTC_STAT=0x0;
ExtInt1Happen=1;
ser_printf("\n外部中断1已发生");
ser_printf("\n按空格键从中断返回");
while(ser0_getchar()-0x20);
*(volatile unsigned int *)IntEnR |= UNMASK_EXT1;
}
void GPIOE(void)//旋钮服务程序
{
*(volatile unsigned int *)IntEnR &= ~UNMASK_GPIOE;
*(volatile unsigned int *)INTC_STAT=0x0;
int direction;
direction = *(volatile unsigned int *)PioEIS;
direction &= 0x0c00000;
if(direction == 0x0800000)
{ /*do someting*/}
else if(direction == 0x0400000)
{/* do someting*/}
else direction =0x0;
*(volatile unsigned int *)IntEnR |= UNMASK_GPIOE;
}
void interrupt_test(void)
{
init_int();
//设置PB11(外部中断1)为低电平有效触发模式
*(volatile unsigned short *)PioBmuxctl =0x000;
*(volatile unsigned short *)PioBDDR |=0x800;//置位则设置为输入口
*(volatile unsigned short *)PioBDR |=0xfff;//数据寄存器
*(volatile unsigned short *)PioBIM |=0x800;//置位则设置相应引脚为中断源
*(volatile unsigned short *)PioBIE &=0x7ff;//设置为电平触发模式
*(volatile unsigned short *)PioBIC =0xfff;//清除中断挂起位
*(volatile unsigned short *)PioBIP |=0x800;//低电平有效
//设置中断控制寄存器
//#define INTC_BASE 0x80024000 //IER
//#define INTC_ENAR (INTC_BASE) //IER
//#define IntEnR (INTC_BASE) //IER
//#define INTC_STAT (INTC_BASE+0x4) //ISR
//#define IntStatusR (INTC_BASE+0x4)//ISR
//#define INTC_VEC (INTC_BASE+0x8) //IVR
//#define INTC_VTAB (INTC_BASE+0x10) //SVR0
//#define INTC_IDR (INTC_BASE+0x90) //IDR
ser_printf("\n\n\n请按INPUT键");
while(!ExtInt1Happen);
ser_printf("\n外部中断1测试完成\n");
ser_printf("***********************");
}
int unmaskInterrupt(int level)
{
if(level < 0 && level >= N_INTR)
return FAIL;
*(volatile int *)(IntEnR) =*(volatile int *)(IntEnR) | ( 1 << level) ;
return OK;
}
int maskInterrupt(int level)
{
if(level < 0 && level >= N_INTR)
return FAIL;
*(volatile int *)IntEnR = *(volatile int *)IntEnR & ( ~(1 << level) );
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -