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

📄 timer.c

📁 阿根廷教授编写的嵌入式internet的实验教程的高质量代码
💻 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 + -