/* * flash.c * * Created on: 18 мая 2021 г. * Author: Toporov */ #include "my.h" #include "main.h" #include "flash.h" #include "stm32l0xx_hal_flash.h" #include "stm32l0xx_hal_flash_ex.h" extern void FLASH_PageErase(uint32_t PageAddress); static const uint16_t FACTORY_CORR[2][20] = { { 3814, 3726, 3656, 3811, 3727, 3657, 3637, 3570, 3504, 3485, 3630, 3563, 3560, 3750, 3750, 3750, 3750, 3750, 3750, 3750 }, { 3750, 3750, 3750, 3812, 3727, 3654, 3637, 3568, 3502, 3486, 3596, 3537, 3533, 3750, 3750, 3750, 3750, 3750, 3750, 3750 } }; __IO UserData_TypeDef pardata; __IO uint16_t CorrWord[2][20]; void MX_FLASH_Init(void) { __HAL_RCC_SYSCFG_CLK_ENABLE(); rdPar(); rdCorr(); } void wrPar(void) { uint8_t i, len; uint32_t *pData, Address; len = sizeof(UserData_TypeDef); len >>= 2; HAL_FLASH_Unlock(); FLASH_PageErase(USERPAGE); CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG); CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE); FLASH_WaitForLastOperation(100); Address = USERPAGE; pData = (uint32_t *) &pardata; for(i = 0; i < len; i++) { HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, *pData++); Address += 4; } CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG); CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE); HAL_FLASH_Lock(); } void rdPar(void) { uint8_t rewrite = 0; memcpy((void *) &pardata, (void *) USERPAGE, sizeof(UserData_TypeDef)); //pardata.OWN = 0; if((pardata.OWN != MY_ADDRESS) || (pardata.OWN == 0)) { pardata.OWN = MY_ADDRESS; pardata.BAUD = 7; //115200 pardata.INFB = 0; pardata.IIN = CHARGE; pardata.IFV = Hp0_2; pardata.IFN = Lp100000; pardata.IKU = Ku1; pardata.IKE = 0; pardata.IKD = 0; pardata.IKS = 1; pardata.IPZ = 0; pardata.OPZ = 0; pardata.VAL = Accel; pardata.KCOND = 1.00001f; pardata.SENS = 1.00001f; pardata.ACCEL = 10.00001f; rewrite = 1; } if((pardata.IKE == 0) && (pardata.IKD == 0) && (pardata.IKS == 0)) { pardata.IKE = 0; pardata.IKD = 0; pardata.IKS = 1; rewrite = true; } if(pardata.SENS == 0.0f) { pardata.SENS = 1.0f; rewrite = true; } if(pardata.IFN > Lp100000) { pardata.IFN = Lp100000; rewrite = true; } if(pardata.IFV > Hp10) { pardata.IFN = Hp10; rewrite = true; } if(pardata.IKU > Ku1000) { pardata.IKU = Ku1000; rewrite = true; } if(pardata.VAL > Nython) { pardata.VAL = Accel; rewrite = true; } ///////////////////////////// if(rewrite) { rewrite = 0; wrPar(); } ///////////////////////////// } void wrCorr(void) { uint8_t i, len; uint32_t *pData, Address; len = sizeof(CorrWord); len >>= 2; HAL_FLASH_Unlock(); FLASH_PageErase(CORRPAGE); CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG); CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE); FLASH_WaitForLastOperation(100); Address = CORRPAGE; pData = (uint32_t *) &CorrWord; for(i = 0; i < len; i++) { HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, *pData++); Address += 4; } CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG); CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE); HAL_FLASH_Lock(); } void rdCorr(void) { uint8_t i, j; memcpy((void *) &CorrWord, (void *) CORRPAGE, sizeof(CorrWord)); if(((CorrWord[0][0] == 0xffff) || (CorrWord[0][1] == 0xffff)) || ((CorrWord[0][0] == 0) || (CorrWord[0][1] == 0))) { for(j = 0; j < 2; j++) { for(i = 0; i < 20; i++) { CorrWord[j][i] = FACTORY_CORR[j][i]; } } wrCorr(); } }