📄 timer.c
字号:
//-----------------------------------------------------------------------------
// Net TIMER.C
//
// This module sets up the timer and handles the timer interrupt
//-----------------------------------------------------------------------------
#include <reg51.h>
#include <net.h>
#include <timer.h>
extern UINT volatile event_word;
extern ULONG idata initial_sequence_nr;
sfr T2CON = 0xc8;
sbit cprl2 = T2CON^0;
sbit ct2 = T2CON^1;
sbit TR2 = T2CON^2;
sbit exen2 = T2CON^3;
sbit tclk = T2CON^4;
sbit rclk = T2CON^5;
sbit exf2 = T2CON^6;
sbit TF2 = T2CON^7;
sfr RCAP2H = 0xcb;
sfr RCAP2L = 0xca;
sfr TH2 = 0xcd;
sfr TL2 = 0xcc;
sfr CHPCON = 0xbf;
sfr CHPENR = 0xf6;
sfr SFRAL = 0xc4;
sfr SFRAH = 0xc5;
sfr SFRFD = 0xc6;
sfr SFRCN = 0xc7;
//--------------------------------------------------------------------------
// Timer 2 interrupt service routing. Intr vector location is
// address 0x002B. The timer generates an interrupt every 20 msec
// It is set to auto reload so do not need to reload it.
//--------------------------------------------------------------------------
void timer2_interrupt(void) interrupt 5
{
static UINT count1 = 0;
static UINT count2 = 0;
TF2 = 0; // Clear interrupt flag
// Advance the initial sequence number
initial_sequence_nr += 6250;
// Keep it some distance from rolling over
if (initial_sequence_nr & 0x10000000L) initial_sequence_nr = 1;
count1++;
// These events happens every 0.50 seconds, not simultaneously
if (count1 == 6) event_word |= EVENT_ARP_RETRANSMIT;
if (count1 == 12) event_word |= EVENT_TCP_INACTIVITY;
if (count1 == 25)
{
count1 = 0;
event_word |= EVENT_TCP_RETRANSMIT;
}
count2++;
if (count2 == 3001)
{
// This happens every 60.020 seconds, not simultaneous
// with above tasks
count2 = 0;
event_word |= EVENT_AGE_ARP_CACHE;
}
}
//--------------------------------------------------------------------------
// Setup Timer2 in mode 1 which is 16 bit auto reload
// Intr rate = 32 MHz /(12 * (65536 - reload value))
// For 20 msec reload value = 0x2FAB
//--------------------------------------------------------------------------
void init_timer2(void)
{
T2CON = 0x00;
RCAP2H = 0x2F; // Reload value
RCAP2L = 0xAB;
TH2 = 0x2F; // Initial load value
TL2 = 0xAB;
TR2 = 1; // Timer 2 run
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -