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

📄 main.c

📁 arm9.rar
💻 C
字号:
#include "config.h"
#include "board.h"
#include "utils.h"

#include "LCD_LTS350Q1_PE1.h"
#include "Touch_Screen.h"

#include "layout.h"
#include "mygui.h"

extern TEST_PROGRAM_ITEM *TestProgramGroup[];
extern void DftEnvInit(void);
extern void KeyScanInit(void) ;

static void SwiHandler(void)
{
	puts("Swi Interrupt detected\n");
		while(1);
}

static void DataAbortHandler(void) 
{
	puts("Data Abort detected\n");
	while (1);
}

static void FetchAbortHandler(void)
{
	puts("Prefetch Abort detected\n");
	while (1);
}

static void UndefHandler() 
{
	puts("Halt on Undefined instruction\n");
	while (1);
}

#ifndef	INTERRUPT_SUPPORT
static void IrqHandler(void)
{
	puts("Halt on IRQ!\n");
	while(1);
}
#endif

static void FiqHandler(void)
{
	puts("Halt on FIQ!\n");
	while(1);
}

static __inline void VectorInit(void)
{
	UdfInsVector = (U32)UndefHandler;
	SwiSvcVector = (U32)SwiHandler;
	InsAbtVector = (U32)FetchAbortHandler;
	DatAbtVector = (U32)DataAbortHandler;
#ifndef	INTERRUPT_SUPPORT
	IrqSvcVector = (U32)IrqHandler;
#endif
	FiqSvcVector = (U32)FiqHandler;
}

void LedDisp(void)
{
	LedSet(0x08);		//LED点亮/熄灭状态设置
	Delay(50);
	LedSet(0x04);		//LED点亮/熄灭状态设置
	Delay(50);
	LedSet(0x02);		//LED点亮/熄灭状态设置
	Delay(50);
	LedSet(0x01);		//LED点亮/熄灭状态设置
	Delay(50);
	LedSet(0x02);		//LED点亮/熄灭状态设置
	Delay(50);
	LedSet(0x04);		//LED点亮/熄灭状态设置
	Delay(50);
	LedSet(0x08);		//LED点亮/熄灭状态设置
}

//***************************************************************************
void LcdBkLtSet(U32 HiRatio);

/****************************************************************************
【功能说明】LCD背光亮度控制,PWM控制占空比
****************************************************************************/
int LCD_BackLight_Control(U32 a1, U32 a2, U32 a3, U32 a4)
{
	U8 HiRatio = 50 ;		
   	printf( "Press +/- to increase/reduce the light of LCD !\n" ) ;
	printf( "Press 'ESC' to Exit this test program !\n\n" );
	
	LcdBkLtSet( HiRatio ) ;

    while( 1 )
    {
		U8 key = getch();

		if( key == '+' )
		{
			if( HiRatio < 100 )
				HiRatio += 5 ;
		}
		
		if( key == '-' )
		{
			if( HiRatio > 1 )
				HiRatio -= 5 ;
		}
		
		if( key == ESC_KEY ) break ;
		
		LcdBkLtSet( HiRatio ) ;
		printf( "LCD backlight HiRatio %d\n", HiRatio ) ;
	}

	return  0 ;
}

static char BkLtTitle[] = "LCD背光控制实验";
static char BkLtTip[]   = "通过PWM的方式来控制LCD背光亮度,按ESC键返回";

//TestBkLtCtrlItem在prog_entry.c里被引用
TEST_PROGRAM_ITEM TestBkLtCtrlItem = {
				(TEST_PROGRAM)LCD_BackLight_Control, 	//入口地址
				BkLtTitle, 					//显示名称
				BkLtTip, 					//帮助或提示信息,可为NULL
				1};							//使用printf,puts,putch等函数时在LCD上也显示输出字符(串)

/****************************************************************************
【功能说明】系统主函数
****************************************************************************/
U32 download_addr;
U32 download_len;

