專(zhuān)注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開(kāi)發(fā)工具、應(yīng)用測(cè)試 完善的開(kāi)發(fā)代碼案例庫(kù)分享
從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無(wú)限潛能!
提供新的芯片及解決方案,提升客戶(hù)產(chǎn)品競(jìng)爭(zhēng)力
提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動(dòng)態(tài)
專(zhuān)注單片機(jī)開(kāi)發(fā)的英銳恩科技的資深團(tuán)隊(duì)工程師總結(jié)了一些單片機(jī)開(kāi)發(fā)過(guò)程中的小技巧,分享給你們。選擇Flash工藝的單片機(jī)是為了應(yīng)對(duì)單片機(jī)開(kāi)發(fā)過(guò)程中數(shù)據(jù)的經(jīng)常更新,但是頻繁擦除超過(guò)一定次數(shù)之后,F(xiàn)lash就會(huì)失效。腫么辦?小技巧延長(zhǎng)flash工藝單片機(jī)的壽命。雖然不是真正的提升了單片機(jī)Flash的擦寫(xiě)次數(shù),但是卻延長(zhǎng)了Flash的擦寫(xiě)壽命,實(shí)現(xiàn)了需要頻繁更新數(shù)據(jù)的應(yīng)用。
在單片機(jī)開(kāi)發(fā)應(yīng)用中,工程師經(jīng)常會(huì)遇到需要在單片機(jī)內(nèi)部Flash的某個(gè)區(qū)域保存和讀取一些數(shù)據(jù),而這些數(shù)據(jù)在應(yīng)用中可能會(huì)經(jīng)常變化,因而需要對(duì)Flash的數(shù)據(jù)經(jīng)常更新。需要不斷地進(jìn)行擦寫(xiě),那么,如何才能延長(zhǎng)單片機(jī)的Flash擦寫(xiě)壽命呢?
英銳恩科技以EN Flash 工藝單片機(jī)為例,講解如何延長(zhǎng)單片機(jī)的Flash擦寫(xiě)壽命。
EN
Flash 工藝單片機(jī)具有1000 K Flash擦除次數(shù),一個(gè)Flash
Page是512字節(jié),也就是在執(zhí)行擦除指令時(shí),一次至少擦除512字節(jié)的數(shù)據(jù)。EN Flash
工藝單片機(jī)提供了Flash自編程的讀、寫(xiě)和擦除函數(shù)以及對(duì)Flash操作的參考例程。Flash支持單字節(jié)讀和寫(xiě),但是每次在更新數(shù)據(jù)之前必須要先擦除原來(lái)的數(shù)據(jù),不能在原數(shù)據(jù)基礎(chǔ)上直接寫(xiě)新數(shù)據(jù)內(nèi)容。假設(shè)每次需要更新的數(shù)據(jù)長(zhǎng)度是16個(gè)字節(jié),最簡(jiǎn)單的方法就是在每次更新數(shù)據(jù)之前執(zhí)行擦除指令,然后寫(xiě)入新數(shù)據(jù)。但是更新數(shù)據(jù)頻率比較高的應(yīng)用場(chǎng)合,這種方法顯然是不行的。此時(shí)需要采取“空間換時(shí)間”的方法了,擦寫(xiě)的次數(shù)和存儲(chǔ)數(shù)據(jù)長(zhǎng)度的大小成反比?!翱臻g換時(shí)間”就是指利用相對(duì)多的Flash空間來(lái)?yè)Q取相對(duì)多的擦寫(xiě)時(shí)間(次數(shù))。在第一次執(zhí)行擦除指令后,可以依次將數(shù)據(jù)寫(xiě)入Flash的這一頁(yè),當(dāng)寫(xiě)滿(mǎn)一頁(yè)后再進(jìn)行擦除操作。這樣的話,一頁(yè)512字節(jié)空間,每次寫(xiě)入16字節(jié)長(zhǎng)度的數(shù)據(jù),一頁(yè)就可以寫(xiě)32個(gè)數(shù)據(jù)塊,寫(xiě)滿(mǎn)后再全部擦除,而不用每次寫(xiě)數(shù)據(jù)前都擦除,該頁(yè)的擦除次數(shù)就可以提高32倍,也就是100K*32=320萬(wàn)次了。
既然思路清晰了,那么單片機(jī)軟件實(shí)現(xiàn)起來(lái)就相對(duì)比較簡(jiǎn)單。
首先需要選取數(shù)據(jù)塊中的某一字節(jié)作為地址INDEX,更新數(shù)據(jù)時(shí)第一個(gè)寫(xiě)入Flash。Flash的編程原理都是只能將1寫(xiě)為0,而不能將0寫(xiě)為1。所以在Flash編程之前,必須將對(duì)應(yīng)的頁(yè)擦除,而擦除的過(guò)程就是把所有位都寫(xiě)為1的過(guò)程,頁(yè)內(nèi)的所有字節(jié)變?yōu)?xFF。
寫(xiě)入數(shù)據(jù)實(shí)現(xiàn)過(guò)程:
每次寫(xiě)入數(shù)據(jù)時(shí),從低地址到高地址依次(以16位步進(jìn))判斷INDEX的內(nèi)容,為了防止實(shí)際數(shù)據(jù)中包含0xFF內(nèi)容,從而出現(xiàn)誤判的情況,建議判斷INDEX和INDEX+1兩個(gè)地址的內(nèi)容。如果都為0xFF,表示該地址空間未被寫(xiě)過(guò)數(shù)據(jù),寫(xiě)入需要更新的數(shù)據(jù);如果至少有一個(gè)不為0xFF,表示該地址空間已被寫(xiě)過(guò)數(shù)據(jù),繼續(xù)查詢(xún),直到查到內(nèi)容都為0xFF為止;如果所有的INDEX(32個(gè))和INDEX+1都至少有一個(gè)不為0xFF,表示該頁(yè)已經(jīng)寫(xiě)滿(mǎn),執(zhí)行擦除指令后從首地址寫(xiě)入數(shù)據(jù)。
讀取數(shù)據(jù)實(shí)現(xiàn)過(guò)程:
每次讀取數(shù)據(jù)時(shí),從高地址到低地址依次(以16為步進(jìn))判斷INDEX的內(nèi)容,這樣是為了查詢(xún)到最新的數(shù)據(jù)。同樣為了防止實(shí)際數(shù)據(jù)中包含0xFF內(nèi)容,從而出現(xiàn)誤判的情況,建議判斷INDEX和INDEX+1兩個(gè)地址的內(nèi)容。如果至少有一個(gè)不為0xFF,表示該地址已寫(xiě)過(guò)數(shù)據(jù),讀取數(shù)據(jù);如果所有的INDEX(32個(gè))和INDEX+1都為0xFF,表示該頁(yè)還未寫(xiě)入數(shù)據(jù)。
perfect,思路清晰,實(shí)例講解。
英銳恩科技資深工程團(tuán)隊(duì)為您提供免費(fèi)技術(shù)支持,低成本的8位單片機(jī),32位單片機(jī)買(mǎi)起來(lái)。