2.flash寫入多個數
3.讀取flash中儲存的數值
一、初步認識flash如果想要實現掉電儲存,首要的任務就是找到乙個地方可以存放這些資料,當這些資料發生改變的時候,把資料存放進去,並且保證上電後不會被擦除。這麼一來,等在次上電之後,通過讀取掉電前儲存的資料,實現掉電儲存功能。
可以存放資料的地方可分為在兩種片上flash和片外flash,常見的片上快閃儲存器有eeprom,片外的儲存晶元有w25q***。本篇文章使用的是直接在flash中儲存。根據不同的晶元型別,快閃儲存器的大小都是不一樣的。如下圖(其他部落格擷取來的):
主控晶元的記憶體一般可分為8塊:存放初始化程式的固化部分、資料段、**段、堆空間、棧空間等。掉電儲存資料的地方在第0塊中的某個位置(0x0800 0000 ~0x0808 0000,這個的大小對應晶元快閃儲存器大小)只要存放的資料不超出這個範圍,一切都好說。
二、flash寫入資料通過對上面的了解,大概知道了存放的位置。之後就可以向這個位置裡面為所欲為啦?當然不是。下面以stm32標準庫為例,你需要在工程裡面加入stm32f10x_flash.c檔案,這個檔案抱恨了很多對flash操作的方法,我們只需要呼叫這些方法才可以為所欲為。(膜拜驅動大佬)。
怎麼實現為所欲為呢?一般有兩種:讀和寫。
寫入:檢查狀態–>解鎖–>擦除–>寫入–>上鎖–>完事。
讀取:解鎖–>讀取–>上鎖–>完事。
/*
功能:向flash中寫入資料
返回值:
*/void
flash_writebyte
(u32 addr ,uint64_t *flashdata1,uint8_t len)
flash_lock()
;//上鎖
}
有了這個函式之後,在封裝乙個函式,把想要儲存的變數資料對應放到乙個陣列裡面,然後將整乙個陣列寫到flash中,實現最終的寫入功能。
三、讀取flash中儲存的資料通過上面的寫入函式,就可以把資料寫入到flash中了,之後找到同乙個位址,將資料讀取出來,讀取的長度和寫進去的長度一致,之後將資料存到乙個陣列當中,再將陣列的值對應賦值給儲存進來的時的變數,就可以實現讀取功能。
/*
返回值:無
*/void
read_flash
(uint32_t addr,uint8_t len)
; u8 i=0;
uint64_t rdata =0;
flash_unlock()
;//解鎖flash
for(i=
0;i)flash_lock()
;//上鎖
/*********** 重新賦值給變數 ********/
s_num = new_pararry[0]
; f_num = new_pararry[1]
; r_num = new_pararry[2]
; total = new_pararry[3]
;
i_reg = new_pararry[4]
; vl_reg = new_pararry[5]
; vh_reg = new_pararry[6]
; t_reg = new_pararry[7]
; line1 = new_pararry[8]
; line2 = new_pararry[9]
; line3 = new_pararry[10]
; line4 = new_pararry[11]
; line5 = new_pararry[12]
;}
STM32多個串列埠printf
網上講的新增printf 到程式中一般都是這樣的 簡要提一下 1.配置gpio usart,rcc 的configuration 2.勾選usb micro lib 3.在程式中新增 標頭檔案需要新增 include ifdef gnuc define putchar prototype int i...
stm32晶元休眠模式 stm32實現待機喚醒
stm32的低功耗模式有3種 1 睡眠模式 cm3核心停止,外設仍然執行 2 停機模式 所有時鐘都停止 3 待機模式 1.8v核心電源關閉 進入待機模式的方法,以及設定wk up引腳用於把stm32從待機模式喚醒的方法 一般步驟如下 1 設定sleepdeep位 scb scr的第二位 2 使能電源...
STM32儲存結構(2)
當我們在完成某乙個實驗,當我們正慶幸的時候,我們不由得產生一種不安的想法 我們是否已經少許明白其中的種種細節?尤其,當我們所有的事情都依賴於編譯環境或firmware,抑或他人的程式,而自己僅僅是copy和modify,以致using。當你還是乙個初學者的時候,或許不會太過於關注於此,但是要想提高自...