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"
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>cmd<6D><64><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
#define IAP_CMD (*((u32 *)0x20000000))
#define IAP_INDEX (*((u32 *)0x20000004))
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>cmdȡֵ
#define IAP_CMD_UPDATA 0xff000001 //ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>user.app
#define IAP_CMD_UPINDEX 0xff000002 //<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ŵij<C5B5><C4B3><EFBFBD>
#define IAP_CMD_SELECT 0xff000003 //ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
2025-06-27 00:32:57 +08:00
#define IAP_CMD_NONE 0x00000000
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
2025-06-27 00:32:57 +08:00
#define APP_NAME "user.app"
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
2025-06-27 00:32:57 +08:00
#define APP_ADDR (0x08000000+128*1024)
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>Ծ<EFBFBD><D4BE><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
#define Y_JUMP 16
2025-07-05 19:47:28 +08:00
//<2F><>ָ<EFBFBD><D6B8>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ʾ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
2025-06-27 00:32:57 +08:00
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);
}
//---------------------------------------------------------------
2025-07-05 19:47:28 +08:00
//--------------------LCD<43><44>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>--------------------------------
2025-06-27 00:32:57 +08:00
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++)
{
2025-07-05 19:47:28 +08:00
//ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>Ļ
2025-06-27 00:32:57 +08:00
LCD_DrawPointSafe (x+i,y+j,(buff[j]<<i)&0x80);
}
}
return 8;
}
2025-07-05 19:47:28 +08:00
//<2F><>ָ<EFBFBD><D6B8>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ʾ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
2025-06-27 00:32:57 +08:00
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)
{
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
2025-06-27 00:32:57 +08:00
void (*user_main)(void);
2025-07-05 19:47:28 +08:00
if(((*(vu32*)APP_ADDR)&0x2FF00000)==0x20000000) //<2F><><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ַ<EFBFBD>Ƿ<EFBFBD><C7B7>Ϸ<EFBFBD>.
2025-06-27 00:32:57 +08:00
{
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 128*1024);
2025-07-05 19:47:28 +08:00
user_main=(void (*)(void))*(vu32*)(APP_ADDR+4); //<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ(<28><>λ<EFBFBD><CEBB>ַ)
__set_MSP(*(vu32*)APP_ADDR); //<2F><>ʼ<EFBFBD><CABC>APP<50><50>ջָ<D5BB><D6B8>(<28>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ַ)
user_main(); //<2F><>ת<EFBFBD><D7AA>APP.
2025-06-27 00:32:57 +08:00
}
else
{
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
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();
2025-07-05 19:47:28 +08:00
printf ("Loading<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n");
2025-06-27 00:32:57 +08:00
for (int i=0;i<10;i++)
{
Delay_ms (10);
if (USART3_GetKey())
{
IAP_CMD=IAP_CMD_SELECT;
}
}
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>flash
2025-06-27 00:32:57 +08:00
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++;
2025-07-05 19:47:28 +08:00
//<2F><>һ<EFBFBD><D2BB>bank<6E><6B><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
for (int i=0;sectors_1[i];i++)
{
if (i>=bank_num) break;
2025-07-05 19:47:28 +08:00
FLASH_EraseSector (sectors_1[i],VoltageRange_3);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹѡ̫<D1A1><CCAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F>ڶ<EFBFBD><DAB6><EFBFBD>bankǰ<6B><C7B0><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
2025-06-27 00:32:57 +08:00
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
};
2025-07-05 19:47:28 +08:00
//<2F>ڶ<EFBFBD><DAB6><EFBFBD>bank<6E><6B><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
for (int i=0;sectors_2[i];i++)
{
if (i+8>=bank_num) break;
FLASH_EraseSector (sectors_2[i],VoltageRange_3);
}
}
2025-07-05 19:47:28 +08:00
//һ<><D2BB><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
static void FLASH_WriteBySize (u8 *buff,u32 size)
{
for (u32 i=0;i<size;i++)
{
FLASH_ProgramByte (APP_ADDR+i,buff[i]);
}
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
static void FLASH_UpData (u8 *buff,u32 size)
{
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>IAP<41><50><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD>ļ<EFBFBD>
2025-06-27 00:32:57 +08:00
u32 *app=(u32 *)buff; app[7]=0x00000001;
2025-07-05 19:47:28 +08:00
//<2F><>rom<6F><6D>С<EFBFBD><D0A1>¼<EFBFBD><C2BC>rom<6F><6D>
2025-06-27 00:32:57 +08:00
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);
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>flash<73>д<EFBFBD><D0B4>ŵij<C5B5><C4B3><EFBFBD>
2025-06-27 00:32:57 +08:00
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);
2025-07-05 19:47:28 +08:00
indexInfo[appIndex]=i;//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
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)
{
2025-07-05 19:47:28 +08:00
//<2F>ϼ<EFBFBD>
2025-06-27 00:32:57 +08:00
if (my_select>0)
{
my_select--;
}
else
{
my_select=select_maxNum-1;
}
}
else if (key==0x20)
{
2025-07-05 19:47:28 +08:00
//<2F>¼<EFBFBD>
2025-06-27 00:32:57 +08:00
if (my_select<select_maxNum-1)
{
my_select++;
}
else
{
my_select=0;
}
}
else if (key==0x04)
{
2025-07-05 19:47:28 +08:00
//OK<4F><4B>
2025-06-27 00:32:57 +08:00
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);
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4><E6A3AC>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
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))
{
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>rom<6F><6D>
2025-06-27 00:32:57 +08:00
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)
{
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>ļ<EFBFBD>
2025-06-27 00:32:57 +08:00
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;
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4><E6A3AC>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
int exDataLen=strlen(file.FileName)+1;
u8 *data=mymalloc (app_size+exDataLen);
FLASH_ReadFile (file.FileName,0,data,app_size);
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>rom<6F><6D>
2025-06-27 00:32:57 +08:00
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);
2025-07-05 19:47:28 +08:00
// <09><><EFBFBD><EFBFBD>:LTDC<44>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ˵<><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>emWin_Drive.c<><EFBFBD><EFB1BB><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
//
void LTDC_IRQHandler(void)
{
LTDC_ISR_Handler();
}