1. 程式人生 > >STM32F407開發板的HTTP模式IAP遠端升級之官方例程移植

STM32F407開發板的HTTP模式IAP遠端升級之官方例程移植

關於遠端升級的模板建立,可以參考下面的博文

接上文為止,已經建立好了一個可以ping通的乙太網工程模板,接下來進行官方例程LWIP_IAP中的iap_http模式的移植

官方例程位置

  • D:\STM32Cube\Repository\STM32Cube_FW_F4_V1.21.0\Projects\STM324xG_EVAL\Applications\LwIP\LwIP_IAP

一.移植步驟

1.將官方例程中的Src資料夾下的flash_if.c,fsdata.c,httpserver.c複製到我們自己建立的工程資料夾的Src資料夾下

將flash_if.c和httpserver.c新增到keil工程中的Gourps中

2.將官方例程中的Inc資料夾下的flash_if.h,fsdata.h,httpserver.h複製到我們自己建立的工程資料夾的Inc資料夾下

3.在app.c中新增如下程式碼

4.此時編譯,出現了以下錯誤

*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'd:\Keil_v5\ARM\ARMCC\Bin'
Build target 'teach_http_iap'
compiling flash_if.c...
..\Src\flash_if.c(57): error:  #20: identifier "USER_FLASH_LAST_PAGE_ADDRESS" is undefined
    if (FlashAddress <= (uint32_t) USER_FLASH_LAST_PAGE_ADDRESS)
..\Src\flash_if.c(91): error:  #20: identifier "USER_FLASH_END_ADDRESS" is undefined
    for (i = 0; (i < DataLength) && (*FlashAddress <= (USER_FLASH_END_ADDRESS-4)); i++)
..\Src\flash_if.c: 0 warnings, 2 errors
compiling httpserver.c...
..\Src\httpserver.c(40): error:  #5: cannot open source input file "lcd_log.h": No such file or directory
  #include "lcd_log.h"
..\Src\httpserver.c: 0 warnings, 1 error
compiling app.c...
..\user\app\app.c(28): warning:  #223-D: function "IAP_httpd_init" declared implicitly
      IAP_httpd_init();
..\user\app\app.c: 1 warning, 0 errors
"teach_http_iap\teach_http_iap.axf" - 3 Error(s), 1 Warning(s).
Target not created.
Build Time Elapsed:  00:00:02

解決方法:

1.在flash_if.h中新增

//起始地址
#define USER_FLASH_FIRST_PAGE_ADDRESS 0x08020000 /* Only as example see comment */
#define USER_FLASH_LAST_PAGE_ADDRESS  0x080E0000
//結束地址
#define USER_FLASH_END_ADDRESS        FLASH_END  

2.註釋掉httpserver.c中的如下程式碼

再次編譯,出現錯誤

*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'd:\Keil_v5\ARM\ARMCC\Bin'
Build target 'teach_http_iap'
compiling httpserver.c...
linking...
teach_http_iap\teach_http_iap.axf: Error: L6218E: Undefined symbol IAP_httpd_init (referred from app.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 1 error messages.
"teach_http_iap\teach_http_iap.axf" - 1 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed:  00:00:02

解決方法:在main.h的76行新增如下程式碼

#define USE_IAP_HTTP   /* enable IAP using HTTP */

再次編譯,出現錯誤

*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'd:\Keil_v5\ARM\ARMCC\Bin'
Build target 'teach_http_iap'
compiling httpserver.c...
..\Src\httpserver.c(210): error:  #20: identifier "LOGIN_SIZE" is undefined
    char *data, *ptr, filename[40], login[LOGIN_SIZE];
..\Src\httpserver.c(273): error:  #20: identifier "USERID" is undefined
                 sprintf((char *)login,"username=%s&password=%s",USERID,PASSWORD);
..\Src\httpserver.c(273): error:  #20: identifier "PASSWORD" is undefined
                 sprintf((char *)login,"username=%s&password=%s",USERID,PASSWORD);
..\Src\httpserver.c(210): warning:  #550-D: variable "filename"  was set but never used
    char *data, *ptr, filename[40], login[LOGIN_SIZE];
..\Src\httpserver.c: 1 warning, 3 errors
"teach_http_iap\teach_http_iap.axf" - 3 Error(s), 1 Warning(s).
Target not created.
Build Time Elapsed:  00:00:02

解決方法:

在main.h的第77行新增如下程式碼

#define USERID       "user"
#define PASSWORD     "stm32"
#define LOGIN_SIZE   (15+ sizeof(USERID) + sizeof(PASSWORD))

在app.c的第19行新增

#include "httpserver.h"

再次編譯執行,沒有錯誤。將程式下載到開發板,斷電重啟(如果在下載時選擇Reset and run,download to flash則不需要)

二.程式測試

開啟IE瀏覽器(必須使用IE),輸入192.168.1.120,出現下面的頁面

輸入使用者名稱user,密碼stm32,點選login

上傳bin檔案即可升級成功。

按鍵升級還未寫在博文中,有空再寫