向flash中寫入資料的主體思想就是先解鎖,然後清標誌位,然後找到要寫入的位址,然後改變標誌準備寫入,然後在按已有的函式按位址一位元組一位元組的寫入,最後要將flash上鎖
1.寫入函式**如下:
int32_t flash_writedata
(uint32_t address, uint8_t *data, uint32_t len)
//向flash中寫入資料
/* 切換到下一扇區 */
if(startsector == flash_sector_11)
else
}while
(startsector < endsector)
;flash_clearflag
(flash_flag_eop | flash_flag_operr | flash_flag_wrperr |
flash_flag_pgaerr | flash_flag_pgperr|flash_flag_pgserr)
;for
(i =
0;i < len;i++
)flash_lock()
;}return0;
}
這其中的flash_programbyt,flash_unlock,flash_lock函式已經在標頭檔案中包含,傳入的資料分別是想要寫入的位址,想要寫入的資料,還有寫入資料的長度,所以提前給出想要寫入的位址例如0x8000000
如果沒有查詢碟符的函式也可以參考如下函式給出
uint32_t flash_getsector
(uint32_t address)
elseif(
(address < addr_flash_sector_2)
&&(address >= addr_flash_sector_1)
)elseif(
(address < addr_flash_sector_3)
&&(address >= addr_flash_sector_2)
)elseif(
(address < addr_flash_sector_4)
&&(address >= addr_flash_sector_3)
)elseif(
(address < addr_flash_sector_5)
&&(address >= addr_flash_sector_4)
)elseif(
(address < addr_flash_sector_6)
&&(address >= addr_flash_sector_5)
)elseif(
(address < addr_flash_sector_7)
&&(address >= addr_flash_sector_6)
)elseif(
(address < addr_flash_sector_8)
&&(address >= addr_flash_sector_7)
)elseif(
(address < addr_flash_sector_9)
&&(address >= addr_flash_sector_8)
)elseif(
(address < addr_flash_sector_10)
&&(address >= addr_flash_sector_9)
)elseif(
(address < addr_flash_sector_11)
&&(address >= addr_flash_sector_10)
)elseif(
(address < addr_flash_sector_12)
&&(address >= addr_flash_sector_11)
)elseif(
(address < addr_flash_sector_13)
&&(address >= addr_flash_sector_12)
)elseif(
(address < addr_flash_sector_14)
&&(address >= addr_flash_sector_13)
)elseif(
(address < addr_flash_sector_15)
&&(address >= addr_flash_sector_14)
)elseif(
(address < addr_flash_sector_16)
&&(address >= addr_flash_sector_15)
)elseif(
(address < addr_flash_sector_17)
&&(address >= addr_flash_sector_16)
)elseif(
(address < addr_flash_sector_18)
&&(address >= addr_flash_sector_17)
)elseif(
(address < addr_flash_sector_19)
&&(address >= addr_flash_sector_18)
)elseif(
(address < addr_flash_sector_20)
&&(address >= addr_flash_sector_19)
)elseif(
(address < addr_flash_sector_21)
&&(address >= addr_flash_sector_20)
)elseif(
(address < addr_flash_sector_22)
&&(address >= addr_flash_sector_21)
)elseif(
(address < addr_flash_sector_23)
&&(address >= addr_flash_sector_22)
)else
if(address >= addr_flash_sector_23)
return sector;
}
到此寫入的函式主題就以大體完成,我們可以像這樣呼叫此函式
char test=
"想要寫入的內容,例如:測試"
;int len =
sizeof
(test)
;flash_writedata
(addr,
(uint8_t *
)iapid, len)
;
注意位址一定要給出,我這裡使用的巨集定義
#define addr 0x8000000
到此,我們就可以在位址為0x8000000的地方寫入測試的內容
接下來我們來寫乙個讀取指定位址,指定長度的函式來將我們寫入的東西在別的地方呼叫出來
void
readdata
(uint32_t readaddress, uint16_t *dest_data, uint32_t num)
}
讀取函式相對簡單,簡單理解就是把指定位址位置上的資料分別覆在我們的指標上,然後讀出,這裡我們要將讀取的位址和長度傳入函式,然後函式會將讀取出來的資料內容傳出
readdata
(iapid_address,
(uint16_t *
)date, len)
在使用時也比較簡單,直接給到位址,sizeof一下想要的長度,就可以讀取出資料了。 嵌入式之STM32系列筆記
一 微控制器程式構架設計 用微控制器開發專案,當 開發到一定的程度後,由於涉及到的源程式檔案與標頭檔案眾多,若在前期為程式設計好架構,則在一定程度上便於程式的維護與管理,更有利於理清思路,加快專案的開發。通常將程式架構設定為四層,如下圖 其中middleware可以沒有,如果沒有外部擴充套件件,如外...
Stm32嵌入式電子相簿簡易實現
kevinten10 stm32 lifecat 基於stm32晶元進行開發,採用480 320解析度內建視訊記憶體模組的lcd顯示屏模組,使用stm32晶元內建的fsmc模擬8080介面時序從而驅動lcd。通過fatfs檔案系統進行sd儲存空間的管理。1 通過fatfs方式讀取fat32格式sd卡...
學STM32還是學嵌入式linux
01 話 題 經常有大學生同學糾結 我到底是學stm32還是學嵌入式linux。這個問題很多人都會有自己的看法,今天我試著從多個角度,把我了解到的事實講一下,希望對大家有所啟發。02 stm32確實好 首先得承認stm32確實好,好到stm32都成了微控制器mcu的代名詞了,現在很多人甚至說微控制器...