【STM32開發】基於DISCO-F723板卡的BootLoader學習筆記

目錄

一、官方BootLoader(外部Flash)

二、程序運行在內部SRAM中


一、官方BootLoader(外部Flash)

在F7的固件包例程中,有一個關於BootLoader的例程:

包含了Boot和App兩部分:

1、使用IAR打開Boot程序

在memory.h文件中可以定義使用哪些地方做爲程序運行區和程序存放區:

2、將此代碼編譯下載到板子上

3、復位運行代碼,此時開發板沒有任何現象:

4、接着打開LedToggling例程,編譯後打開map文件查看

可以發現此時的代碼都存放在了0x90000000起始的外部QSPI-FLASH中:

如果直接使用IAR軟件下載程序,會出現下載錯誤:

5、打開ST的下載軟件進行燒寫:

連接上ST-Link,軟件會自動識別板子的型號,並且找到板載的FLASH芯片

6、找到編譯生成的hex文件:

但是打開後,下面的Start Address並不現實當前的起始地址:

爲了驗證當前的文件的正確性:使用第一個選項欄工具Memory&file edition打開hex文件:

可以發現起始地址是從0x90000000開始的,即文件中包含了地址信息:

7、開始燒寫:

燒寫完成後,斷開ST-Link:

8、按下復位按鍵可以看到板子上的LED6閃爍,說明成功使用BootLoader引導了外部FLASH中的代碼運行:

9、接下來自行移植程序,使用BootLoader引導至外部FLASH,以例程中的STemWin_HelloWorld爲例:

10、使用IAR打開工程後,進入工程設置:設置中斷向量表的起始地址爲外部FLASH的地址:0x90000000

11、設置代碼存儲區的地址:

12、然後在system_stm32f7xx.c文件中修改向量表偏移地址

將FLASH_BASE直接改爲0x90000000:

13、編譯,使用上述方法將hex文件下載,可以看到例程運行成功。

二、程序運行在內部SRAM中

1、首先使用CubeMX配置好串口通信,使用DMA的方式接收數據:

2、在主函數開頭打開DMA接收,配置緩衝器,接收的字節爲1,即每來一個數就產生一次DMA中斷:

HAL_UART_Receive_DMA( &huart6, &TEMP_BUFF , 1 );

3、定義一個長數組,用戶保存接收到的二進制文件

使用編譯預處理命令強制設置變量的地址爲0x20020000,此地址後續還有用處:

#define RXD_BUFF_SIZE 1024*100

#define SRAM_FOR_USER_START_ADD 0x20020000

#pragma location = SRAM_FOR_USER_START_ADD
uint8_t UART6_RXD_BUFF[RXD_BUFF_SIZE] = {0};

4、編寫接收回調函數

每接收到一個字節,就存到SRAM中的變量的位置,同時計數變量加一:

uint8_t TEMP_BUFF = 0;
uint32_t UART6_RXD_COUNT = 0;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if( huart == &huart6 )
	{
		UART6_RXD_BUFF[UART6_RXD_COUNT] = TEMP_BUFF;
		UART6_RXD_COUNT++;
	}
}

當使用串口發送bin文件後,程序就會將文件完整得存儲在SRAM的以0x20020000爲首地址的位置。

5、接下來設置程序跳轉:

當按下用戶按鍵的時候,便跳轉到剛剛接收到的程序中去:

#define APPLICATION_ADDRESS SRAM_FOR_USER_START_ADD

typedef  void (*pFunction)(void);
pFunction JumpToApplication;

JumpToApplication = (pFunction) (*(__IO uint32_t*) (APPLICATION_ADDRESS + 4));
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
JumpToApplication();

6、接下來設置APP程序

打開一個按鍵和LED的程序,修改名稱爲XX_IAP:

7、在啓動文件中修改向量表偏移地址:

8、然後在設置中修改向量表地址,和ROM、RAM的地址:

因爲使用了RAM地址中的一部分作爲程序存儲ROM,爲了防止代碼執行過程會意外操作代碼存儲區,所以改小RAM的地址。

9、在輸出轉換選項卡中選擇生成bin文件:

10、編譯,不需要下載這個工程,而是將之前的BootLoader的程序下載。

11、代碼剛剛燒錄後是這個樣子的,顯示屏顯示、LED6閃爍:

串口接收到數據:

12、使用串口助手打開文件,發送:

13、按下用戶按鍵

串口發送回來了好長一大堆數據,這些就是bin文件中的內容,開發板的上的兩顆LED已經在閃爍了,說明IAP成功了:

說明一:

嘗試過使用外部PSRAM存儲程序代碼,但是會出現死機問題,程序跑不起來,懷疑是因爲在執行APP程序時,外部PSRAM芯片被複位,導致內容丟失。

說明二:

此代碼存在侷限性:內部SRAM空間太小。只預留了128KB的空間存儲代碼,而且也導致了可以運行APP的RAM空間只剩餘了128KB,所以在遇到佔用空間較大的程序時,此代碼便不能滿足要求,可以採用SD卡、USB更新代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章