📄 interrupt.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 + -