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 *)&regs[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 *)&regs[0], 2*4);

		_printstr(irqstr, 11);
		_printhex((uint8 *)&regs[2], 2*4);

		_printstr(regstr, 11);
		_printhex((uint8 *)&regs[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 *)&regs[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 *)&regs[0], 2*4);

		_printstr(irqstr, 11);
		_printhex((uint8 *)&regs[2], 2*4);

		_printstr(regstr, 11);
		_printhex((uint8 *)&regs[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 *)&regs[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 *)&regs[0], 2*4);

		_printstr(irqstr, 11);
		_printhex((uint8 *)&regs[2], 2*4);
		
		_printstr(regstr, 11);
		_printhex((uint8 *)&regs[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 + -
显示快捷键?