由于STM32G0只能按照64位的方式写入flash,所以有时候需要保存8位或者16位的数组就不是很方便,所以我做了一个将8位或者16位的数组先拼接成64位再写入flash的函数。
我在将数据写入flash时习惯将数据取反写入,读出数据的时候也是取反读。如果不需要取反读写,那么将操作flash的函数中的取反符号删除即可。我这样做的原因是,新的单片机在默认的状态下flash里面的值全为0xFF。做产品时会利用flash来保存产品的参数,我希望产品生产完成后从flash中读到的默认参数全为0,所以我采用取反读的方式,这样读到的默认参数就全为0了,因此我在存数据的时候也得采用取反存的方式。
bk_flash.c文件
#include "bk_flash.h"
/*-----------------------------------------------------------------------------------------
函数名称:bk_falsh_GetPage
接口: addr flash的地址
说明:
通过flash的地址获取地址所在的页
部分单片机没有Bank 2,需要根据手册自行修改函数
-----------------------------------------------------------------------------------------*/
static uint32_t bk_falsh_GetPage(uint32_t addr)
{
uint32_t page = 0;
if (addr < (FLASH_BASE + FLASH_BANK_SIZE))
{
/* Bank 1 */
page = (addr - FLASH_BASE) / FLASH_PAGE_SIZE;
}
else
{
/* Bank 2 */
page = (addr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE;
}
return page;
}
/*-----------------------------------------------------------------------------------------
函数名称:bk_falsh_GetBank
接口: addr flash的地址
说明:
通过flash的地址获取地址所在的flash区域
部分单片机没有Bank 2,需要根据手册自行修改函数
-----------------------------------------------------------------------------------------*/
static uint32_t bk_falsh_GetBank(uint32_t addr)
{
// 单片机没有 Bank 2
return FLASH_BANK_1;
// 单片机有 Bank 2
// if (Addr < (FLASH_BASE + FLASH_BANK_SIZE))
// {
// /* Bank 1 */
// return FLASH_BANK_1;
// }
// else
// {
// /* Bank 2 */
// return FLASH_BANK_2;
// }
}
/*--------------------------------------------------