1. 程式人生 > >stm32f10x系列flash操作:看似簡單卻也不簡單

stm32f10x系列flash操作:看似簡單卻也不簡單

        話說小編前幾天還在玩IAP,由於工作需要,小編要在flash中開闢一段儲存區來儲存幾個變數的值。當時小編就一聲冷笑,呵,我都手握官方flash操作的庫,不就是呼叫一下flash_read()和flash_write()嗎,這有什麼難的,然而。。。。現實總是殘忍的,小編花了好大一番功夫才成功在重刷程式後依然能夠讀取到flash的值,在此記錄,望各位童鞋能夠不走彎路。

        首先要從flash寫入與讀取的地址出發,小編一開始可是很理想化的,我就要把資料存入0x08xxxxxx這個地址(這邊這個0x08xxxxxx小編是知道要在所下載的工程檔案大小之後的,也就是你的程式碼區不能與你想存入的地址重複

),好,開始呼叫函式,把我的資料寫入0808xxxxxx,再讀取出來,看看是否為我存入的地址,然後一執行。。直接卡死,上網一查,才發現,原來stm32f10x的flash都是分頁的,根據微控制器容量的大小每頁的大小也是有不同的,而且每次操作一定要對整頁操作。這倒是提醒了我,馬上把寫入的地址改成整數倍的每頁大小,還真的可以讀取到我想要的資訊。由於我寫入和讀取時在一個工程裡,我馬上新建了一個工程,只有讀取操作,一刷進去,懵逼了,我讀取出來的資訊全變成了0xFF,這是怎麼回事。再下載那個含有讀寫功能的工程,又是正常的。經過嘗試,我直接通過定址方式獲取了寫入區的資訊,這下發現資料確確實實是寫進去了,那為什麼後來沒有了呢,只有一種可能,在重新整理程式的時候把存入的內容刷掉了。可明明我的程式大小全寫入也寫不到存變數的資料區啊。一開始我懷疑是以下的設定出了問題:IROM1區的size。

可是當小編不管是將size改成小於0x08xxxxxx還是大於它,所遇到的情況還是程式重新整理後內容不復存在。進過大量時間的搜尋,終於在網上看到了一點希望的曙光,請看以下這幅圖:

在我們選中晶片的時候,其右下角會出現art、ize兩個內容,前一個是起始寫入flash的地址,後一個是flash的大小,通過設定ize引數可以設定下載程式時flash擦除的大小。這個剛剛可以解決flash覆蓋的問題。然而小編還是沒成功,最後根據對比,終於發現這張圖左上角還有一個Erase Sector,而小編一開始的是Erase Full C,至此,所有問題終於解決,看似簡單的flash還是有很多值得回味的地方,雖然小編寫文章的時候感覺沒什麼太多的內容,但一路自己摸索過來還是花了點精力的。flash操作讓我聯想到IAP的APP程式,我們是不是可以設定Flash DownLoad的內容來直接下載APP程式呢?這個值得嘗試哦!