119 lines
3.4 KiB
C
119 lines
3.4 KiB
C
|
#include "main.h"
|
||
|
|
||
|
/* 升级状态 */
|
||
|
static uint32_t upgrade_status = 0;
|
||
|
/* 升级包数据大小 */
|
||
|
static uint32_t upgrade_size = 0;
|
||
|
/* 升级总包数 */
|
||
|
static uint32_t upgrade_pack_count = 0;
|
||
|
/* 升级包数据 */
|
||
|
static uint8_t upgrade_buffer[FMC_PAGE_SIZE] = {0};
|
||
|
/* FLASH 操作地址 */
|
||
|
static uint32_t flash_address = 0;
|
||
|
|
||
|
static void bsp_initialization(void);
|
||
|
static void check_upgrade_status(void);
|
||
|
|
||
|
int main(void)
|
||
|
{
|
||
|
/* 硬件初始化 */
|
||
|
bsp_initialization();
|
||
|
|
||
|
/* 检查升级状态 */
|
||
|
check_upgrade_status();
|
||
|
|
||
|
while (1)
|
||
|
;
|
||
|
}
|
||
|
|
||
|
/* 硬件初始化 */
|
||
|
static void bsp_initialization(void)
|
||
|
{
|
||
|
/* 系统滴答器初始化 */
|
||
|
system_init();
|
||
|
|
||
|
/* 定时器初始化, 触发间隔100ms */
|
||
|
timer_config(SYSTEM_TIMER_PERIPH, 100);
|
||
|
|
||
|
/* 接收指示灯 控制引脚初始化 */
|
||
|
gpio_config(LED_RX_PERIPH, LED_RX_PIN, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, RESET);
|
||
|
|
||
|
/* 发送指示灯 控制引脚 初始化 */
|
||
|
gpio_config(LED_TX_PERIPH, LED_TX_PIN, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, RESET);
|
||
|
}
|
||
|
|
||
|
/* 检查升级状态 */
|
||
|
static void check_upgrade_status(void)
|
||
|
{
|
||
|
uint8_t upgrade_info[8] = {0};
|
||
|
|
||
|
/* 获取升级信息 */
|
||
|
fmc_read_bytes(FMC_ADDRESS_UPGRADE_INFO, upgrade_info, 2);
|
||
|
|
||
|
/* 升级状态 */
|
||
|
upgrade_status = (upgrade_info[0] << 24 & 0xFF000000) | (upgrade_info[1] << 16 & 0xFF0000) | (upgrade_info[2] << 8 & 0xFF00) | (upgrade_info[3] & 0xFF);
|
||
|
|
||
|
/* 升级包大小 */
|
||
|
upgrade_size = (upgrade_info[4] << 24 & 0xFF000000) | (upgrade_info[5] << 16 & 0xFF0000) | (upgrade_info[6] << 8 & 0xFF00) | (upgrade_info[7] & 0xFF);
|
||
|
|
||
|
printf("upgrade_status %d, upgrade_size %d \r\n", upgrade_status, upgrade_size);
|
||
|
|
||
|
if (upgrade_status == 1)
|
||
|
{
|
||
|
/* 升级总包数 */
|
||
|
upgrade_pack_count = upgrade_size / FMC_PAGE_SIZE + (upgrade_size % FMC_PAGE_SIZE != 0 ? 1 : 0);
|
||
|
|
||
|
for (uint16_t i = 0; i < upgrade_pack_count; i++)
|
||
|
{
|
||
|
/* 判断本次读取数据大小 */
|
||
|
uint16_t size = 0;
|
||
|
|
||
|
/* 读到最后一包时, 读取所有数据 */
|
||
|
if (i == upgrade_pack_count - 1)
|
||
|
{
|
||
|
size = upgrade_size - i * FMC_PAGE_SIZE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* 读取flash块大小长度的数据 */
|
||
|
size = FMC_PAGE_SIZE;
|
||
|
}
|
||
|
|
||
|
/* 读取单位换算 */
|
||
|
uint16_t length = size / 4 + (size % 4 ? 1 : 0);
|
||
|
|
||
|
/* 读取 */
|
||
|
flash_address = FMC_ADDRESS_UPGRADE_BUFFER + i * FMC_PAGE_SIZE;
|
||
|
|
||
|
printf("read address: %04X, need read length: %d \r\n", flash_address, length);
|
||
|
|
||
|
uint16_t index = fmc_read_bytes(flash_address, upgrade_buffer, length);
|
||
|
|
||
|
/* 读取长度有误, 放弃升级 */
|
||
|
if (index != size && index - size >= 4)
|
||
|
{
|
||
|
printf("read length = %d, the read length is incorrect. upgrade aborted \r\n", index, size);
|
||
|
goto end;
|
||
|
}
|
||
|
|
||
|
/* 写入 */
|
||
|
flash_address = FMC_ADDRESS_APP + i * FMC_PAGE_SIZE;
|
||
|
|
||
|
printf("write address: %04X, length: %d \r\n", flash_address, length);
|
||
|
|
||
|
fmc_write_bytes(flash_address, upgrade_buffer, length);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
end:
|
||
|
/* 不管升级成功与失败, 都需要重置升级状态 */
|
||
|
fmc_write_byte(FMC_ADDRESS_UPGRADE_INFO, 0);
|
||
|
|
||
|
printf("app loading... \r\n");
|
||
|
|
||
|
/* 跳转APP */
|
||
|
iap_load_app(FMC_ADDRESS_APP);
|
||
|
|
||
|
printf("app loading failed \r\n");
|
||
|
}
|