| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- #include "fmc.h"
- #include "gd32e23x.h"
- #include "util.h"
- #include <stdio.h>
- #include <string.h>
- void fmc_erase_page(uint8_t page)
- {
- uint32_t p_start_addr = FMC_WRITE_LAST_START_ADDR - page * FMC_PAGE_SIZE;
- fmc_unlock();
- /* clear all pending flags */
- fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGERR);
- /* erase the flash pages */
- fmc_page_erase(p_start_addr);
- fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGERR);
- fmc_lock();
- }
- void fmc_program(uint8_t page, uint32_t *data, uint32_t data_len)
- {
- uint32_t p_start_addr = FMC_WRITE_LAST_START_ADDR - page * FMC_PAGE_SIZE;
- fmc_unlock();
- uint32_t address = p_start_addr;
- while (address < p_start_addr + FMC_PAGE_SIZE)
- {
- if (data_len <= 0)
- break;
- fmc_word_program(address, *data);
- address += 4U;
- data++;
- fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGERR);
- data_len -= 4;
- }
- fmc_lock();
- }
- int8_t fmc_load(uint8_t page, uint8_t *data, uint32_t len)
- {
- uint32_t p_start_addr = FMC_WRITE_LAST_START_ADDR - page * FMC_PAGE_SIZE;
- unsigned char *ptr = (unsigned char *)p_start_addr; // 将指针指向存储区首地址
- if (*ptr == FMC_DATA_VAILD_FLAG)
- {
- // 从Flash中读取到有效的配置数据
- memcpy(data, ptr, len);
- return 0;
- }
- return -1;
- }
- int8_t fmc_check(fmc_data_t *d, uint32_t len)
- {
- if (d->data_valid_flag == FMC_DATA_VAILD_FLAG)
- {
- return fmc_check_cdata((uint8_t *)d, len);
- }
- else
- {
- return -1;
- }
- }
- uint8_t fmc_gen_cdata(uint8_t *d, uint32_t len)
- {
- return 0;
- }
- int8_t fmc_check_cdata(uint8_t *d, uint32_t len)
- {
- return 0;
- }
|