STM32F0x HAL库学习笔记(6)片内闪存(Flash)的读写操作_stm32f0 flash读写

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

在操作Flash之前,我们都需要对Flash进行解锁,对应的,操作完Flash之后,则需要对Flash进行上锁。这里的操作包括擦除,读和写等。HAL库提供了2个API,用户可以直接调用:

HAL_StatusTypeDef HAL\_FLASH\_Unlock(void);
HAL_StatusTypeDef HAL\_FLASH\_Lock(void);

Flash 的擦除

在擦除Flash之前,我们需要确定一些参数,擦除的地址,擦除的页数等,HAL库提供了一个与之相关的结构体:

typedef struct
{
  uint32\_t TypeErase;   /\*!< TypeErase: Mass erase or page erase.
 This parameter can be a value of @ref FLASHEx\_Type\_Erase \*/
                             
  uint32\_t PageAddress; /\*!< PageAdress: Initial FLASH page address to erase when mass erase is disabled
 This parameter must be a number between Min\_Data = FLASH\_BASE and Max\_Data = FLASH\_BANK1\_END \*/
                             
  uint32\_t NbPages;     /\*!< NbPages: Number of pagess to be erased.
 This parameter must be a value between Min\_Data = 1 and Max\_Data = (max number of pages - value of initial page)\*/
                                                          
} FLASH_EraseInitTypeDef;


所以在使用擦除函数之前,我们先定义一个结构体,并初始化它:

static FLASH_EraseInitTypeDef EraseInitStruct = {
	.TypeErase = FLASH_TYPEERASE_PAGES,        //擦除类型:page擦除,即擦除整页。也可以选择擦除整片
	.PageAddress = 0x08008000,                 //擦除起始地址
	.NbPages = 1                               //擦除页数
};

初始化好结构体之后,就可以使用HAL官方提供的API进行擦除:

HAL_StatusTypeDef HAL\_FLASHEx\_Erase(FLASH_EraseInitTypeDef \*pEraseInit, uint32\_t \*PageError)

其中第一个参数为指针,我们传入我们上文初始化好的结构体,第二个参数用来存放错误信息,我们新建一个值来存储,以下是示例代码:

... ...
uint32\_t PageError = 0;
HAL\_FLASH\_Unlock();
if (HAL\_FLASHEx\_Erase(&EraseInitStruct,&PageError) == HAL_OK)
{
	printf("Erase Succeed\r\n");
}
	HAL\_FLASH\_Lock();
... ...

如果你有ST-LINK或者J-LINK此类的调试器,可以使用硬件调试,然后查看0x08000000对应扇区的值,你会发现擦除后的数据全是0xFF。

Flash 的读写操作

Flash的写操作

当我们擦除了一个扇区,该扇区就属于可以写状态,我们可以通过读Flash来确认我们写入的值,HAL库提供的写操作函数如下:

HAL_StatusTypeDef HAL\_FLASH\_Program(uint32\_t TypeProgram, uint32\_t Address, uint64\_t Data) 

其中:

- TypeProgram :写类型,只可以是半字(2个字节)或字(4个字节)
- Address     :地址
- Data        :写入的数据的值

Flash的读操作

Flash 只需要所在地址,就可以读取对应的值:

 uint32_t pValue= *(__IO uint32_t*)(addr);

以下程序写入一个值,并将整个值读取出来:

... ...
uint32\_t writeFlashData = 0x55555555;
uint32\_t addr = 0x08008000;
HAL\_FLASH\_Program(FLASH_TYPEPROGRAM_WORD,addr, writeFlashData);
printf("at address:0x%x, read value:0x%x\r\n", addr, \*(__IO uint32\_t\*)addr);
HAL\_FLASH\_Lock();
... ...

注意

由于我们经常使用Flash来存放用户程序,所以要特别注意我们读写的时候不破坏到原程序,本文因为程序很小,不可能写到0x08008000,所以直接用这个地址作为例子,在实际运行中,我们需要设计要那些区域是可以用来读写的,避免出现程序错误。

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

757)**

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值