stm32 G030F6P6 flash模拟eeprom cubeide HAL库

stm32 G030F6P6拥有32kbFlash 8kbSRAM

下述功能可实现掉电不丢失

        该芯片拥有16个扇区,每个扇区内存大小为2kb,如下图所示每个扇区地址

9373ba9b0c21497c8415963c09d379d1.pngc8c5bfeae7d940b8a02ccb5c1c728b49.png

读:读取该地址半字

/*****
 *
 * 读地址的字
 *
 * ****************************/
uint16_t MyFLASH_ReadHalfWord(uint32_t Address)//读-----0x08000000
{
	return *((__IO uint16_t *)(Address));	//使用指针访问指定地址下的数据并返回
}

写:G030只支持64位(双字节)写入

/**********
 *
 * 写数据
 * uint32_t page_address 写页面地址 第15页:((uint32_t)0x08007800)
 * uint64_t DATA_64 把两个字写到对应页数
 *
 * *********************************/
void FLASH_programword(uint32_t page_address,uint64_t DATA_64)
{
	HAL_FLASH_Unlock();
	HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, page_address, DATA_64);
	HAL_FLASH_Lock();
}

擦除:

注:尽量少擦除flash 避免擦除过多引起扇区损坏(扇区支持擦除1000次)

扇区擦除只能整页擦:整页擦出函数,需要自己定义一下结构体

HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError)
/************
 *
 * 擦除(只擦除一页)
 * BANK1
 * uint8_t Addr 0-15页 stm32G030F6P6 32K的flash  一页是2KB
 *
 * ********************************/
int FLASH_ErasePage(uint8_t Addr)//擦除页
{
      HAL_FLASH_Unlock();      // 解锁Flash
      FLASH_EraseInitTypeDef EraseInitStruct;
      uint32_t PageError=0;//擦除错误地址

        EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;//仅擦除页
        EraseInitStruct.Banks = FLASH_BANK_1;
        EraseInitStruct.Page = Addr;//注:该page为0-15页
        EraseInitStruct.NbPages = 1;//擦除一页
      if(HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
          {
              return 1;
          }
          return 0;
  HAL_FLASH_Lock();
}

上述擦除,写入,读取功能了解后开始实现掉电不丢失,可借鉴江科大视频

初始化第15页扇区、保存数据、清空flash:

uint64_t FLASH_data[2];
void store_init()
{
	//————————————查看需要写入地址是否有数据,无数据写入标志位和0————————————————————
	if( MyFLASH_ReadHalfWord( ((uint32_t)0x08007800) ) != 0x1234)
	{
		FLASH_ErasePage(15);
		FLASH_programword(FLASH_15_address,((uint64_t)0x1234123412341234));
		for(uint16_t i =4;i < 2 ; i++)
		{
			FLASH_programword(((uint32_t)0x08007800) + i*8,0x0000000000000000);//整页0
		}
	}
	//-----------上电后将地址0x08007800FLASH数据放到FLASH_data[]-----------------
	FLASH_data[0]=((uint64_t)0x1234123412341234);
	for(uint16_t i = 1; i < 2; i ++)
	{
		FLASH_data[i] = MyFLASH_ReadHalfWord( ((uint32_t)0x08007800)+ i*8 );
	}
}

void store_save()//写入数据然后调用函数进行保存
{
	FLASH_ErasePage(15);
	for(uint16_t i =0;i < 2 ; i++)//----FLASH_data[i]数据备份到FLASH中---------
		{
			FLASH_programword(((uint32_t)0x08007800) + i*8,FLASH_data[i]);
		}
}

void store_clear()
{
	for(uint16_t i =1;i < 256 ; i++)//----数据备份到闪存中---------
	{
		FLASH_data[i]=0x0000000000000000;
	}
	store_save();
}

示例:

我实现的功能是擦除最后扇区,将数据保存在第15页扇区,上电读取扇区内容再将接收到的数据保存。

store_init();//初始化所需扇区,可加形参,稍作修改
  /* USER CODE END 2 */
FLASH_data[1]=0x1234567812126789;
store_save();//保存FLASH_data[1]到flash

 

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用HAL库编写的STM32F030 FLASH模拟EEPROM代码: ```c #include "main.h" #include "stm32f0xx_hal.h" //定义存储的地址 #define EEPROM_START_ADDRESS ((uint32_t)0x08007800) /* 0x08007800 - 0x08007FFF */ //定义存储的数据结构 typedef struct { uint32_t value1; uint32_t value2; uint32_t value3; } EEPROM_DataTypeDef; //定义EEPROM数据变量 EEPROM_DataTypeDef EEPROM_Data = {0}; //定义FLASH操作变量 FLASH_EraseInitTypeDef EraseInitStruct; uint32_t PageError = 0; //定义函数原型 void EEPROM_Init(void); void EEPROM_WriteData(EEPROM_DataTypeDef *data); void EEPROM_ReadData(EEPROM_DataTypeDef *data); int main(void) { HAL_Init(); EEPROM_Init(); //写入数据 EEPROM_Data.value1 = 0xAA; EEPROM_Data.value2 = 0xBB; EEPROM_Data.value3 = 0xCC; EEPROM_WriteData(&EEPROM_Data); //读取数据 EEPROM_ReadData(&EEPROM_Data); while (1) { } } void EEPROM_Init(void) { //使能FLASH时钟 __HAL_RCC_FLASH_CLK_ENABLE(); //解锁FLASH HAL_FLASH_Unlock(); //初始化FLASH擦除结构体 EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; EraseInitStruct.PageAddress = EEPROM_START_ADDRESS; EraseInitStruct.NbPages = 1; //擦除指定FLASH页面 if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) { while (1) { } } //加锁FLASH HAL_FLASH_Lock(); } void EEPROM_WriteData(EEPROM_DataTypeDef *data) { //解锁FLASH HAL_FLASH_Unlock(); //写入数据 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, EEPROM_START_ADDRESS, data->value1) != HAL_OK) { while (1) { } } if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, EEPROM_START_ADDRESS + 4, data->value2) != HAL_OK) { while (1) { } } if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, EEPROM_START_ADDRESS + 8, data->value3) != HAL_OK) { while (1) { } } //加锁FLASH HAL_FLASH_Lock(); } void EEPROM_ReadData(EEPROM_DataTypeDef *data) { //读取数据 data->value1 = (*(__IO uint32_t *)EEPROM_START_ADDRESS); data->value2 = (*(__IO uint32_t *)(EEPROM_START_ADDRESS + 4)); data->value3 = (*(__IO uint32_t *)(EEPROM_START_ADDRESS + 8)); } ``` 这段代码实现了将一个数据结构存储在FLASH中,并可以读取出来。其中,EEPROM_Init()函数用于初始化FLASH操作,EEPROM_WriteData()函数用于将数据写入FLASHEEPROM_ReadData()函数用于从FLASH中读取数据。 需要注意的是,STM32F030的FLASH大小为64KB,其中EEPROM存储区域为2KB,地址范围为0x08007800 - 0x08007FFF。在使用前需确保该区域没有被其他程序使用。同时,在读取数据时需要将地址转换成指针并使用指针读取数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值