552 lines
17 KiB
C
552 lines
17 KiB
C
#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();
|
||
}
|
||
|
||
|
||
|
||
|