From b73a16f22fc17f3497cff87509008c24d26a84ed Mon Sep 17 00:00:00 2001 From: zhji Date: Sun, 29 Dec 2024 15:41:38 +0800 Subject: [PATCH] [feat] led blink 5hz when error in bootoader --- bootloader/main.c | 4 +--- bootloader/src/bitmap.c | 25 +++++++++++++------------ bootloader/src/config.c | 5 +++-- bootloader/src/file.c | 9 +++++---- bootloader/src/firmware.c | 5 +++-- bootloader/src/led.c | 10 ++++++++++ bootloader/src/led.h | 1 + 7 files changed, 36 insertions(+), 23 deletions(-) diff --git a/bootloader/main.c b/bootloader/main.c index 96aa20c..40cf979 100755 --- a/bootloader/main.c +++ b/bootloader/main.c @@ -31,14 +31,12 @@ void file_to_flash(void) void system_init(void) { led_init(LED1 | LED2); - led_on(LED1 | LED2); - led_delay_ms(500); led_off(LED1 | LED2); } void led_blink(void) { - for (uint32_t i=0; i<2; i++) { + for (uint32_t i=0; i<1; i++) { led_delay_ms(250); led_on(LED1 | LED2); led_delay_ms(250); diff --git a/bootloader/src/bitmap.c b/bootloader/src/bitmap.c index f2e7540..24098ae 100755 --- a/bootloader/src/bitmap.c +++ b/bootloader/src/bitmap.c @@ -1,3 +1,4 @@ +#include "led.h" #include "partition.h" #include "file.h" #include "bitmap.h" @@ -15,7 +16,7 @@ void file_write_flash_0(uint32_t flash, uint32_t len) FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR); for (i = 0; i < len / 4; i++) { if (FLASH_ProgramWord(flash + i * 4, 0) != FLASH_COMPLETE) { - while (1); + led_indicate_error(); } } FLASH_Lock(); @@ -23,7 +24,7 @@ void file_write_flash_0(uint32_t flash, uint32_t len) p_flash = (volatile uint32_t *)flash; for (i = 0; i < len / 4; i++) { if (p_flash[i] != 0) { - while (1); + led_indicate_error(); } } } @@ -39,14 +40,14 @@ void file_bitmap_update(uint32_t mask) /* first open file */ ret = f_open(&f, file_name[FILE_IDX_MAIN], FA_READ); if (ret != FR_OK) { - while (1); + led_indicate_error(); } /* second program data to flash */ idx = 0; while (1) { ret = f_read(&f, file_buffer, FILE_BUFF_SIZE, &bc); if (ret != FR_OK) { - while (1); + led_indicate_error(); } file_write_flash(ADDR_MAIN + idx * FILE_BUFF_SIZE, file_buffer, (uint32_t)bc); if ((uint32_t)bc != FILE_BUFF_SIZE) { @@ -60,14 +61,14 @@ void file_bitmap_update(uint32_t mask) /* first open file */ ret = f_open(&f, file_name[FILE_IDX_GAS1], FA_READ); if (ret != FR_OK) { - while (1); + led_indicate_error(); } /* second program data to flash */ idx = 0; while (1) { ret = f_read(&f, file_buffer, FILE_BUFF_SIZE, &bc); if (ret != FR_OK) { - while (1); + led_indicate_error(); } file_write_flash(ADDR_GAS1 + idx * FILE_BUFF_SIZE, file_buffer, (uint32_t)bc); if ((uint32_t)bc != FILE_BUFF_SIZE) { @@ -84,14 +85,14 @@ void file_bitmap_update(uint32_t mask) /* first open file */ ret = f_open(&f, file_name[FILE_IDX_GAS2], FA_READ); if (ret != FR_OK) { - while (1); + led_indicate_error(); } /* second program data to flash */ idx = 0; while (1) { ret = f_read(&f, file_buffer, FILE_BUFF_SIZE, &bc); if (ret != FR_OK) { - while (1); + led_indicate_error(); } file_write_flash(ADDR_GAS2 + idx * FILE_BUFF_SIZE, file_buffer, (uint32_t)bc); if ((uint32_t)bc != FILE_BUFF_SIZE) { @@ -108,14 +109,14 @@ void file_bitmap_update(uint32_t mask) /* first open file */ ret = f_open(&f, file_name[FILE_IDX_GAS3], FA_READ); if (ret != FR_OK) { - while (1); + led_indicate_error(); } /* second program data to flash */ idx = 0; while (1) { ret = f_read(&f, file_buffer, FILE_BUFF_SIZE, &bc); if (ret != FR_OK) { - while (1); + led_indicate_error(); } file_write_flash(ADDR_GAS3 + idx * FILE_BUFF_SIZE, file_buffer, (uint32_t)bc); if ((uint32_t)bc != FILE_BUFF_SIZE) { @@ -132,14 +133,14 @@ void file_bitmap_update(uint32_t mask) /* first open file */ ret = f_open(&f, file_name[FILE_IDX_GAS4], FA_READ); if (ret != FR_OK) { - while (1); + led_indicate_error(); } /* second program data to flash */ idx = 0; while (1) { ret = f_read(&f, file_buffer, FILE_BUFF_SIZE, &bc); if (ret != FR_OK) { - while (1); + led_indicate_error(); } file_write_flash(ADDR_GAS4 + idx * FILE_BUFF_SIZE, file_buffer, (uint32_t)bc); if ((uint32_t)bc != FILE_BUFF_SIZE) { diff --git a/bootloader/src/config.c b/bootloader/src/config.c index 5b2b182..b07b6d8 100755 --- a/bootloader/src/config.c +++ b/bootloader/src/config.c @@ -1,5 +1,6 @@ #include "stm32f4xx_flash.h" #include "partition.h" +#include "led.h" #include "file.h" #include "config.h" #include "ff.h" @@ -17,14 +18,14 @@ static void file_config_write(uint32_t addr, struct file_config_s *cfg) FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR); for (uint32_t i = 0; i < 4; i++) { if (FLASH_ProgramWord(addr + i * 4, p[i]) != FLASH_COMPLETE) { - while (1); + led_indicate_error(); } } FLASH_Lock(); p = (volatile uint32_t *)addr; if (p[0] != addr || (p[0] + p[1] + p[2]) != p[3]) { /* program flash error */ - while (1); + led_indicate_error(); } } diff --git a/bootloader/src/file.c b/bootloader/src/file.c index 3a9a1ac..d359aed 100755 --- a/bootloader/src/file.c +++ b/bootloader/src/file.c @@ -2,6 +2,7 @@ #include "file.h" #include "sdio_sd.h" #include "partition.h" +#include "led.h" #define RETRY_MAX (5) @@ -189,14 +190,14 @@ void file_secctor_erase(uint16_t sector) FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | \ FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR); if (FLASH_EraseSector(sector, VoltageRange_3) != FLASH_COMPLETE) { - while (1); + led_indicate_error(); } FLASH_Lock(); for (uint32_t i = 0; i < size; i += 4) { if (*(volatile uint32_t *)(addr + i) == 0xFFFFFFFF) { continue; } else { - while (1); + led_indicate_error(); } } } @@ -215,7 +216,7 @@ void file_write_flash(uint32_t flash, uint8_t *buff, uint32_t len) FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR); for (i = 0; i < len / 4; i++) { if (FLASH_ProgramWord(flash + i * 4, p_buff[i]) != FLASH_COMPLETE) { - while (1); + led_indicate_error(); } } FLASH_Lock(); @@ -223,7 +224,7 @@ void file_write_flash(uint32_t flash, uint8_t *buff, uint32_t len) p_flash = (volatile uint32_t *)flash; for (i = 0; i < len / 4; i++) { if (p_flash[i] != p_buff[i]) { - while (1); + led_indicate_error(); } } } diff --git a/bootloader/src/firmware.c b/bootloader/src/firmware.c index e0e99b4..7ff2474 100755 --- a/bootloader/src/firmware.c +++ b/bootloader/src/firmware.c @@ -1,6 +1,7 @@ #include "partition.h" #include "file.h" #include "firmware.h" +#include "led.h" #include "ff.h" void file_firmware_update(void) @@ -11,14 +12,14 @@ void file_firmware_update(void) ret = f_open(&f, file_name[FILE_IDX_FW], FA_READ); if (ret != FR_OK) { - while (1); + led_indicate_error(); } idx = 0; byte_cnt = 0; while (1) { ret = f_read(&f, file_buffer, FILE_BUFF_SIZE, &bc); if (ret != FR_OK) { - while (1); + led_indicate_error(); } /* check whether sector need to be erase */ if ((byte_cnt == 0) && (bc != 0)) { diff --git a/bootloader/src/led.c b/bootloader/src/led.c index 49fcf8f..e44c726 100755 --- a/bootloader/src/led.c +++ b/bootloader/src/led.c @@ -64,6 +64,16 @@ void led_delay_ms(uint16_t ms) TIM_Cmd(TIM3, DISABLE); } +void led_indicate_error(void) +{ + while (1) { + led_delay_ms(100); + led_on(LED1 | LED2); + led_delay_ms(100); + led_off(LED1 | LED2); + } +} + void led_deinit(void) { TIM_DeInit(TIM3); diff --git a/bootloader/src/led.h b/bootloader/src/led.h index c30897c..da3b607 100755 --- a/bootloader/src/led.h +++ b/bootloader/src/led.h @@ -16,6 +16,7 @@ void led_off(uint16_t led); void led_on(uint16_t led); void led_toggle(uint16_t led); void led_delay_ms(uint16_t ms); +void led_indicate_error(void); void led_deinit(void); #ifdef __cplusplus