【嵌入式干货】利用二分法定位Flash存有数据(非FF)的地址
生活随笔
收集整理的這篇文章主要介紹了
【嵌入式干货】利用二分法定位Flash存有数据(非FF)的地址
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言
最近項(xiàng)目中需要實(shí)現(xiàn)這樣的功能:設(shè)備具備溫濕度數(shù)據(jù)采集并寫入flash保存的功能;當(dāng)設(shè)備復(fù)位后,還能重新開啟采集功能且將采集到的數(shù)據(jù)繼續(xù)接著寫入。問題來了,復(fù)位后,MCU會將RAM的數(shù)據(jù)清除,這樣會導(dǎo)致程序丟失了上次記錄溫濕度數(shù)據(jù)的最終flash地址,那么得在復(fù)位后程序能夠找到復(fù)位前記錄的flash地址(即flash中存有數(shù)據(jù)(非FF)的最后地址)。
實(shí)現(xiàn)
利用二分法對flash進(jìn)行數(shù)據(jù)查找,用的是2M byte flash芯片P25Q16U
一、首先在PC端用C語言跑通實(shí)現(xiàn)代碼如下:
二、在硬件上跑通代碼如下;
//定位上次最后一個(gè)存有數(shù)據(jù)的地址 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)//不在尋找區(qū)域內(nèi){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);}} }三、結(jié)論
經(jīng)測試,在2M byte的flash中,最多只需20次便能定位到存有溫濕度數(shù)據(jù)(非FF)的最后一個(gè)字節(jié)(地址)。
總結(jié)
以上是生活随笔為你收集整理的【嵌入式干货】利用二分法定位Flash存有数据(非FF)的地址的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【BLE】蓝牙模块V1.0
- 下一篇: 【C language】函数指针