40 lines
990 B
C
40 lines
990 B
C
#include "flash.h"
|
|
#include "main.h"
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
#define FLASH_BASE_ADDR 0x08000000UL
|
|
// #define FLASH_PAGE_SIZE 0x800 // 2KB
|
|
#define FLASH_PAGE_NUM 128
|
|
#define FLASH_USER_PAGE (FLASH_PAGE_NUM - 1)
|
|
#define FLASH_USER_ADDR (FLASH_BASE_ADDR + FLASH_USER_PAGE * FLASH_PAGE_SIZE)
|
|
|
|
FlashConfig_t currentCfg;
|
|
FlashConfig_t *Flash_ReadConfig(void)
|
|
{
|
|
memcpy(¤tCfg, (void *)FLASH_USER_ADDR, sizeof(currentCfg));
|
|
return ¤tCfg;
|
|
}
|
|
|
|
void Flash_WriteConfig(FlashConfig_t *cfg)
|
|
{
|
|
HAL_FLASH_Unlock();
|
|
|
|
FLASH_EraseInitTypeDef erase;
|
|
uint32_t page_error;
|
|
|
|
erase.TypeErase = FLASH_TYPEERASE_PAGES;
|
|
erase.Page = FLASH_USER_PAGE;
|
|
erase.NbPages = 1;
|
|
|
|
HAL_FLASHEx_Erase(&erase, &page_error);
|
|
|
|
uint32_t addr = FLASH_USER_ADDR;
|
|
uint64_t data = ((uint64_t)cfg->crc << 16) | cfg->can_id;
|
|
|
|
HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, data);
|
|
|
|
HAL_FLASH_Lock();
|
|
}
|