STM32G0 按照8位16位的方式写入flash HAL库

由于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;
//  }	 
}

/*--------------------------------------------------
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32G0系列单片机可以使用HAL库提供的函数来将变量写入Flash中。 以下是一个示例代码,将一个16的整数写入Flash中: ```c #include "stm32g0xx_hal.h" #define FLASH_USER_START_ADDR ADDR_FLASH_PAGE_31 // 定义 Flash 起始地址,这里选择了倒数第二个扇区 #define FLASH_USER_END_ADDR ADDR_FLASH_PAGE_31 + FLASH_PAGE_SIZE - 1 // 定义 Flash 结束地址 uint16_t data = 1234; // 要写入 Flash 的数据 // 函数声明 void WriteToFlash(uint32_t address, uint16_t data); int main(void) { HAL_Init(); // 写入数据到 Flash WriteToFlash(FLASH_USER_START_ADDR, data); while (1) { // 程序执行其他任务 } } // 将数据写入 Flash void WriteToFlash(uint32_t address, uint16_t data) { HAL_StatusTypeDef status = HAL_OK; uint32_t pageError = 0; // 擦除 Flash 扇区 FLASH_EraseInitTypeDef eraseInitStruct; eraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; eraseInitStruct.PageAddress = FLASH_USER_START_ADDR; eraseInitStruct.NbPages = 1; status = HAL_FLASHEx_Erase(&eraseInitStruct, &pageError); if (status != HAL_OK) { // 发生错误,处理错误 return; } // 写入数据到 Flash status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, address, data); if (status != HAL_OK) { // 发生错误,处理错误 return; } } ``` 在这个示例代码中,我们首先定义了要写入 Flash 的数据 `data`,然后调用 `WriteToFlash()` 函数将数据写入 Flash。该函数首先使用HAL库提供的 `HAL_FLASHEx_Erase()` 函数擦除 Flash 扇区,然后使用 `HAL_FLASH_Program()` 函数将数据写入 Flash。在写入数据之前,我们需要定义要写入Flash 起始地址,并且要确保不会写入到 Bootloader 或其他重要数据的置。此外,还需要注意的是,STM32G0系列单片机的Flash只能写入半字(16),因此在这个示例中,我们使用 `FLASH_TYPEPROGRAM_HALFWORD` 来指定写入半字。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专业业余临时工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值