A1210/Core/Src/flash.c

222 lines
4.2 KiB
C

/*
* 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 *) &currentData;
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 *) &currentData, (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 =Accel;
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();
}
*/
}