target.c
来自「基于ARM和uC/OS-II实现的串口控制台」· C语言 代码 · 共 371 行
C
371 行
/*******************************************************************************
**
** File Name: target.c
** Author: Zhoudan
** Last Modified: 2007-03-06
** Last Version: 0.2
** Environment: LPC2214/RVDSv2.2/uCOS-II2.52
** Descriptions:
**
*******************************************************************************/
#include "config.h"
static char linestr[] = "-----------------------";
static char undestr[] = "Undefined:";
static char prefstr[] = "Prefetch Abort:";
static char datastr[] = "Data Abort:";
static char irqstr[] = "IRQ SP, LR:";
static char sysstr[] = "SYS SP, LR:";
static char regstr[] = "R12-R0, LR:";
uint8 nirq;
void IRQ_Exception(void)
{
VICIntEnClr = 0x000CFF0F;
VICVectAddr = 0x00;
}
void FIQ_Exception(void)
{
while(1);
}
void _printstr(char *str, int len)
{
int i;
for(i = 0; i < len; i++)
{
U0THR = str[i];
while((U0LSR & U0LSR_THRE) == 0);
}
U0THR = 0x0D;
while((U0LSR & U0LSR_THRE) == 0);
U0THR = 0x0A;
while((U0LSR & U0LSR_THRE) == 0);
}
void _printhex(uint8 *hex, int len)
{
uint8 ch;
int i;
for (i = 0; i < len; i++)
{
ch = hex[i] >> 4;
ch = (ch > 9) ? ch - 10 + 'A' : ch + '0';
U0THR = ch;
while((U0LSR & U0LSR_THRE) == 0);
ch = hex[i] & 0x0F;
ch = (ch > 9) ? ch - 10 + 'A' : ch + '0';
U0THR = ch;
while((U0LSR & U0LSR_THRE) == 0);
if(i % 8 == 7)
{
U0THR = 0x0D;
while((U0LSR & U0LSR_THRE) == 0);
U0THR = 0x0A;
while((U0LSR & U0LSR_THRE) == 0);
}
else
{
U0THR = ' ';;
while((U0LSR&U0LSR_THRE) == 0);
}
}
if(i % 8 != 0)
{
U0THR = 0x0D;
while((U0LSR & U0LSR_THRE) == 0);
U0THR = 0x0A;
while((U0LSR & U0LSR_THRE) == 0);
}
}
void HandlerUndefined(uint32 regs[])
{
uint32 data;
uint8 *pchar;
int i;
for (i = 0; i < 18; i++)
{
data = regs[i];
pchar = (uint8 *)®s[i];
pchar[0] = (uint8)(data >> 24);
pchar[1] = (uint8)(data >> 16);
pchar[2] = (uint8)(data >> 8);
pchar[3] = (uint8)(data >> 0);
}
while (1)
{
_printstr(linestr, 23);
_printstr(undestr, 10);
_printhex(&nirq, 1);
_printstr(sysstr, 11);
_printhex((uint8 *)®s[0], 2*4);
_printstr(irqstr, 11);
_printhex((uint8 *)®s[2], 2*4);
_printstr(regstr, 11);
_printhex((uint8 *)®s[4], 14*4);
DelayMS(5000);
}
}
void HandlerPrefetchAbort(uint32 regs[])
{
uint32 data;
uint8 *pchar;
int i;
for (i=0; i<18; i++)
{
data = regs[i];
pchar = (uint8 *)®s[i];
pchar[0] = (uint8)(data>>24);
pchar[1] = (uint8)(data>>16);
pchar[2] = (uint8)(data>>8);
pchar[3] = (uint8)(data>>0);
}
while (1)
{
_printstr(linestr, 23);
_printstr(prefstr, 15);
_printhex(&nirq, 1);
_printstr(sysstr, 11);
_printhex((uint8 *)®s[0], 2*4);
_printstr(irqstr, 11);
_printhex((uint8 *)®s[2], 2*4);
_printstr(regstr, 11);
_printhex((uint8 *)®s[4], 14*4);
DelayMS(5000);
}
}
void HandlerDataAbort(uint32 regs[])
{
uint32 data;
uint8 *pchar;
int i;
for (i=0; i<18; i++)
{
data = regs[i];
pchar = (uint8 *)®s[i];
pchar[0] = (uint8)(data>>24);
pchar[1] = (uint8)(data>>16);
pchar[2] = (uint8)(data>>8);
pchar[3] = (uint8)(data>>0);
}
while (1)
{
_printstr(linestr, 23);
_printstr(datastr, 11);
_printhex(&nirq, 1);
_printstr(sysstr, 11);
_printhex((uint8 *)®s[0], 2*4);
_printstr(irqstr, 11);
_printhex((uint8 *)®s[2], 2*4);
_printstr(regstr, 11);
_printhex((uint8 *)®s[4], 14*4);
DelayMS(5000);
}
}
void VICInit(void)
{
extern void IRQ_Handler(void);
VICIntEnClr = 0xffffffff;
VICDefVectAddr = (uint32)IRQ_Handler;
}
void TargetInit(void)
{
OS_ENTER_CRITICAL();
srand((uint32) TargetInit);
VICInit();
Timer0Init();
OS_EXIT_CRITICAL();
}
void TargetResetInit(void)
{
#ifdef __DEBUG
MEMMAP = 0x03;
#elif __IN_CHIP
MEMMAP = 0x01;
#endif
/* 设置系统各部分时钟 */
PLLCON = 1;
#if (Fpclk / (Fcclk / 4)) == 1
VPBDIV = 0;
#elif (Fpclk / (Fcclk / 4)) == 2
VPBDIV = 2;
#elif (Fpclk / (Fcclk / 4)) == 4
VPBDIV = 1;
#endif
#if (Fcco / Fcclk) == 2
PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
#elif (Fcco / Fcclk) == 4
PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
#elif (Fcco / Fcclk) == 8
PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
#elif (Fcco / Fcclk) == 16
PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
#endif
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0);
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
/* 设置存储器加速模块 */
MAMCR = 0;
#if Fcclk < 20000000
MAMTIM = 1;
#elif Fcclk < 40000000
MAMTIM = 2;
#else
MAMTIM = 3;
#endif
MAMCR = 2;
EXTMODE = 0x00;
VICIntEnClr = 0xffffffff;
VICVectAddr = 0;
VICIntSelect = 0;
}
/*******************************************************************************
** 以下为一些与系统相关的库函数的实现
** 具体作用请ads的参考编译器与库函数手册
** 用户可以根据自己的要求修改
*******************************************************************************/
#include "rt_sys.h"
#include "stdio.h"
#pragma import(__use_no_semihosting_swi)
#pragma import(__use_two_region_memory)
int __rt_div0(int a)
{
a = a;
return 0;
}
int fputc(int ch,FILE *f)
{
ch = ch;
f = f;
return 0;
}
int fgetc(FILE *f)
{
f = f;
return 0;
}
int _sys_close(FILEHANDLE fh)
{
fh = fh;
return 0;
}
int _sys_write(FILEHANDLE fh, const unsigned char * buf,
unsigned len, int mode)
{
fh = fh;
buf = buf;
len =len;
mode = mode;
return 0;
}
int _sys_read(FILEHANDLE fh, unsigned char * buf,
unsigned len, int mode)
{
fh = fh;
buf = buf;
len =len;
mode = mode;
return 0;
}
void _ttywrch(int ch)
{
ch = ch;
}
int _sys_istty(FILEHANDLE fh)
{
fh = fh;
return 0;
}
int _sys_seek(FILEHANDLE fh, long pos)
{
fh = fh;
return 0;
}
int _sys_ensure(FILEHANDLE fh)
{
fh = fh;
return 0;
}
long _sys_flen(FILEHANDLE fh)
{
fh = fh;
return 0;
}
int _sys_tmpnam(char * name, int sig, unsigned maxlen)
{
name = name;
sig = sig;
maxlen = maxlen;
return 0;
}
void _sys_exit(int returncode)
{
returncode = returncode;
}
char *_sys_command_string(char * cmd, int len)
{
cmd = cmd;
len = len;
return 0;
}
/*******************************************************************************
** End Of File
*******************************************************************************/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?