#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"); }