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

📄 interrupt.c

📁 lpc2138读写SD卡的fat文件系统
💻 C
字号:
// Interrupt routines
#include <stdio.h>                  // standard I/O .h-file
#include <LPC213x.H>                // LPC213x definitions
#include <bsp.h>                    // include board support package

int volatile timeval;
int volatile timeval_0;
int volatile T0_flag;
unsigned int volatile timer_0_capture;
unsigned int volatile timer_0_capture_accum;
unsigned int val;
unsigned int volatile tval;
extern void set_LED (unsigned char led_no, unsigned char led_cmd);

// Timer Counter 1 Interrupt with (60 MHz CPU)/4 Clock
// Timer 1 also schedules AD readings
void tc1 (void) __irq {
  if (timeval > 0) --timeval;	// semephore for delay functions
// set AD channel to ch1
  AD0CR   = 0x00200402;         // Setup A/D: 10-bit AIN0 (ch 1) @ 3MHz
  AD0CR  |= 0x01200000;                	// Start A/D Conversion
  do {
    val = AD0DR;                      	// Read A/D Data Register
  } while ((val & 0x80000000) == 0);  	// Wait for end of A/D Conversion
  AD0CR &= ~0x01000000;               	// Stop A/D Conversion
  val = (val >> 6) & 0x03FF;          	// Extract AIN0 Value
// let read next AD channel (ch0)
  AD0CR   = 0x00200401;         // Setup A/D: 10-bit AIN0 (ch 0) @ 3MHz
  AD0CR  |= 0x01200000;                 // Start A/D Conversion
  do {
    tval = AD0DR;                       // Read A/D Data Register
  } while ((tval & 0x80000000) == 0);   // Wait for end of A/D Conversion
  AD0CR &= ~0x01000000;                 // Stop A/D Conversion
  tval = (tval >> 6) & 0x03FF;          // Extract AIN0 Value
// clean up interrupt flags
  T1IR |= 0x11;					// clear all interrupts
  VICVectAddr = 0;              // Acknowledge Interrupt
}

// Setup the Timer Counter 1 Interrupt (used for delay function)
void init_timer_1 (void) {
  T1MR0 = 1874;                 // 0.125uSec = 1875-1 counts    
  T1MCR = 3;                    // Interrupt and Reset on MR0   
// #define T1CCR          (*((volatile unsigned long *) 0xE0008028))
  T1CCR = 0x05;					// init control reg.
  T1TCR = 1;                    		// Timer1 Enable
  VICVectAddr1 = (unsigned long)tc1;    // set interrupt vector in 0
  VICVectCntl1 = 0x20 | 5;              // use it for Timer 1 Interrupt
}

void delay (int delay_val) {     // Delay function
  unsigned int cnt;
  unsigned int val;
  int diff;
  timeval = delay_val;			// init timeer 1 value to delay
  while (timeval > 0);			// wait until Timer 1 decrements delay_val to zero 
}

// Timer Counter 0 Interrupt executes with 60 MHz CPU Clock
void tc0 (void) __irq {			// Timer 0 is used to measure anonmometer period
// Need to determine what caused the interrupt
// If capture interrupt then set timer 0 period capture variable
  if (T0IR==0x10) {
    set_LED(ONE,ON);
	T0_flag++;					// measure one full rev
	if (T0_flag>4) {
	  timer_0_capture = T0TC;	// get timer counts
	  if (timer_0_capture > 50000000) timer_0_capture = 50000000; // set to lowest speed
	  T0TC = 0;					// reset counter
      T0_flag = 0;				// reset flag to measure 4 pulses (1 rev)
	}
    T0IR |= 0x10;               // Clear capture interrupt flag
  }	
  else if (T0IR==0x01) { 		// Is it a match interrupt?						
    set_LED(ONE,OFF);			// overflow - no wind
	timer_0_capture = 50000000;	// no conversion, set to lowest speed
	T0TC = 0;					// make use counter is reset
  }

  T0IR |= 0x11;					// clear all interrupts
  VICVectAddr = 0;              // Acknowledge Interrupt
}

// Setup the Timer Counter 0 Interrupt
void init_timer (void) {
  T0_flag = 0;					// init flag to measure one rev.
  T0MR0 = 0x02FFFFFF;           // large duration for no wind
  T0CCR = 0x05;					// cause capture on P0.0 
  T0MCR = 3;                    // Interrupt and Reset on MR0
  T0TCR = 1;                    // Timer0 Enable
  VICVectAddr0 = (unsigned long)tc0;    // set interrupt vector in 0
  VICVectCntl0 = 0x20 | 4;              // use it for Timer 0 Interrupt
}

⌨️ 快捷键说明

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