AVS/GD32F103C8T6/Bootloader/main.c
2023-10-18 17:36:51 +08:00

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