嵌入式C語言STM32在FLASH中讀取寫入資料

2021-10-25 07:06:07 字數 3805 閱讀 4855

向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的代名詞了,現在很多人甚至說微控制器...