void Main(void)
{
	U16 i, sel;
	U16 x, y, x1, y1;
	U32 tm, touch_panel_valid = 0;

	DisableInt();	//Disable interrupt
	
	BoardInitStart();
	
	SystemClockInit();
	TimerInit(TIMER_FREQ);
	MemCfgInit();
	PortInit();

#ifdef	TFTP_DOWNLOAD_SUPPORT
	eth_init();
	arp_init();
#endif
	
	VectorInit();
#ifdef	INTERRUPT_SUPPORT
	DisableIrq(-1);		//Mask all IRQ
	AckAndClrIrq(-1);	//ACK and Clear all IRQ
	EnableInt();		//Enable interrupt
#endif

#ifdef	NOR_FLASH_SUPPORT
	NorFlashInit();
#endif

	TimerInit(TIMER_FREQ);
	
	SerialSwitch(0);
	SerialChgBaud(115200);
	
//	CacheDisable();
	CacheFlush();
	CacheEnable();
	
	*(volatile U16 *)( 0x38001000 ) = 0x00;	//步进电机输出为0
	
	*(volatile U16 *)( 0x080001000 ) = 0xffff ;
	Beep(2000, 100);
	LedDisp();		//LED来回闪烁显示	
	Lcd_Tft_LTS350Q1_PE1_Init() ;
	ShowBootInfo();
	
#ifdef	NOR_FLASH_SUPPORT
	NorFlashStatusRep();
#endif

	printf("Build  date : %s--%s\n", __DATE__, __TIME__);

	//printf("Any Key To Next!\n") ;  getch() ;		//Any Key To Next
	Touch_Screen_Init();
	//TouchPanelCalibrate( LCD_XSIZE_TFT_240320, LCD_YSIZE_TFT_240320, 0, 0 ) ;		//触摸屏校准

	InitAllBox();
	SetLcdInfoCursor(0, 0);
	OutInfoToLCD("你好hello!");
	
	NorFlashInit();
	NorFlashStatusRep();
	
	LcdBkLtSet(70);		//初始化LCD背光占空比为70%
	KeyScanInit();
	//Test_GPS_Model() ;

	while( 1 )
	{
		int tp_status;
		putch('\n');
		for(i=0; TestProgramGroup[i]; i++)
		{
			printf("%d : %s\n", i+1, TestProgramGroup[i]->title);
		}

		while( !kbhit() ) 
		{
			//LedSet(GetKeyStatus());
			tp_status = CheckTouchPanelEvent(&x, &y, &tm);
			if(tp_status>0)
			{
				if(!touch_panel_valid)
				{
					x1 = x;
					y1 = y;
					touch_panel_valid = 1;
					printf("down %d,%d\n", x, y);
				}
			}
			else if(tp_status==0)
			{
				if( touch_panel_valid ) {
					printf("up %d,%d\n", x1, y1);
					MainBoxHandler(x1, y1, tm);
				}
				touch_panel_valid = 0;
			}
		}
		
		//putch(':');
		
		sel = Uart_GetIntNum() ;
		printf( "\t you select is %d\n", sel );
		if(sel>0&&sel<=i) 
		{
			U32 color;
			U16 mem[LCD_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320];
			
			printf("%s\n", TestProgramGroup[sel-1]->tip);
			SaveScreen(0, 0, LCD_XSIZE_TFT_240320, LCD_YSIZE_TFT_240320, (U16 *)mem);
			color = GetFontColor();
			if(TestProgramGroup[sel]->lcd_info) {
				FillScreen(COLOR_WHITE);
				SetLcdInfoCursor(0, 0);
				SetFontColor(COLOR_BLACK);
				LcdInfoOn();
			}
			TestProgramGroup[sel-1]->entry(download_addr, download_len, 0, 0);
			LcdInfoOff();
			SetFontColor(color);
			RestoreScreen(0, 0, LCD_XSIZE_TFT_240320, LCD_YSIZE_TFT_240320, (U16 *)mem);
			printf("end\n");
		}
		
	}

}
//***************************************************************************


void LoadFromUart(int run)
{
	int i, size;
	unsigned short dnCS, CheckSum;
	unsigned char *buf;
	unsigned char RxTmp[8];
	void (*fun)(void);
	
	download_addr = DFT_DOWNLOAD_ADDR;
	
	buf = (unsigned char *)download_addr;
	
	printf("Now download file from uart0 to 0x%x...\n", download_addr);
	
	i = 0;
	while(i<4)
		RxTmp[i++] = SerialRxChar();//getch();
    
    i = 0;
    size = *(unsigned long *)RxTmp - 4;
	while(i<size)
		buf[i++] = SerialRxChar();//getch();
	
	download_len = size-2;	
	
	dnCS = (buf[size-1]<<8)|buf[size-2];
	CheckSum = 0;
	for(size -= 3; size>=0; size--)
		CheckSum += buf[size];
	if(dnCS!=CheckSum) {
//		printf("get CS=0x%08x, cal CS=0x%08x\n", dnCS, CheckSum);
		puts("\nCheckSum error!\n");
		download_len = 0;
	} else {
		printf("\nReceived %x bytes success\n", download_len);
		//puts("Do you want to run it?");
		if(run) {//getyorn()) {
			fun = (void (*)(void))download_addr;		
			CacheDisable();
			//CacheFlush();
			(*fun)();
		}
	}
	
	return;
}

static int LoadFileFromUart(U32 a1, U32 a2, U32 a3, U32 a4)
{
	LoadFromUart(0);
	return 0;
}

static int LoadProgFromUart(U32 a1, U32 a2, U32 a3, U32 a4)
{
	LoadFromUart(1);
	return 0;
}

static char LoadFileFromUartTitle[] = "从串口下载文件";
static char LoadFileFromUartTip[] = "本程序从串口下载文件到SDRAM的0x30008000处,请在DNW的Serial Port菜单下选Transmit再选择文件发送";
static char LoadProgFromUartTitle[] = "从串口下载程序";
static char LoadProgFromUartTip[] = "本程序从串口下载程序到SDRAM的0x30008000处并直接运行,请在DNW的Serial Port菜单下选Transmit再选择二进制文件发送";

TEST_PROGRAM_ITEM LoadFileFromUartItem = {
	LoadFileFromUart,
	LoadFileFromUartTitle,
	LoadFileFromUartTip,
	1
	};

TEST_PROGRAM_ITEM LoadProgFromUartItem = {
	LoadProgFromUart,
	LoadProgFromUartTitle,
	LoadProgFromUartTip,
	1
	};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -