STM32F1系列HAL庫讀寫內部FLASH

2021-10-05 20:59:27 字數 3571 閱讀 5437

測試環境:

注:本章節**只適合stm32f1系列!

移植修改區 ///

/* flash大小:128k */

#define

stm32flash_size

0x00020000ul

/* flash起始位址 */

#define

stm32flash_base

flash_base

/* flash結束位址 */

#define

stm32flash_end

(stm32flash_base | stm32flash_size)

/* flash頁大小:1k */

#define

stm32flash_page_size

flash_page_size

/* flash總頁數 */

#define

stm32flash_page_num

(stm32flash_size / stm32flash_page_size)

/// 匯出函式宣告

void

flash_init

(void);

uint32_t

flash_read

(uint32_t address,

void

*buffer,

uint32_t size)

;uint32_t

flash_write

(uint32_t address,

const

uint16_t

*buffer,

uint32_t numtowrite)

;int

flash_erasepage

(uint32_t pageaddress,

uint32_t nbpages)

;uint32_t

flash_writenotcheck

(uint32_t address,

const

uint16_t

*buffer,

uint32_t numtowrite);#

endif

// !__flash_h

end of file

/**

* @file flash.c

* * @brief create by ankun on 2019/10/10

* */

#include

"flash.h"

#include

static

uint16_t flashbuffer[stm32flash_page_size >>1]

;/// 初始化flash

void

flash_init

(void

)/**

* 讀flash

* @param address 位址

* @param buffer 存放讀取的資料

* @param size 要讀取的資料大小,單位位元組

* @return 讀出成功的位元組數

*/uint32_t

flash_read

(uint32_t address,

void

*buffer,

uint32_t size)

while

(nread &&((

(uint32_t

)s)< stm32flash_end)

)return size - nread;

}/**

* 寫flash

* @param address 寫入起始位址,!!!要求2位元組對齊!!!

* @param buffer 待寫入的資料,!!!要求2位元組對齊!!!

* @param numtowrite 要寫入的資料量,單位:半字,!!!要求2位元組對齊!!!

* @return 實際寫入的資料量,單位:位元組

*/uint32_t

flash_write

(uint32_t address,

const

uint16_t

*buffer,

uint32_t numtowrite)

if(i < pagefre)

/* 寫回flash */

count =

flash_writenotcheck

(stm32flash_base + pagepos * stm32flash_page_size, flashbuffer, stm32flash_page_size >>1)

;if(count !=

(stm32flash_page_size >>1)

)}else

} pbuffer += pagefre;

/* 讀取位址遞增 */

address +=

(pagefre <<1)

;/* 寫入位址遞增 */

nwrite -= pagefre;

/* 更新剩餘未寫入資料量 */

pagepos++

; pageoff =0;

/* 頁內偏移位址置零 */

/* 根據剩餘量計算下次寫入資料量 */

pagefre = nwrite >=

(stm32flash_page_size >>1)

?(stm32flash_page_size >>1)

: nwrite;

}/* 加鎖flash */

hal_flash_lock()

;return

((numtowrite - nwrite)

<<1)

;}uint32_t

flash_writenotcheck

(uint32_t address,

const

uint16_t

*buffer,

uint32_t numtowrite)

return

(numtowrite - nwrite);}

intflash_erasepage

(uint32_t pageaddress,

uint32_t nbpages)

return0;

}end of file

STM32F1系列選型參考

意法半導體的stm32f1系列主流mcu滿足了工業 醫療和消費類市場的各種應用需求。憑藉該產品系列,意法半導體在全球arm cortex m核心微控制器領域處於領先地位,同時樹立了嵌入式應用歷史上的里程碑。該系列在整合一流的外設和低功耗 低電壓執行等基礎上實現了高效能,同時還以可接受的 實現了高整合...

STM32F1系列 map檔案分析

我們通過學習stm32f1知道,想要優化 就必須知道工程的rom和ram的占用情況。所以,我們就要用到.map檔案,通過分析.map檔案,可以方便檢視工程rom和ram的占用情況,包括單個原始檔甚至每個函式的rom。問 那.map到底可以分為幾個部分呢?段 section 描述映像檔案的 和資料塊。...

STM32F4與STM32F1的區別

作為cortex m3市場的最大佔有者,st公司在2011年又推出基於cortex m4核心的stm32f4系列產品,相對與stm32f1 f2等cortex m3產品,stm32f4最大的優勢,就是新增了硬體fpu單元以及dsp指令,同時,stm32f4的主頻也提高了很多,達到168mhz 可獲得...