123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #include "gd32f30x.h"
- #include "gd32_flash.h"
- #include "string.h"
- #include "FreeRTOS.h"
- #include "task.h"
- #define FMC_READ(addrx) (*(volatile uint32_t *)(uint32_t)(addrx))
- void GD32_WriteFlash(uint32_t saddr, uint32_t *wdata, uint32_t wnum);
- int save_config_params(char *params)
- {
- uint32_t paramsLen = strlen(params);
- volatile uint32_t flashDataLen = FMC_READ(FMC_WRITE_START_ADDR);
- if (paramsLen % 4 != 0)
- {
- paramsLen = (paramsLen / 4 + 1) * 4;
- }
- if (flashDataLen != paramsLen)
- {
- GD32_WriteFlash(FMC_WRITE_START_ADDR, (uint32_t *)¶msLen, 4);
- GD32_WriteFlash(FMC_WRITE_START_ADDR + 4, (uint32_t *)params, paramsLen);
- return 1;
- }
- for (int i = 1; i < paramsLen / 4; i++)
- {
- uint32_t flashWord = FMC_READ(FMC_WRITE_START_ADDR + i * 4);
- uint32_t paramsWord = *(uint32_t *)(params + (i - 1) * 4);
- vTaskDelay(100);
- if (flashWord != paramsWord)
- {
- GD32_WriteFlash(FMC_WRITE_START_ADDR + i * 4, ¶msWord, 4);
- }
- }
- }
- int read_data_from_flash(void *buffer)
- {
- uint32_t length = FMC_READ(FMC_WRITE_START_ADDR);
- vTaskDelay(100);
- if (length == 0xFFFFFFFF)
- {
- return -1;
- }
- for (uint32_t i = 0; i < length; i += 4)
- {
- *(uint32_t *)((uint8_t *)buffer + i) = FMC_READ(FMC_WRITE_START_ADDR + 4 + i);
- }
- return 0;
- }
- void GD32_EraseFlash(uint16_t start, uint16_t num)
- {
- uint16_t i;
- fmc_unlock();
- for (i = 0; i < num; i++)
- {
- fmc_page_erase((0x08000000 + start * 1024) + (1024 * i));
- }
- fmc_lock();
- }
- void GD32_WriteFlash(uint32_t saddr, uint32_t *wdata, uint32_t wnum)
- {
- fmc_unlock();
- while (wnum > 0)
- {
- fmc_word_program(saddr, *wdata);
- wnum -= 4;
- saddr += 4;
- wdata++;
- }
- fmc_lock();
- }
- void gd32_flash_test()
- {
- char *p = "hello,word/r/n";
- save_config_params(p);
- }
|