日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【嵌入式干货】利用二分法定位Flash存有数据(非FF)的地址

發布時間:2025/4/16 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【嵌入式干货】利用二分法定位Flash存有数据(非FF)的地址 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

最近項目中需要實現這樣的功能:設備具備溫濕度數據采集并寫入flash保存的功能;當設備復位后,還能重新開啟采集功能且將采集到的數據繼續接著寫入。問題來了,復位后,MCU會將RAM的數據清除,這樣會導致程序丟失了上次記錄溫濕度數據的最終flash地址,那么得在復位后程序能夠找到復位前記錄的flash地址(即flash中存有數據(非FF)的最后地址)。

實現

利用二分法對flash進行數據查找,用的是2M byte flash芯片P25Q16U
一、首先在PC端用C語言跑通實現代碼如下:

//二分法查找上次寫的最后一個地址 #include "stdio.h" #include "string.h" #include "stdlib.h"unsigned char *my_memory=(unsigned char*)malloc(2016384); ; char i=0;unsigned int LastSectorHeadAddress; unsigned int NextSectorStart; unsigned int NextSectorStop; unsigned char buf; unsigned int Get_Last_Sector(unsigned int Sector_start, unsigned int Sector_stop) {static unsigned char cnt=0;cnt++;if(Sector_start<0x00004000 || Sector_stop>0x001EC480)//不在尋找區域內{return -1;}LastSectorHeadAddress = (Sector_start + Sector_stop)/2;// spiFlashRead(*LastSectorHeadAddress,1,buf);buf = *((unsigned char*)(my_memory+LastSectorHeadAddress));printf("第%d次查找的數據為:%d\n",cnt,buf);if(buf == 0xFF){ NextSectorStop = LastSectorHeadAddress;NextSectorStart = Sector_start;if(Sector_stop == NextSectorStop){return Sector_start; }else{return Get_Last_Sector(NextSectorStart,NextSectorStop);}}else{ NextSectorStop = Sector_stop;NextSectorStart = LastSectorHeadAddress;if(NextSectorStart == Sector_start){return Sector_start;}else{return Get_Last_Sector(NextSectorStart,NextSectorStop);}} }int main() {unsigned int my_address;unsigned char buf;memset(my_memory,0xff,2016384); //全部初始化為FFmemset(my_memory,0x0A,16384+4001); //初始化為0Abuf = *((unsigned char*)(my_memory+99));my_address = Get_Last_Sector(16384,2016384);printf("數據的最后地址是:%d,數據為:%d,總共寫了%d個數據\n",my_address,buf,my_address-16384+1);}

二、在硬件上跑通代碼如下;

//定位上次最后一個存有數據的地址 unsigned int MidAddress; unsigned int NextAddressStart; unsigned int NextAddressStop; unsigned char buf; unsigned int Get_Last_Sector(unsigned int Sector_start, unsigned int Sector_stop) {static unsigned char cnt=0;cnt++;if(Sector_start<0x00004000 || Sector_stop>0x001EC480)//不在尋找區域內{return -1;}MidAddress = (Sector_start + Sector_stop)/2;spiFlashRead(MidAddress,1,&buf);if(buf == 0xFF){ NextAddressStop = MidAddress;NextAddressStart = Sector_start;if(Sector_stop == NextAddressStop){return Sector_start; }else{return Get_Last_Sector(NextAddressStart,NextAddressStop);}}else{ NextAddressStop = Sector_stop;NextAddressStart = MidAddress;if(NextAddressStart == Sector_start){return Sector_start;}else{return Get_Last_Sector(NextAddressStart,NextAddressStop);}} }

三、結論
經測試,在2M byte的flash中,最多只需20次便能定位到存有溫濕度數據(非FF)的最后一個字節(地址)。

總結

以上是生活随笔為你收集整理的【嵌入式干货】利用二分法定位Flash存有数据(非FF)的地址的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。