因为需要掉电存储的数据很少,所以采用HT32F52352内部Flash进行掉电存储。使用到的是ht32f5xxxxflash.c和ht32f5xxxx_flash.h这两个库函数内容,以下示范的是简单的删除页、写入和读取数据。
主要使用的是以下两个接口
/*********************************************************************************************************//**
* @brief Erase a specific FLASH page.
* @param PageAddress: Address of the erased page.
* @retval FLASH_State
* - \ref FLASH_COMPLETE
* - \ref FLASH_TIME_OUT
* - \ref FLASH_ERR_WRITE_PROTECTED
* - \ref FLASH_ERR_ADDR_OUT_OF_RANGE
* @note HSI must keep turn on when doing the Flash operation (Erase/Program).
************************************************************************************************************/
FLASH_State FLASH_ErasePage(u32 PageAddress)
{
/* Check the parameters */
Assert_Param(IS_FLASH_ADDRESS(PageAddress));
HT_FLASH->TADR = PageAddress;
HT_FLASH->OCMR = FLASH_CMD_PAGEERASE;
return FLASH_WaitForOperationEnd();
}
/*********************************************************************************************************//**
* @brief Program one word data.
* @param Address: The specific FLASH address to be programmed.
* @param Data: The specific FLASH data to be programmed.
* @retval FLASH_State
* - \ref FLASH_COMPLETE
* - \ref FLASH_TIME_OUT
* - \ref FLASH_ERR_WRITE_PROTECTED
* - \ref FLASH_ERR_ADDR_OUT_OF_RANGE
* @note HSI must keep turn on when doing the Flash operation (Erase/Program).
************************************************************************************************************/
FLASH_State FLASH_ProgramWordData(u32 Address, u32 Data)
{
/* Check the parameters */
Assert_Param(IS_FLASH_ADDRESS(Address));
HT_FLASH->TADR = Address;
HT_FLASH->WRDR = Data;
HT_FLASH->OCMR = FLASH_CMD_PROGRAM;
return FLASH_WaitForOperationEnd();
}
然后将以下代码复制到主函数,修改成自己的串口打印就可以运行测试
#define FLASH_ReadWordData(addr) (*((u32 volatile *) (addr))) //读取数据的宏定义
#define StartAddress (1024 * 100)//起始地址必须是1024的倍数 最大1024*128
int main()
{
u32 readdata1;
u32 readdata2;
char rdata[40];
Bsp_Debug_Config();
FLASH_ErasePage(StartAddress);//擦除page,需先擦除再写入
FLASH_ProgramWordData(StartAddress,12345);//在StartAddress写入12345
FLASH_ProgramWordData(StartAddress+4,67890);//在StartAddress偏移四个4字节写入67890
readdata1=FLASH_ReadWordData(StartAddress);//在StartAddress读取数据
readdata2=FLASH_ReadWordData(StartAddress+4);//在StartAddress偏移四个4字节读取数据
sprintf(rdata,"num1:%d,num2:%d",readdata1,readdata2);//将读取的数据合并
Bsp_Debug_Printf("%s",rdata);//串口打印
while(1)
{
}
}
后续移植了easy flash可前往下一篇文章查看【合泰杯】HT32F52352的Flash移植easyflash(HT32F52367通用)-优快云博客