📄 main.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 + -