Files
player/Project/Src/MY/main_bootloader.c

552 lines
17 KiB
C
Raw Normal View History

2025-06-27 00:32:57 +08:00
#include "base.h"
#include "string.h"
#include "delay.h"
#include "lcd_rgb.h"
#include "usart.h"
#include "led.h"
#include "sdram.h"
#include "lcd_pwm.h"
#include "spi_flash.h"
#include "mymem.h"
#include "flash_manager.h"
//定义cmd变量
#define IAP_CMD (*((u32 *)0x20000000))
#define IAP_INDEX (*((u32 *)0x20000004))
//定义cmd取值
#define IAP_CMD_UPDATA 0xff000001 //直接升级user.app
#define IAP_CMD_UPINDEX 0xff000002 //升级指定序号的程序
#define IAP_CMD_SELECT 0xff000003 //选择启动方式
#define IAP_CMD_NONE 0x00000000
//定义用于升级的文件名
#define APP_NAME "user.app"
//定义用户程序区的起始地址
#define APP_ADDR (0x08000000+128*1024)
//定义显示跳跃像素
#define Y_JUMP 16
//在指定位置显示字符串
static void drawCharsAt (char *txt,int x,int y);
static void jump_app(void);
static void Init (void);
static void FLASH_EraseBySize (u32 size);
static void FLASH_WriteBySize (u8 *buff,u32 size);
static void FLASH_UpData (u8 *buff,u32 size);
static void iap_cmd_select (void);
static void iap_cmd_updata (void);
static void iap_cmd_upindex (void);
static int x=0;
static int y=-Y_JUMP;
int main ()
{
Init();
if (IAP_CMD==IAP_CMD_SELECT)
{
iap_cmd_select();
}
else if (IAP_CMD==IAP_CMD_UPDATA)
{
iap_cmd_updata ();
}
else if (IAP_CMD==IAP_CMD_UPINDEX)
{
iap_cmd_upindex();
}
IAP_CMD=IAP_CMD_NONE;
jump_app();
while (1);
}
//---------------------------------------------------------------
//--------------------LCD显示相关--------------------------------
static const unsigned char g_asc2_1608[95][16]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x18,0x18,0x00,0x00},/*"!",1*/
{0x00,0x12,0x36,0x24,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x00,0x00,0x00,0x24,0x24,0x24,0xFE,0x48,0x48,0x48,0xFE,0x48,0x48,0x48,0x00,0x00},/*"#",3*/
{0x00,0x00,0x10,0x38,0x54,0x54,0x50,0x30,0x18,0x14,0x14,0x54,0x54,0x38,0x10,0x10},/*"$",4*/
{0x00,0x00,0x00,0x44,0xA4,0xA8,0xA8,0xA8,0x54,0x1A,0x2A,0x2A,0x2A,0x44,0x00,0x00},/*"%",5*/
{0x00,0x00,0x00,0x30,0x48,0x48,0x48,0x50,0x6E,0xA4,0x94,0x88,0x89,0x76,0x00,0x00},/*"&",6*/
{0x00,0x60,0x60,0x20,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x02,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x04,0x02,0x00},/*"(",8*/
{0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40,0x00},/*")",9*/
{0x00,0x00,0x00,0x00,0x10,0x10,0xD6,0x38,0x38,0xD6,0x10,0x10,0x00,0x00,0x00,0x00},/*"*",10*/
{0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0x10,0x00,0x00,0x00},/*"+",11*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x20,0xC0},/*",",12*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00},/*".",14*/
{0x00,0x00,0x01,0x02,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00},/*"/",15*/
{0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00},/*"0",16*/
{0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00},/*"1",17*/
{0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00},/*"2",18*/
{0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00},/*"3",19*/
{0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00},/*"4",20*/
{0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00},/*"5",21*/
{0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00},/*"6",22*/
{0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00},/*"7",23*/
{0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00},/*"8",24*/
{0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00,0x00},/*"9",25*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x20},/*";",27*/
{0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00},/*"<",28*/
{0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00},/*"=",29*/
{0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x40,0x00,0x00},/*">",30*/
{0x00,0x00,0x00,0x3C,0x42,0x42,0x62,0x02,0x04,0x08,0x08,0x00,0x18,0x18,0x00,0x00},/*"?",31*/
{0x00,0x00,0x00,0x38,0x44,0x5A,0xAA,0xAA,0xAA,0xAA,0xB4,0x42,0x44,0x38,0x00,0x00},/*"@",32*/
{0x00,0x00,0x00,0x10,0x10,0x18,0x28,0x28,0x24,0x3C,0x44,0x42,0x42,0xE7,0x00,0x00},/*"A",33*/
{0x00,0x00,0x00,0xF8,0x44,0x44,0x44,0x78,0x44,0x42,0x42,0x42,0x44,0xF8,0x00,0x00},/*"B",34*/
{0x00,0x00,0x00,0x3E,0x42,0x42,0x80,0x80,0x80,0x80,0x80,0x42,0x44,0x38,0x00,0x00},/*"C",35*/
{0x00,0x00,0x00,0xF8,0x44,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x44,0xF8,0x00,0x00},/*"D",36*/
{0x00,0x00,0x00,0xFC,0x42,0x48,0x48,0x78,0x48,0x48,0x40,0x42,0x42,0xFC,0x00,0x00},/*"E",37*/
{0x00,0x00,0x00,0xFC,0x42,0x48,0x48,0x78,0x48,0x48,0x40,0x40,0x40,0xE0,0x00,0x00},/*"F",38*/
{0x00,0x00,0x00,0x3C,0x44,0x44,0x80,0x80,0x80,0x8E,0x84,0x44,0x44,0x38,0x00,0x00},/*"G",39*/
{0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"H",40*/
{0x00,0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00},/*"I",41*/
{0x00,0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x88,0xF0},/*"J",42*/
{0x00,0x00,0x00,0xEE,0x44,0x48,0x50,0x70,0x50,0x48,0x48,0x44,0x44,0xEE,0x00,0x00},/*"K",43*/
{0x00,0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x42,0xFE,0x00,0x00},/*"L",44*/
{0x00,0x00,0x00,0xEE,0x6C,0x6C,0x6C,0x6C,0x54,0x54,0x54,0x54,0x54,0xD6,0x00,0x00},/*"M",45*/
{0x00,0x00,0x00,0xC7,0x62,0x62,0x52,0x52,0x4A,0x4A,0x4A,0x46,0x46,0xE2,0x00,0x00},/*"N",46*/
{0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00},/*"O",47*/
{0x00,0x00,0x00,0xFC,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40,0x40,0xE0,0x00,0x00},/*"P",48*/
{0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0xB2,0xCA,0x4C,0x38,0x06,0x00},/*"Q",49*/
{0x00,0x00,0x00,0xFC,0x42,0x42,0x42,0x7C,0x48,0x48,0x44,0x44,0x42,0xE3,0x00,0x00},/*"R",50*/
{0x00,0x00,0x00,0x3E,0x42,0x42,0x40,0x20,0x18,0x04,0x02,0x42,0x42,0x7C,0x00,0x00},/*"S",51*/
{0x00,0x00,0x00,0xFE,0x92,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00},/*"T",52*/
{0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00},/*"U",53*/
{0x00,0x00,0x00,0xE7,0x42,0x42,0x44,0x24,0x24,0x28,0x28,0x18,0x10,0x10,0x00,0x00},/*"V",54*/
{0x00,0x00,0x00,0xD6,0x92,0x92,0x92,0x92,0xAA,0xAA,0x6C,0x44,0x44,0x44,0x00,0x00},/*"W",55*/
{0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x18,0x18,0x18,0x24,0x24,0x42,0xE7,0x00,0x00},/*"X",56*/
{0x00,0x00,0x00,0xEE,0x44,0x44,0x28,0x28,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00},/*"Y",57*/
{0x00,0x00,0x00,0x7E,0x84,0x04,0x08,0x08,0x10,0x20,0x20,0x42,0x42,0xFC,0x00,0x00},/*"Z",58*/
{0x00,0x1E,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1E,0x00},/*"[",59*/
{0x00,0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x08,0x04,0x04,0x04,0x02,0x02},/*"\",60*/
{0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78,0x00},/*"]",61*/
{0x00,0x1C,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF},/*"_",63*/
{0x00,0x60,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x1E,0x22,0x42,0x42,0x3F,0x00,0x00},/*"a",65*/
{0x00,0x00,0x00,0xC0,0x40,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x64,0x58,0x00,0x00},/*"b",66*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x40,0x40,0x40,0x22,0x1C,0x00,0x00},/*"c",67*/
{0x00,0x00,0x00,0x06,0x02,0x02,0x02,0x1E,0x22,0x42,0x42,0x42,0x26,0x1B,0x00,0x00},/*"d",68*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x7E,0x40,0x40,0x42,0x3C,0x00,0x00},/*"e",69*/
{0x00,0x00,0x00,0x0F,0x11,0x10,0x10,0x7E,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00},/*"f",70*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x44,0x44,0x38,0x40,0x3C,0x42,0x42,0x3C},/*"g",71*/
{0x00,0x00,0x00,0xC0,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"h",72*/
{0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00},/*"i",73*/
{0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x1C,0x04,0x04,0x04,0x04,0x04,0x04,0x44,0x78},/*"j",74*/
{0x00,0x00,0x00,0xC0,0x40,0x40,0x40,0x4E,0x48,0x50,0x68,0x48,0x44,0xEE,0x00,0x00},/*"k",75*/
{0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00},/*"l",76*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x49,0x49,0x49,0x49,0x49,0xED,0x00,0x00},/*"m",77*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDC,0x62,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"n",78*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00},/*"o",79*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0x64,0x42,0x42,0x42,0x44,0x78,0x40,0xE0},/*"p",0*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x22,0x42,0x42,0x42,0x22,0x1E,0x02,0x07},/*"q",81*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x32,0x20,0x20,0x20,0x20,0xF8,0x00,0x00},/*"r",82*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x40,0x3C,0x02,0x42,0x7C,0x00,0x00},/*"s",83*/
{0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x10,0x10,0x10,0x0C,0x00,0x00},/*"t",84*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0x42,0x42,0x42,0x42,0x46,0x3B,0x00,0x00},/*"u",85*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x28,0x10,0x10,0x00,0x00},/*"v",86*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0x92,0x92,0xAA,0xAA,0x44,0x44,0x00,0x00},/*"w",87*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x24,0x18,0x18,0x18,0x24,0x76,0x00,0x00},/*"x",88*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x28,0x18,0x10,0x10,0xE0},/*"y",89*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x44,0x08,0x10,0x10,0x22,0x7E,0x00,0x00},/*"z",90*/
{0x00,0x03,0x04,0x04,0x04,0x04,0x04,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x00},/*"{",91*/
{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},/*"|",92*/
{0x00,0x60,0x10,0x10,0x10,0x10,0x10,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x60,0x00},/*"}",93*/
{0x30,0x4C,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/
};
static u32 drawCharAt16 (char c,int x,int y)
{
u8 buff[24*2]={0};
for(int t=0;t<16;t++) buff[t]=g_asc2_1608[c-0x20][t];
for (int j=0;j<16;j++)
{
for (int i=0;i<8;i++)
{
//只绘制无效窗口内的屏幕
LCD_DrawPointSafe (x+i,y+j,(buff[j]<<i)&0x80);
}
}
return 8;
}
//在指定位置显示字符串
static void drawCharsAt (char *txt,int x,int y)
{
if (txt==0) return;
while (*txt)
{
if ((*txt&0x80)==0)
{
x+=drawCharAt16(*txt,x,y);
txt++;
}
}
}
static void jump_app(void)
{
//定义用户程序的起始地址
void (*user_main)(void);
if(((*(vu32*)APP_ADDR)&0x2FF00000)==0x20000000) //检查栈顶地址是否合法.
{
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 128*1024);
user_main=(void (*)(void))*(vu32*)(APP_ADDR+4); //用户代码区第二个字为程序开始地址(复位地址)
__set_MSP(*(vu32*)APP_ADDR); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
user_main(); //跳转到APP.
}
else
{
//不存在程序,需要升级
IAP_CMD=IAP_CMD_SELECT;
NVIC_SystemReset();
}
}
static void Init (void)
{
Delay_Init();
USART3_Init();
LED_Init();
Usart_Config();
SDRAM_Init();
mymem_init();
sFLASH_Init();
printf ("Loading。。。\r\n");
for (int i=0;i<10;i++)
{
Delay_ms (10);
if (USART3_GetKey())
{
IAP_CMD=IAP_CMD_SELECT;
}
}
}
//根据文件大小擦除flash
static void FLASH_EraseBySize (u32 size)
{
const u16 sectors_1[]={
FLASH_Sector_5,
FLASH_Sector_6,
FLASH_Sector_7,
FLASH_Sector_8,
FLASH_Sector_9,
FLASH_Sector_10,
FLASH_Sector_11,
0
};
int bank_num=size/(128*1024);
if (size%(128*1024)) bank_num++;
//第一个bank擦除
for (int i=0;sectors_1[i];i++)
{
if (i>=bank_num) break;
FLASH_EraseSector (sectors_1[i],VoltageRange_3);//擦除电压选太高容易失败
}
//第二个bank前面的擦除
if (bank_num>=8)
{
FLASH_EraseSector (FLASH_Sector_12,VoltageRange_3);
FLASH_EraseSector (FLASH_Sector_13,VoltageRange_3);
FLASH_EraseSector (FLASH_Sector_14,VoltageRange_3);
FLASH_EraseSector (FLASH_Sector_15,VoltageRange_3);
FLASH_EraseSector (FLASH_Sector_16,VoltageRange_3);
}
const u16 sectors_2[]={
FLASH_Sector_17,
FLASH_Sector_18,
FLASH_Sector_19,
FLASH_Sector_20,
FLASH_Sector_21,
FLASH_Sector_22,
FLASH_Sector_23,
0
};
//第二个bank擦除
for (int i=0;sectors_2[i];i++)
{
if (i+8>=bank_num) break;
FLASH_EraseSector (sectors_2[i],VoltageRange_3);
}
}
//一次性写入数据
static void FLASH_WriteBySize (u8 *buff,u32 size)
{
for (u32 i=0;i<size;i++)
{
FLASH_ProgramByte (APP_ADDR+i,buff[i]);
}
}
//升级程序
static void FLASH_UpData (u8 *buff,u32 size)
{
//打标记记录这是通过IAP升级的程序文件
u32 *app=(u32 *)buff; app[7]=0x00000001;
//把rom大小记录在rom中
app[9]=size;
drawCharsAt ("FLASH Unlock ...",x,y+=Y_JUMP);
FLASH_Unlock();
drawCharsAt ("Eraseing ...",x,y+=Y_JUMP);
FLASH_EraseBySize (size);
drawCharsAt ("Programing ...",x,y+=Y_JUMP);
FLASH_WriteBySize (buff,size);
drawCharsAt ("FLASH Lock ...",x,y+=Y_JUMP);
FLASH_Lock ();
drawCharsAt ("Updata Done, Reboot Later ...",x,y+=Y_JUMP);
}
static void iap_cmd_select (void)
{
LCD_Init();
LCD_LayerInit();
drawCharsAt ("Please Select:",x,y+=Y_JUMP);
drawCharsAt ("00. Boot Now",x,y+=Y_JUMP);
drawCharsAt ("01. Updata user.app File",x,y+=Y_JUMP);
//升级flash中存放的程序
int fileNum=FLASH_GetFileNum();
char *txt=mymalloc (256);
int *indexInfo=mymalloc (sizeof(int)*fileNum);
int appIndex=0;
for (int i=0;i<fileNum;i++)
{
FLASH_FileStruct fileInfo={0};
FLASH_GetFileInfo (i,&fileInfo);
int fileNameLen=strlen(fileInfo.FileName);
if (strcmp(&fileInfo.FileName[fileNameLen-4],".app")==0)
{
sprintf (txt,"%02d. Updata %s File",2+appIndex,fileInfo.FileName);
indexInfo[appIndex]=i;//记录索引
appIndex++;
drawCharsAt (txt,x,y+=Y_JUMP);
}
}
char *staitc_txt="Your Select is:";
int my_select=0;
int select_maxNum=fileNum+2;
drawCharsAt (staitc_txt,x,y+=Y_JUMP);
while (1)
{
u8 key=USART3_GetKeyPressed ();
sprintf (txt,"%02d",my_select);
drawCharsAt (txt,x+strlen(staitc_txt)*8,y);
if (key==0x10)
{
//上键
if (my_select>0)
{
my_select--;
}
else
{
my_select=select_maxNum-1;
}
}
else if (key==0x20)
{
//下键
if (my_select<select_maxNum-1)
{
my_select++;
}
else
{
my_select=0;
}
}
else if (key==0x04)
{
//OK键
if (my_select==0)
{
break;
}
else if (my_select==1)
{
IAP_CMD=IAP_CMD_UPDATA;
NVIC_SystemReset();
}
else
{
IAP_CMD=IAP_CMD_UPINDEX;
IAP_INDEX=indexInfo[my_select-2];
NVIC_SystemReset();
}
}
}
myfree (txt);
myfree (indexInfo);
}
static void iap_cmd_updata (void)
{
LCD_Init();
LCD_LayerInit();
drawCharsAt ("Init Done ...",x,y+=Y_JUMP);
u32 app_size=0;
u32 app_exAddr=0;
u32 app_addr=0;
drawCharsAt ("Find " APP_NAME "...",x,y+=Y_JUMP);
app_exAddr =FLASH_FindFile (APP_NAME,&app_size);
//申请内存,加一个文件名的余量
int exDataLen=strlen(APP_NAME)+1;
u8 *data=mymalloc (app_size+exDataLen);
if (app_exAddr&&(FLASH_ReadFile (APP_NAME,0,data,app_size)==app_size))
{
//把文件名信息加在rom中
memcpy (&data[app_size],APP_NAME,exDataLen);
u32 *app=(u32 *)data;app[8]=APP_ADDR+app_size;
FLASH_UpData (data,app_size+exDataLen);
}
else
{
drawCharsAt ("Can't Find "APP_NAME", Reboot Later ...",x,y+=Y_JUMP);
}
myfree(data);
Delay_ms (10*1000);
}
static void iap_cmd_upindex (void)
{
//根据索引找到文件
LCD_Init();
LCD_LayerInit();
char *txt_buf=mymalloc (256);
drawCharsAt ("Init Done ...",x,y+=Y_JUMP);
u32 app_size=0;
u32 app_exAddr=0;
u32 app_addr=0;
FLASH_FileStruct file={0};
sprintf (txt_buf,"Find File By Index %d...",IAP_INDEX);
drawCharsAt (txt_buf,x,y+=Y_JUMP);
if (FLASH_GetFileInfo (IAP_INDEX,&file)==0)
{
sprintf (txt_buf,"File Name is: %s...",file.FileName);
drawCharsAt (txt_buf,x,y+=Y_JUMP);
app_exAddr=file.Address;
app_size=file.FileSize;
//申请内存,加一个文件名的余量
int exDataLen=strlen(file.FileName)+1;
u8 *data=mymalloc (app_size+exDataLen);
FLASH_ReadFile (file.FileName,0,data,app_size);
//把文件名信息加在rom中
memcpy (&data[app_size],file.FileName,exDataLen);
u32 *app=(u32 *)data;app[8]=APP_ADDR+app_size;
FLASH_UpData (data,app_size+exDataLen);
myfree(data);
}
else
{
sprintf (txt_buf,"Can't Find File By Index %d...",IAP_INDEX);
drawCharsAt (txt_buf,x,y+=Y_JUMP);
drawCharsAt ("Reboot Later ...",x,y+=Y_JUMP);
}
myfree (txt_buf);
Delay_ms (10*1000);
}
extern void LTDC_ISR_Handler(void);
// 函数:LTDC中断服务函数
// 说明在emWin_Drive.c里被调用
//
void LTDC_IRQHandler(void)
{
LTDC_ISR_Handler();
}