⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt.c

📁 FS2410 开发板上启用 MMU 实现虚拟内存管理
💻 C
字号:
#include "printf.h"
#include "interrupt.h"

int key_scan(void) {
  int i;
  for(i = 0; i < 1000 ;i++) ;
  GPGDAT = (GPGDAT &(~((1<<6)|(1<<2)))) | (1<<6) | (0<<2) ;		//GPG6,2 output 0
  GPEDAT = (GPEDAT &(~((1<<13)|(1<<11)))) | (1<<13) | (1<<11) ;		//GPE13,11 output 0
  if(      (GPFDAT&(1<< 0)) == 0 )		return 16 ;
  else if( (GPFDAT&(1<< 2)) == 0 )		return 15 ;
  else if( (GPGDAT&(1<< 3)) == 0 )		return 14 ;
  else if( (GPGDAT&(1<<11)) == 0 )		return 13 ;

  GPGDAT = (GPGDAT &(~((1<<6)|(1<<2)))) | (0<<6) | (1<<2) ;		//GPG6,2 output 0
  GPEDAT = (GPEDAT & (~((1<<13)|(1<<11)))) | (1<<13) | (1<<11) ;	//GPE13,11 output 0
  if(      (GPFDAT&(1<< 0)) == 0 )		return 11 ;
  else if( (GPFDAT&(1<< 2)) == 0 )		return 8 ;
  else if( (GPGDAT&(1<< 3)) == 0 )		return 5 ;
  else if( (GPGDAT&(1<<11)) == 0 )		return 2 ;

  GPGDAT = (GPGDAT & (~((1<<6)|(1<<2)))) | (1<<6) | (1<<2) ;		//GPG6,2 output 0
  GPEDAT = (GPEDAT & (~((1<<13)|(1<<11)))) | (1<<13) | (0<<11) ;	//GPE13,11 output 0
  if(      (GPFDAT&(1<< 0)) == 0 )		return 10 ;
  else if( (GPFDAT&(1<< 2)) == 0 )		return 7 ;
  else if( (GPGDAT&(1<< 3)) == 0 )		return 4 ;
  else if( (GPGDAT&(1<<11)) == 0 )		return 1 ;

  GPGDAT = (GPGDAT & (~((1<<6)|(1<<2)))) | (1<<6) | (1<<2) ;		//GPG6,2 output 0
  GPEDAT = (GPEDAT & (~((1<<13)|(1<<11)))) | (0<<13) | (1<<11) ;	//GPE13,11 output 0
  if(      (GPFDAT&(1<< 0)) == 0 )		return 12 ;
  else if( (GPFDAT&(1<< 2)) == 0 )		return 9 ;
  else if( (GPGDAT&(1<< 3)) == 0 )		return 6 ;
  else if( (GPGDAT&(1<<11)) == 0 )		return 3 ;
  else return 0xff ;
}

void timer0_handler(void) {
  //convert the status of the led
  GPFDAT = ~(GPFDAT & (0xf << 4));  
  CLEAR_PENDING_REG(BIT_TIMER0);
  return;
}

void key_handler(void) {
  int key ;

  GPGCON = (GPGCON & (~((3<<22)|(3<<6)))) | ((0<<22)|(0<<6)) ; // GPG11,3 set input
  GPFCON = (GPFCON & (~((3<<4)|(3<<0)))) | ((0<<4)|(0<<0)) ;   // GPF2,0 set input

  key = key_scan();
  if (key != 0xff) {
    uart_printf( "K%d is pressed!\n", key ) ;
    GPFDAT = ~(key << 4);
  }

  switch (INTPND) {
    // Process k4~k6, k14; k1~k3, k13 interrupt
  case BIT_EINT8_23:
    /* Clear EINTPEND reg*/
    if (EINTPEND & (1 << 11))
      EINTPEND |= 1 << 11;
    else if(EINTPEND & ( 1<<19 ))
      EINTPEND |= 1 << 19;
    /* Clear pending reg*/
    CLEAR_PENDING_REG(BIT_EINT8_23);
    break;

    // Process k10~k12, k16 interrupt
  case BIT_EINT0:
    CLEAR_PENDING_REG(BIT_EINT0);
    break;

    // Process k7~k9, k15 interrupt
  case BIT_EINT2:
    CLEAR_PENDING_REG(BIT_EINT2);
    break;
  }
  INIT_KEYBOARD_REG();
}

void init_irq(void) {
  INIT_TIMER0(1);
  // Set the led 9-12 output
  SET_LED_REG_MODE(BIT_GPFCON8 | BIT_GPFCON10 | BIT_GPFCON12 | BIT_GPFCON14);
  INIT_KEYBOARD_REG();

  // Clear eint 11,19
  CLEAR_EINTPEND_REG(BIT_EINTPEND_11 | BIT_EINTPEND_19);
  // Enable EINT11,19
  ENABLE_EINTMASK_REG(BIT_EINTMASK_11 | BIT_EINTMASK_19);

  CLEAR_PENDING_REG(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);
  ENABLE_INTMSK_REG(BIT_TIMER0 | BIT_EINT0 | BIT_EINT2 | BIT_EINT8_23);

  //init the interrupt handler table
  INT_EINT0 = INT_EINT2 = INT_EINT8_23 = (unsigned long) key_handler;
  INT_TIMER0 = (unsigned long) timer0_handler;

  return;
}


// void EINT_Handle( void ) {
//   switch (INTPND) {
//     // Process k4~k6, k14; k1~k3, k13 interrupt
//   case BIT_EINT8_23:
//     key_handler();
//     /* Clear EINTPEND reg*/
//     if (EINTPEND & (1 << 11))
//       EINTPEND |= 1 << 11;
//     else if(EINTPEND & ( 1<<19 ))
//       EINTPEND |= 1 << 19;
//     /* Clear pending reg*/
//     CLEAR_PENDING_REG(BIT_EINT8_23);
//     return ;

//     // Process k10~k12, k16 interrupt
//   case BIT_EINT0:
//     key_handler();
//     CLEAR_PENDING_REG(BIT_EINT0);
//     return ;

//     // Process k7~k9, k15 interrupt
//   case BIT_EINT2:
//     key_handler();
//     CLEAR_PENDING_REG(BIT_EINT2);
//     return ;

//     // Process timer 0 interrupt
// //   case BIT_TIMER0:
// //     timer0_handler();
// //     CLEAR_PENDING_REG(BIT_TIMER0);
// //     return ;
//   }
// }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -