#include "flash_general.h" FLASH_EraseInitTypeDef EraseInitStruct; extern HAL_StatusTypeDef res_hal; unsigned CRC_Update; //uint32_t PAGE_OFFSET = ((uint32_t)((4-1) * 0x0400)); uint32_t PAGE_NUMB = 127; //---------------------------------------------------------- /*-----------------BOOTLOADER FUNCTIONS-------------------*/ /* Записать в память данные, произвольного размера */ HAL_StatusTypeDef FLASH_Write_Data(uint32_t* Address, uint8_t* Data, int Data_size) { int data_cnt = 0; uint32_t adr;а uint32_t word_data; res_hal = HAL_FLASH_Unlock(); if (res_hal != HAL_OK) return res_hal; for (adr = *Address; adr < *Address + Data_size; adr = adr + 4) { word_data = ( Data[data_cnt] | Data[data_cnt + 1] << 8 | Data[data_cnt + 2] << 16 | Data[data_cnt + 3] << 24); if (adr == (0x40+USART2_IRQn*4)+MAIN_APP_START_ADDRESS) { // check if uart handler is correct if (word_data == FLASH_Read_Word(MAIN_APP_START_ADDRESS+4) + 0x1A) // if there is no specific address for uart handler { word_data = FLASH_Read_Word(UART_HANDLER_ADD); // write address of bootloader uart handler CRC_Update = 1; } } res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, adr, word_data); if (res_hal != HAL_OK) return res_hal; data_cnt += 4; } *Address += Data_size; res_hal = HAL_FLASH_Lock(); return res_hal; } /* Очистить приложение */ HAL_StatusTypeDef FLASH_Erase_App(void) // { uint32_t PageError = 0x00; res_hal = HAL_FLASH_Unlock(); if (res_hal != HAL_OK) { __ASM(""); return res_hal; } EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;// erase pages EraseInitStruct.Banks = FLASH_BANK_1; EraseInitStruct.Sector = KEY_FLASH_SECTOR_X+1; //first sector for erase EraseInitStruct.NbSectors = 8;// num of sector that need to be erased res_hal = HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); if (res_hal != HAL_OK) { __ASM(""); return res_hal; } res_hal = HAL_FLASH_Lock(); return res_hal; } /* Записать ключ в память */ void SetKey(void) { HAL_FLASH_Unlock(); HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, BOOTLOADER_KEY_SECTOR_ADR, BL_KEY_APP_WRITTEN); HAL_FLASH_Lock(); } /* Считать ключ из памяти */ uint32_t ReadKey(void) { return (*(__IO uint32_t*)BOOTLOADER_KEY_SECTOR_ADR); } /* Очистить настройки бутлоадера для запуска приложения (CRC) */ void ResetAppSettings(void) { HAL_FLASH_Unlock(); uint32_t PageError = 0x00; EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;// erase pages EraseInitStruct.Banks = APP_SET_FLASH_BANK_X; EraseInitStruct.Sector = APP_SET_FLASH_SECTOR_X; //address EraseInitStruct.NbSectors = 1;// num of erased pages HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); HAL_FLASH_Lock(); } /* Очистить сектор с ключом (ключ, количество перезагрузок из-за WDGT) */ void ResetKeySector(void) { HAL_FLASH_Unlock(); uint32_t PageError = 0x00; EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;// erase pages EraseInitStruct.Banks = KEY_FLASH_BANK_X; EraseInitStruct.Sector = KEY_FLASH_SECTOR_X; //address EraseInitStruct.NbSectors = 1;// num of erased pages HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); HAL_FLASH_Lock(); } /*-----------------BOOTLOADER FUNCTIONS-------------------*/ //---------------------------------------------------------- //-----------------ELEMENTARY FUNCTIONS--------------------- /* functions for reading bytes/halswords/words */ uint8_t FLASH_Read_Byte(uint32_t add) { return (*(__IO uint8_t*)(add)); } uint16_t FLASH_Read_HalfWord(uint32_t add) { return (*(__IO uint16_t*)(add)); } uint32_t FLASH_Read_Word(uint32_t add) { return (*(__IO uint32_t*)(add)); } /* functions for writing bytes/halswords/words */ HAL_StatusTypeDef FLASH_Write_Byte(uint32_t Address, uint8_t Data) { res_hal = HAL_FLASH_Unlock(); if (res_hal != HAL_OK) return res_hal; res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, Address, (uint8_t)(Data)); if (res_hal != HAL_OK) return res_hal; res_hal = HAL_FLASH_Lock(); return res_hal; } HAL_StatusTypeDef FLASH_Write_HalfWord(uint32_t Address, uint16_t Data) { res_hal = HAL_FLASH_Unlock(); if (res_hal != HAL_OK) return res_hal; res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Address, (uint16_t)(Data)); if (res_hal != HAL_OK) return res_hal; res_hal = HAL_FLASH_Lock(); return res_hal; } HAL_StatusTypeDef FLASH_Write_Word(uint32_t Address, uint32_t Data) { res_hal = HAL_FLASH_Unlock(); if (res_hal != HAL_OK) return res_hal; res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, (uint32_t)(Data)); if (res_hal != HAL_OK) return res_hal; res_hal = HAL_FLASH_Lock(); return res_hal; } //----------------------------------------------------------