#include #include "sys_hal.h" #include "sys_api.h" #include "common_config.h" #include "common.h" #include /** * @brief */ void SYS_ReadFromFlash(uint8_t *data, uint32_t size, uint32_t baseAddress) { for (uint32_t i = 0; i < size; i++) *data++ = (*(uint32_t*)baseAddress++); } /** * @brief */ void SYS_WriteToFlash(uint8_t *data, uint32_t size, uint32_t crc) { uint32_t baseAddress = SYS_SECTOR; uint32_t checkCrc = 0; bool fAlarm = 0; flash_status_type status; uint8_t *pdata = data; for (uint8_t i = 0; i < 3; i++) { fAlarm = 0; flash_unlock(); SYS_EraseFlashSector(); for (uint32_t i = 0; i < size; i++) { if ((status = flash_byte_program(baseAddress++, *pdata++)) != FLASH_OPERATE_DONE) { DBG printf("FLASH_ProgramByte error: %d\r\n", status); break; } } if ((status = flash_word_program((uint32_t)SYS_CRC_ADDRESS, crc)) != FLASH_OPERATE_DONE) { DBG printf("FLASH_ProgramWord error: %d\r\n", status); } flash_lock(); checkCrc = SYS_GetCRC((sys_settings_t *)SYS_SECTOR); // Проверяем CRC того, что было записано if (checkCrc == crc) { DBG printf("SYS write OK\r\n"); break; } else fAlarm = 1; // Авария } // Произошел сбой при записи - перезагружаемся if (fAlarm) { DBG printf("Flash write error: 1%d", (uint8_t)status);; NVIC_SystemReset(); } } /** * @brief Очистка сектора настроек * @retval */ void SYS_EraseFlashSector(void) { flash_status_type status; if ((status = flash_sector_erase(SYS_SECTOR)) != FLASH_OPERATE_DONE) { printf("SYS_EraseFlashSector error: %d\r\n", status); } }