STM32 中容量产品 FLASH读写操作

近期项目遇到了收尾问题,考虑到传感器的芯片需要进行保存校准数据,以便掉电不丢失可以继续使用,于是考虑到了将数据保存到FLASH中进行保存。

一,FLASH的操作问题(软件)

写操作:参考STM32的FLASH编程手册可知,FLASH是以页(每一页的寻址范围大小不一)为单位,并且每16位进行写入,因此若想对STM32的FLASH进行写入,应将存储BUF设为16位的数组,如果写入BUF为8位,则每次写入会浪费8位的FLASH,写入BUF为32位,则会丢失BUF中每一成员的后16位。除此之外STM32的库函数也将flash封装了32位写入,实际上就是将FLASH16位写操作连续进行两次。

读操作:对stm32的FLASH读操作只需使用指针进行访问即可,例如要读取8位地址上的数据,可以这样*(volatie uint8_t*)adder或*(__IO uint8_t*)adder。

二,FLASH的操作问题(硬件)

FLASH的每次写入时需要进行擦除,而每次进行写入与擦除时需要进行解锁,结束后需要进行上锁,因此建议自己写一个函数进行封装,例如擦除函数,先进行解锁,API擦除函数,解锁;写入函数,先解锁,API写入,解锁。

三,结构体操作问题

对FLASH的操作想必如果是数组还是比较好处理的,因为FLASH不同于其他写入操作那么灵活,FLASH只能容忍16位以及其整数倍写入,对于8位是不可以的,因此要想进行将内存对齐不一的结构体写入到FLASH中,需要进行BUF的使用:

我的思路是,将结构体通过memcpy函数,将其内部赋给一个BUF,让这个BUF再通过FLASH写操作写入到FLASH中,而这个BUF的类型是有说法的,设想,如果使用8位的BUF,那么在这个BUF中,每一位BUF成员都是8位的数据,在memcpy函数复制之后,假设一共有32byte的数据,则这些数据是每1byte传输到FLASH中的,对应了我在写操作中提到的浪费了FLASH的8位空间,写入的结果是 0x00 XX 00 XX,这样子的。而如果你使用了32位的BUF,同样的,假若你的BUF中是0x12 34 56 78 0x 78 56 34 12中这样的数据,你只能传输 56 78 78 56这两个字的前半段,会造成数据的丢失,因此,我推荐进行结构体写入FLASH中,可以尽量使用32位的数据写入,因为这样尽管可能会造成FLASH的浪费,但是可视乎与预防浪费都十分的简洁明了。只需要让BUF是32位的,便可以让FLASH 1:1的copy在内存中的数据。

而读出操作的BUF也是有说法的,倘若每8位读出一次则必须要将其放在8位的BUF中,放在16位会扩大内存的寻址单元。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值