tft每日頭條

 > 生活

 > stm32能用多少flash

stm32能用多少flash

生活 更新时间:2024-07-05 17:39:55

stm32能用多少flash?STM32F103程序存儲為Flash,支持在線讀寫以及擦除Flash寫的特性為:先要按照頁擦除,擦除之後每個字節的數值為0xFF,然後才能對Flash進行寫操作讀的特性倒是沒有特殊的要求,可以直接讀,今天小編就來聊一聊關于stm32能用多少flash?接下來我們就一起去研究一下吧!

stm32能用多少flash(STM32系列Flash操作更新)1

stm32能用多少flash

STM32F103程序存儲為Flash,支持在線讀寫以及擦除。Flash寫的特性為:先要按照頁擦除,擦除之後每個字節的數值為0xFF,然後才能對Flash進行寫操作。讀的特性倒是沒有特殊的要求,可以直接讀。

STM32的HAL庫裡面有Flash的寫操作以及擦除操作的,這就為我們Firmware Update提供了便利。

STM32(HAL庫)BootLoader實現(BootLoader跳轉到Application)

STM32(HAL庫)BootLoader實現2(Application跳轉到BootLoader)

上面兩篇文章詳細叙述了如何為了Firmware升級建立BootLoader(如果沒有思路的,可以看看我的這兩篇文章)。BootLoader和Application的相互可以通過上述方式實現,那麼具體的Firmware的操作(即Flash的擦除與寫操作)是怎麼弄的呢?

首先是Flash的擦除,見下面代碼:

#define APP_FLASH_ADDR_START_INDEX (0x8008000) #define APP_FLASH_ADDR_END_INDEX (0x8080000) #define FLASH_PAGE_SIZE_USER (0x800) USBD_StatusTypeDef USB_Erese_Flash() //USB 接口調用的擦除Flash,返回值為USB狀态 { FLASH_EraseInitTypeDef pEraseInit; // HAL 庫定義的擦除句柄 uint32_t PageError = 0; pEraseInit.NbPages = (APP_FLASH_ADDR_END_INDEX-APP_FLASH_ADDR_START_INDEX)/FLASH_PAGE_SIZE_USER;//定義要擦除的頁數,每頁為2K Bytes pEraseInit.PageAddress = APP_FLASH_ADDR_START_INDEX; //定義開始地址 pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;//定義擦除類型為頁擦除 if(HAL_FLASHEx_Erase(&pEraseInit, &PageError)!=HAL_OK) //直接調用Flash 擦除庫函數 { return USBD_FAIL; } return USBD_OK; }

寫操作的代碼如下:(仍然有庫函數作為基本的調用)

//*src Flash數據的來源數組,addr 要更新的地址,Length 數據長度(byte長度) USBD_StatusTypeDef USB_Write_Flash(uint8_t *src,uint32_t addr,uint32_t length) { uint32_t index; for(index=0;index<length;index=index 4) { //4個Byte一起更新,因為STM32為32位單片機,32位的操作是默認的。 if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr index, *(uint32_t*)(src index))==HAL_OK) { //可以增加讀取然後比較的函數,這樣就可以确定Flash上的數據時對的。 //我的應用場景中會在最後對Flash進行CRC校驗,因此這一步會省掉,後面文章會詳細叙述 } else { return USBD_FAIL; } } return USBD_OK; }

這樣隻需要調用上面的兩個函數就可以對Flash進行基本的更新操作了。

另外需要提醒一下,STM32的Flash擦除和寫操作的時候需要對其進行解鎖,如下面代碼:

USBD_StatusTypeDef USB_Init_Flash() { HAL_FLASH_Unlock();//Flash操作的解鎖 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGERR);//清除相關标志位 return (USBD_OK); }

最後再說明一點,Flash的解鎖,寫和擦除操作上面代碼都已經有叙述,那麼讀操作呢?

如下:

#define Flash_Addr 0x8008000 uint32_t device_flash_data= *(__IO uint32_t *)(Flash_Addr);//直接對該地址數據進行讀取

這就是所有對Flash的操作,加上我上文提到的實現BootLoader以及之前文章中分享的USB HID接口實現,其實,現在已經可以實現STM32 Flash的自定義升級了。我後面的文章就将其總結完善,敬請期待。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved