17-3-华大单片机HC32F460系列flash存储方案
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/单片机知识点总结/directory.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
说明
因为用到了HC32F460系列的单片机的flash存储数据,所以写了这套程序.
目的是为了在便于存储.
关于407的Flash
写数据时最小写的单位是 4字节
擦除的时候,最小擦除的单位是1个扇区(8KB)
读取数据的时候最大读取的位宽是128位(16字节)
关于提供的基本的flash操作函数
1.读取
2.擦除
3.写入
关于本节封装的Flash写读函数思路
1.使用其中一个扇区存储数据,假设使用11扇区,准备一个固定大小(假设是512)的u32类型的数组用来存储数据
记住一句话:只要擦除过了的地方,不需要再次擦除就可以写入数据
在下载程序的时候.默认所有的flash都是已经擦除过的.
2.第一次存储
把整个数组全部写到扇区的最前面
3.第二次存储(不需要擦除,直接写入就可以,因为后面都已经擦除过了)
把整个数组紧接着写到后面
4.第三次存储(不需要擦除,直接写入就可以,因为后面都已经擦除过了)
把整个数组紧接着写到后面
5.假设写到最后了
我后面空了一点是因为定义的数组大小不一样,不一定正好占满.
6.接着再写
检测不够了以后,擦除下这个扇区,把数据从头开始存储.
源码使用
1.我先说一下flash_helper 的使用
2.提示:存储数据的时候是把数据放到这个数组里面
3.使用flash_helper存储数据
//初始化flash存储 //同时把先前存储的数据读取出来放到 flash_helper_struct.FlashHelperData数组里面 flash_helper_init(32*FLASH_SECTOR_SIZE);//使用第32个扇区存储 //设置存储的数据 flash_helper_struct.FlashHelperData[0]=12345; flash_helper_struct.FlashHelperData[1]=6666; //调用函数把数组数据存储到flash flash_helper_update();
4.读取存储的数据(直接从数组获取) 推荐
因为数组里面的值就是存储在flash里面的,所以数组里面的值就是存储在flash里面的值
flash_helper_struct.FlashHelperData[0] flash_helper_struct.FlashHelperData[1]
5.读取存储的数据(从flash里面获取)
这个函数一般用于查看下存储的对不对, 不过需要是调用完flash_helper_update函数以后, 然后接着使用
例如,获取刚刚数组的第一位存储在flash里面的值
uint32_t data; flash_helper_get(0,&data,1); printf("get0=%d\r\n",data);
例如,获取多个(下面的例子是获取前两位)
推荐使用方式(新建一个falsh_data文件)
1.存储数据如果一个u32就存储一个数据显得有些浪费,咱们应该使用共用体来操作一下
2.然后举个例子(让一个u32可以存储多个数据)
3.如果存储字符串
假设这个字符串最大不到1024字节, 咱可以先建一个1024的数组,然后
移植使用
把下面的文件放到自己的工程里面即可
结语
代码写多了呢其实写的是思路和思想,当然好的思路和思想需要建立在雄厚的底子之上