目錄
一、官方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更新代碼。