STM32学习笔记-FLASH读写

     STM32的FLASH除了可以烧写如程序外,还可以供给用户做存储器,存储参数用,但是要注意的是,FLSAH的擦写次数是有限制的,10万次。

STM32F1系列单片机内核是Cortext-M3系列的,其存储器的映射是按照Cortext-M3的标准设计的,如下图。

从上图可看出最下main的512M是分配给Code 即程序存储区. 其内部分配如下图。

从上图可以看到FLASH的起始地址是:0x0800 0000 到 0x0807 FFFF ,126M的FLASH空间。STM32按页来编程擦写FLASH,如我的 STM32F103RCT6 SRAM为48KB,FLASH有256K. 分页是2Kb一页来设计的,而又的小容量的单片机是1Kb一页。

下列图片均是从芯片的参考文档(RM0008)上截图的.

可以算出127+1=128*2KB=256KB。

//flash读写代码如下 写之前要擦除一整页的数据。写入数据要传入一个32位的地址,一次写入1个16位的数据(半字)。

//u32 addr - flash地址

//u16 dat  - 写入数据

//有关STM32F103RCT6的FLASH详细情况学习,请看我的笔记。

void FLASH_Write(u32 addr, u16 dat){

FLASH_Unlock(); //解锁FLASH编程擦除控制器

FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);

FLASH_ErasePage(addr);  //写之前要先擦除页。

FLASH_ProgramHalfWord(addr,dat); //从指定也的addr地址开始写。

FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);

FLASH_Lock();

}

 

//从FLASH读取半个字

u16 FLASH_Read_HalfWord(u32 addr){

u16 data;

data = *(u16*)(addr); //从指定的地址读取数据。

return data;

}

 

有关数据存储读取的可靠性思考。一直以来,见过我司好多仪表的参数保存,都是直接一次写入到EEPROM或者FLASH中。 在设计时不考虑到,当程序正在写入参数断电时或上电抖动造成参数的存储和读取失效。这种失效后的保护机制如何设计?

拿STM32来说,如果FLASH充裕,可以将数据存储在3个页。(最好3个不连续的位置)。

1:存数据逻辑。对要写入的数据按模块或整体做校验,校验码作为存入参数的一部分,要写入FLASH。

存入第1个页,存好后,立刻读取,判断是否存好。然后依此操作存后面2页数据。

2:读数据逻辑。读取第1页数据后,做校验,看数据是否正确,如果不正确读后面2个。如果所有的页,数据都不正确,那么就使用程序原代码内值.同时产品要报出参数读取错误状态。

STM32是一款非常流行的嵌入式微控制器系列,它具有强大的性能和丰富的外设资源。在学习STM32时,掌握如何进行Flash读写是非常重要的。 Flash是一种非易失性存储器,可以用来存储程序代码和数据。在STM32中,Flash存储器通常用来存储应用程序代码。下面是一个简单的Flash读写程序的示例: 1.首先,我们需要包含适用于所使用的STM32型号的头文件。例如,对于STM32F4系列,我们需要包含"stm32f4xx.h"。 2.然后,我们需要定义一个指向Flash存储器的指针变量。例如,可以使用如下代码:`uint32_t* flash_address = (uint32_t*)0x08000000;`其中0x08000000是Flash存储器的起始地址。 3.要读取Flash存储器中的数据,我们可以通过以下代码实现:`data = *flash_address;`其中data是一个变量,用于存储读取到的数据。 4.要写入数据到Flash存储器中,我们可以通过以下代码实现:`*flash_address = data;`其中data是要写入的数据。 需要注意的是,STM32Flash存储器是有写保护机制的,因此在写入数据之前,我们需要禁用写保护。可以使用以下代码禁用写保护:`FLASH->KEYR = 0x45670123; FLASH->KEYR = 0xCDEF89AB;`然后才能进行数据写入。 另外,为了确保数据的完整性,我们可以使用CRC校验来验证Flash存储器中的程序代码的正确性。可以使用库函数来计算校验和,然后将其与预期的校验和进行比较以进行验证。 综上所述,掌握STM32Flash读写操作对于嵌入式系统的开发非常重要。上述示例代码可以帮助我们快速进行Flash读写操作,同时注意写保护和数据校验可以提高数据的安全性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值