Fix bootloader

This commit is contained in:
Valentin Dabstep 2025-05-23 09:12:06 +03:00
parent c0c42339f1
commit 456b4a8b70
2 changed files with 11 additions and 4 deletions

View file

@ -18,11 +18,13 @@ enum {
pid_p = 1,
pid_i,
pid_d,
firmw,
foc_id,
angl,
vel
};
/* for saved in FLASH float data*/
union{
uint32_t i;
@ -33,14 +35,14 @@ union{
// Flash sectors for STM32F407
#define APP_ADDRESS 0x08008000 // Адрес основной прошивки
#define FLAG_BOOT 0x08060000 // Адрес хранения флага для обновления прошивки
// #define FLAG_BOOT 0x08060000 // Адрес хранения флага для обновления прошивки
#define UPDATE_FLAG 0xDEADBEEF // Уникальное 32-битное значение
#define BOOT_CAN_ID 0x01 // CAN ID бутлоадера
#define BOOT_CAN_END 0x02 // CAN ID завершения передачи
#define DATA_CAN_ID 0x03 // CAN ID данных
#define ACK_CAN_ID 0x05 // CAN ID подтверждения
#define MAX_FW_SIZE 0x3FFF // Макс. размер прошивки (256KB)
#define PARAM_COUNT 4 // count data in flash
#define PARAM_COUNT 5 // count data in flash
#define SECTOR_6 0x08040000 // 128KB
#define SECTOR_6_END (SECTOR_6 + 128 * 1024) // sector 6 end
// Flash keys for unlocking flash memory

View file

@ -49,6 +49,8 @@ void setup() {
// // Проверка флага обновления
// erase_sector(7);
// flash_program_word(FLAG_BOOT,0xDEADBEEF,BYTE32);
// flash_record = load_params();
// write_param(firmw,UPDATE_FLAG);
flash_record = load_params();
// write_param(addr_id,33);
// flash_record = load_params();
@ -56,7 +58,7 @@ void setup() {
мы сохраняем как флаг, так и аддрес устройства к которому будет обращатлься во
время прошивки */
if(*(volatile uint32_t*)(FLAG_BOOT) == UPDATE_FLAG) {
if(flash_record[firmw].value == UPDATE_FLAG) {
fw_update = true;
for(int i = 0; i < 5;i++){
GPIOC->ODR ^= GPIO_ODR_OD10; // Индикация обновления
@ -103,10 +105,13 @@ void process_can_message(const CAN_message_t &msg) {
case BOOT_CAN_END: // Завершение передачи
if(verify_firmware()) {
send_ack(0xAA);
erase_sector(7); // Сброс флага
HAL_Delay(500);
// erase_sector(7); // Сброс флага
write_param(firmw,0); //reset flasg
NVIC_SystemReset();
} else {
send_ack(0x55);
erase_flash_pages(); //if error
}
break;
}