/* * flash.c * * Created on: 4 авг. 2021 г. * Author: Toporov */ #include "my.h" #include "flash.h" #include "stm32f4xx_hal_flash.h" #include "stm32f4xx_hal_flash_ex.h" //я хочу писать коррекцию и параметры на разных страницах. Они по 128к, это не рационально. static FLASH_EraseInitTypeDef FlashEraseInitPar; // структура для стирания параметров static FLASH_EraseInitTypeDef FlashEraseInitCor; // структура для стираия коррекции __IO extern UserData_TypeDef currentData; __IO extern uint16_t correctedKu[13]; // моя структура с коррекциями __IO uint16_t COUNT_EXT = 0; void MX_FLASH_Init(void) { __HAL_RCC_SYSCFG_CLK_ENABLE(); FlashEraseInitPar.TypeErase = FLASH_TYPEERASE_SECTORS; FlashEraseInitPar.Banks = FLASH_BANK_1; //FlashEraseInitPar.Sector = FLASH_SECTOR_4; FlashEraseInitPar.Sector = FLASH_SECTOR_7; FlashEraseInitPar.NbSectors = 1; FlashEraseInitPar.VoltageRange = FLASH_VOLTAGE_RANGE_3; FlashEraseInitCor.TypeErase = FLASH_TYPEERASE_SECTORS; FlashEraseInitCor.Banks = FLASH_BANK_1; FlashEraseInitCor.Sector = FLASH_SECTOR_6; FlashEraseInitCor.NbSectors = 1; FlashEraseInitCor.VoltageRange = FLASH_VOLTAGE_RANGE_3; rdPar(); rdCor(); } void wrPar(void) { __IO uint32_t Address, lenpar, i; __IO uint32_t *pData; uint32_t SECTORError = 0; lenpar = sizeof(UserData_TypeDef); while(lenpar % 4) { //дополняем строку до тех пор пока она не станет делится на 4 lenpar++; } lenpar >>= 2; //делим на 4 HAL_FLASH_Unlock(); //открываем память на запись if(HAL_FLASHEx_Erase(&FlashEraseInitPar, &SECTORError) == HAL_OK) // { Address = USERPAGEPAR; pData = (uint32_t *) ¤tData; for(i = 0; i < lenpar; i++) { HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, *pData++); Address += 4; } } HAL_FLASH_Lock(); } void wrCor(void) ///попробуем переписать это под мой массив { __IO uint32_t Address, lenpar, i; __IO uint32_t *pData; uint32_t SECTORError = 0; lenpar = sizeof(correctedKu); // измеряем длинну массива while(lenpar % 4) { //дополняем строку до тех пор пока она не станет делится на 4 lenpar++; } lenpar >>= 2; //делим на 4 HAL_FLASH_Unlock(); //открываем память на запись if(HAL_FLASHEx_Erase(&FlashEraseInitCor, &SECTORError) == HAL_OK) //стираем страницу по структуре { Address = USERPAGECOR; pData = (uint32_t *) &correctedKu; for(i = 0; i < lenpar; i++) { HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, *pData++); Address += 4; } } HAL_FLASH_Lock(); } void rdPar(void) { //uint8_t i; uint32_t lenpar; volatile bool rewrite = false; lenpar = sizeof(UserData_TypeDef); memcpy((void *) ¤tData, (void *) USERPAGEPAR, lenpar); //pardata.OWN = 0xffff;//todo //скоррректировать битые значения if(currentData.OWN == 0xffff) //если первая запись и везде пусто { currentData.OWN = 1; //ставим параметры по умолчанию currentData.BAUD = 5; currentData.INFB = 1; currentData.IIN = CHARGE; currentData.IFV = Hp0_2; currentData.IFN = Lp100000; currentData.IKU = Ku1; currentData.IK0 = 1; currentData.IK1 = 0; currentData.IK2 = '~'; currentData.IK3 = 0; currentData.IK4 = 0; currentData.IK5 = 0; currentData.IPZ =0; currentData.KCOND = 1.0f; currentData.SENS = 1.0f; currentData.UNIT =MS2; rewrite = true; } //////////////////// if(rewrite) { rewrite = false; wrPar(); } } void rdCor(void) { //uint8_t i; uint32_t lenpar; volatile bool rewrite = false; lenpar = sizeof(correctedKu); memcpy((void *) &correctedKu, (void *) USERPAGECOR, lenpar); //pardata.OWN = 0xffff;//todo //если значения больше 4095 то переписать на обычные 4095 /* if(currentData.OWN == 0xffff) //если первая запись и везде пусто { currentData.OWN = 1; //ставим параметры по умолчанию currentData.BAUD = 5; currentData.INFB = 1; currentData.IIN = CHARGE; currentData.IFV = Hp0_2; currentData.IFN = Lp100000; currentData.IKU = Ku1; currentData.IK0 = 1; currentData.IK1 = 0; currentData.IK2 = '~'; currentData.IK3 = 0; currentData.IK4 = 0; currentData.IK5 = 0; currentData.IPZ =0; currentData.KCOND = 1.0f; currentData.SENS = 1.0f; currentData.UNIT =MS2; rewrite = true; } //////////////////// if(rewrite) { rewrite = false; wrCor(); } */ }