stm32能用多少flash?STM32F103程序存儲為Flash,支持在線讀寫以及擦除Flash寫的特性為:先要按照頁擦除,擦除之後每個字節的數值為0xFF,然後才能對Flash進行寫操作讀的特性倒是沒有特殊的要求,可以直接讀,今天小編就來聊一聊關于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每日頭條,我们将持续为您更新最新资讯!