200 lines
3.3 KiB
C
200 lines
3.3 KiB
C
/*
|
|
* 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();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|