📄 uhal.c
字号:
#include <stdarg.h>
#include <string.h>
#include "uhal.h"
//#include "s3c4510b.h"
//#######################SLT#######################
//mclk 50000000
//66000000hz/4= 12500000
///16500000/100= 125000
// 1/125000*SEC==> SEC*125
//#define _TICK 200 // 1/1000 sec
#define _TICK 100 // 1/100 sec
//#define _TICK 10 // 1/10 sec
//#define _CLOCK (125*(1000/_TICK))
#define _CLOCK (25000*(1000/_TICK))
//#define _CLOCK 0x17D7840 //25M
#define MAX_TBUF 2048
static char tbuf[MAX_TBUF]= {0, }; //for uHALr_printf
//for debugging
void BreakPoint(void);
void DebugUNDEF(void);
void DebugSWI(void);
void DebugABORT(void);
void DebugFIQ(void);
//timer interrupt handler routine
//extern void TickHandler(void);
extern void OSTimeTick (void);
extern void UART0RxIsr(void);
//for interrupt enable or disable
extern void ARMDisableInt(void);
extern void ARMEnableInt(void);
//***************************************************
//*Interrupt
//***************************************************
static void DummyIsr(void) {}
void (*InterruptHandlers[MAXHNDLRS])(void);
//***********************************************************************
//* InitIntHandlerTable: Initialize the interrupt handler table *
//* NOTE(S): This should be called during system initialization *
//***********************************************************************
void InitIntHandlerTable(void)
{
REG32 i;
for (i = 0; i < MAXHNDLRS; i++)
InterruptHandlers[i] = DummyIsr;
}
//*********************************************************
//* SysSetInterrupt: Setup Interrupt Handler Vector Table *
//*********************************************************
void SysSetInterrupt(REG32 vector, void (*handler)())
{
InterruptHandlers[vector] = handler;
}
//******************************
//*irq interrupt routine *
//******************************
void ISR_IrqHandler(REG32 vector)
{
(*InterruptHandlers[vector])(); // Call interrupt service routine
}
/*** Called by ARMTargetInit() ***/
//disable memory management unit.S3C44B0X无MMU功能,函数为空
void uHALr_ResetMMU(void)
{
}//uHALrResetMMU
//Initialize UART that is used task.
void uHALr_InitUART(void)
{
UARTLCON0 = 0x03;
UARTLCON1 = 0x03;
UARTBRD0 = 0xA20;
UARTBRD1 = 0xA20;
UARTCONT0 = 0x09;
UARTCONT1 = 0x09;
}
//Initialze interrupts.
void uHALr_InitInterrupts(void) //must modify
{
// Non-vectored,IRQ disable,FIQ disable
// rINTCON=0x0;
// All=IRQ mode
// rINTMOD=0x0;
INTMODE = 0x0;
// All interrupt is masked.
// rINTMSK=BIT_GLOBAL;
INTMASK = ALL_INTR_MASK;
//set interrupt vector routine
// pISR_RESET //reserved
pISR_ArmUndef= (unsigned) DebugUNDEF;
pISR_ArmSwi= (unsigned) DebugSWI;
pISR_ArmPre= (unsigned) DebugABORT;
pISR_ArmAbort= (unsigned) DebugABORT;
pISR_ArmRev= (unsigned) BreakPoint; //not used
// pISR_ArmIrq= (unsigned) 0; //reserved
pISR_ArmFiq= (unsigned) DebugFIQ;
/*
pISR_PRIOTY0 = (unsigned) BreakPoint;
pISR_PRIOTY1 = (unsigned) BreakPoint;
pISR_PRIOTY2 = (unsigned) BreakPoint;
pISR_PRIOTY3 = (unsigned) BreakPoint;
pISR_PRIOTY4 = (unsigned) BreakPoint;
pISR_PRIOTY5 = (unsigned) BreakPoint;
pISR_PRIOTY6 = (unsigned) BreakPoint;
pISR_PRIOTY7 = (unsigned) BreakPoint;
pISR_PRIOTY8 = (unsigned) BreakPoint;
pISR_PRIOTY9 = (unsigned) BreakPoint;
pISR_PRIOTY10 = (unsigned) BreakPoint;
pISR_PRIOTY11 = (unsigned) BreakPoint;
pISR_PRIOTY12 = (unsigned) BreakPoint;
pISR_PRIOTY13 = (unsigned) BreakPoint;
pISR_PRIOTY14 = (unsigned) BreakPoint;
pISR_PRIOTY15 = (unsigned) BreakPoint;
pISR_PRIOTY16 = (unsigned) BreakPoint;
pISR_PRIOTY17 = (unsigned) BreakPoint;
pISR_PRIOTY18 = (unsigned) BreakPoint;
pISR_PRIOTY19 = (unsigned) BreakPoint;
pISR_PRIOTY20 = (unsigned) BreakPoint;
*/
InitIntHandlerTable();
//handler setting
// pISR_PRIOTY10 = (unsigned) TickHandler;
// pISR_PRIOTY10 = (unsigned) OSTimeTick;
SysSetInterrupt(nTIMER0_INT,OSTimeTick);
SysSetInterrupt(nUART0_RX_ERR_INT,UART0RxIsr);
}//uHALr_InitInterrupts
//Initialize timer that is used OS.
void uHALr_InitTimers(void) //must modify
{
//dead zone=0, pre0= 100
// rTCFG0= 0x00000064;
//all interrupt, mux0= 1/4
// rTCFG1= 0x00000001;
INTMASK = ((unsigned int)INTMASK)&(~(BIT_GLOBAL_INTR|BIT_TIMER0_INTR));
//set T0 count
// rTCNTB0= _CLOCK;
TDATA0 = _CLOCK;
TCNT0 = _CLOCK;
TDATA1 = _CLOCK;
TCNT1 = _CLOCK;
//update T0
// rTCON= 0x00000002;
//T0,auto reload and start
// rTCON= 0x00000009;
TMOD = 0x00000001;
}//uHALr_InitTimers
/*** Called by ARMTargetStart() ***/
//Request the system timer.
//return value 1:success 0:fail
int uHALr_RequestSystemTimer(void *tick, const unsigned char *str)
{
return 1;
}//uHALr_RequestSystemTimer
//Start system timer & enable the interrupt.
void uHALr_InstallSystemTimer(void) //must modify
{
//Non-vectored,IRQ enable,FIQ disable
// rINTCON=0x5;
INTMODE = ((unsigned int)INTMODE)&(~BIT_TIMER0_INTR);
//Non maksed TIMER0
//#######################SLT##############################
// rINTMSK=~( BIT_TIMER0 | BIT_GLOBAL); //Default value=0x7ffffff
INTMASK = ((unsigned int)INTMASK)&(~(BIT_UART0_RXINTR|BIT_TIMER0_INTR|BIT_GLOBAL_INTR));
}//uHALr_InstallSystemTimer
//////////////////////////////////////////////////////////////////
//routines for debugging
//////////////////////////////////////////////////////////////////
void OutDebug(unsigned int num)
{
// uHALr_printf("\r\n***STACK***:%d\r\n", num);
}//OutDebug
void BreakPoint(void)
{
/* char m=200;
// uHALr_printf("!!!Enter break point.");
while(m) {
Led_Display(0xf);
Delay(1000);
Led_Display(0x0);
Delay(1000);
m--;
}//while
*/
}//BreakPoint
//extern
int I_COUNT= 0; //作为控制用
void DebugUNDEF(void)
{
// uHALr_printf("!!!Enter UNDEFINED. %d\r\n", I_COUNT);
BreakPoint();
}
void DebugSWI(void)
{
// uHALr_printf("!!!Enter SWI. %d\r\n", I_COUNT);
BreakPoint();
}
void DebugABORT(void)
{
// uHALr_printf("!!!Enter ABORT %d\r\n", I_COUNT);
BreakPoint();
}
void DebugFIQ(void)
{
// uHALr_printf("!!!Enter FIQ. %d\r\n", I_COUNT);
BreakPoint();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -