📄 timer.c
字号:
/******************************************************************************************
Timer.c (v1.0)
-------------------------------------------------------------------------------------
This code is from the book:
"Embedded Internet: TCP/IP Basics, Implementation and Applications" by Sergio Scaglia
[Pearson Education, 2006 - ISBN: 0-32-130638-4]
This code is copyright (c) 2006 by Sergio Scaglia, and it may only be used for educational
purposes. For commercial use, please contact me at sscaglia@intramarket.com.ar
For more information and updates, please visit www.embeddedinternet.org
******************************************************************************************/
#include <iolpc2129.H>
#include "Timer.h"
#include "sysClock.h"
#define VIC_TIMER0_bit (1 << VIC_TIMER0)
#define VIC_UART1_bit (1 << VIC_UART1)
struct {
unsigned int value;
char enabled;
}timer[NumberOfTimers];
char i;
static void DefDummyInterrupt()
{
}
/* Timer Counter 0 Interrupt executes each 1 ms @ 58,98 MHz CPU Clock (14,7456MHz) */
static void tc0(void) { // Generate Interrupt
for(i=0; i<NumberOfTimers;i++) {
if (timer[i].value!=0 && timer[i].enabled)
timer[i].value--;
}
T0IR = 1; // Clear interrupt flag
}
void INTERRUPTSinit(void) {
// Setup interrupt controller.
VICProtection = 0;
// Disable ALL interrupts
VICIntEnClear = 0xffffffff;
VICDefVectAddr = (unsigned int)&DefDummyInterrupt;
VICDefVectAddr = (unsigned int)&tc0;
VICIntSelect &= ~VIC_TIMER0_bit; // IRQ on timer 0 line.
VICVectAddr1 = (unsigned int)&tc0;
VICVectCntl1 = 0x20 | VIC_TIMER0; // Enable vector interrupt for timer 0.
VICIntEnable = VIC_TIMER0_bit; // Enable timer 0 interrupt.
}
#pragma vector=0x18
__irq __arm void irq_handler(void) {
void (*interrupt_function)();
unsigned int vector;
vector = VICVectAddr; // GET VECTOR ADDRESS FROM VIC CONTROLLER
interrupt_function = (void(*)())vector;
(*interrupt_function)(); // Call vectored interrupt function.
VICVectAddr = 0; // Clear interrupt in VIC.
}
/* Setup the Timer Counter 0 Interrupt */
void timer_init(void) {
for(i=0; i<NumberOfTimers;i++) {
timer[i].value=0;
timer[i].enabled=0;
}
T0PC = 0;
T0MR0 = ((pClkFreq()/4)/1000) - 1; // 1 msec
T0MCR = 3; // Interrupt and Reset on MR0
T0TCR = 1; // Timer0 Enable
}
void timer_start(char timerID, unsigned int timeout) {
timer[timerID].value=timeout;
timer[timerID].enabled=1;
}
void timer_stop(char timerID) {
timer[timerID].enabled=0;
}
unsigned int timer_expired(char timerID) {
if ((! timer[timerID].enabled) || timer[timerID].value)
return 0;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -