標(biāo)題: 基于STM32F4系列的ETH IAP在線升級(jí)程序 [打印本頁(yè)]
作者: lliuxin88 時(shí)間: 2020-10-19 10:56
標(biāo)題: 基于STM32F4系列的ETH IAP在線升級(jí)程序
此bootloader程序可以通過(guò)http或tftp方式更新STm32應(yīng)用程序,是否進(jìn)入BOOTLOADER程序可以根據(jù)讀取板載外接存儲(chǔ)器中的字節(jié)判斷,能夠做到做到了現(xiàn)場(chǎng)快速更改程序,省時(shí)省力!
STM32F4的以太網(wǎng)移植及IAP 在移植過(guò)程中,對(duì)于以太網(wǎng)協(xié)議還有許多不理解的地方,通過(guò)以后的實(shí)踐學(xué)習(xí),不斷深入理解并完善此文檔。
1. 以太網(wǎng)的移植(無(wú)操作系統(tǒng))打開(kāi)LWIP1.4.1 移植文件,需要移植的src 文件port文件。其中port文件移植ethernetif.c/.h文件;src文件移植①api文件中所有.c文件,②core文件中除ipv6及snmp文件外所有文件,③ include中除ipv6及posix外所有的.h文件。由于此處移植無(wú)操作系統(tǒng),所以在IAP_SERVICE 文件中定義了sys_arch.c,其中只有返回外部時(shí)間函數(shù)return get_systick()。注意KEIL5相應(yīng)的路徑頁(yè)需要包含對(duì)應(yīng)的頭文件。
2. 移植FATS 系統(tǒng)FTFP傳輸文件是512k block形式傳送的,需要移植 FATS 文件系統(tǒng)。此處不多說(shuō),有比較多的資料講這塊。
3. 移植ETH 驅(qū)動(dòng)及 DP83848驅(qū)動(dòng)ETH 驅(qū)動(dòng)是從官網(wǎng)上直接移植的,DP83848驅(qū)動(dòng)通過(guò)lan8720修改過(guò)來(lái)的,區(qū)別就是lan8720的硬啟動(dòng)需要一定的時(shí)延,而DP83848基本上不需要硬重啟的時(shí)間。需要注意的是在PHY驅(qū)動(dòng)中,有些系統(tǒng)PHY 驅(qū)動(dòng)中啟動(dòng)了MAC中斷,那么在主程序中就可以不輪詢ETH_CheckFrameReceived()函數(shù),及ETH_DMA 是否接受到數(shù)據(jù)。反之,如果不啟動(dòng)MAC中斷,則需要輪詢ETH_CheckFrameReceived()函數(shù)。
4. Tftp 服務(wù)程序Tftp 協(xié)議是在udp協(xié)議上升級(jí)而來(lái),保證了文件傳輸?shù)臏?zhǔn)確性。是在udp傳輸數(shù)據(jù)的基礎(chǔ)上加上了特殊的包頭與報(bào)位,并且有特定檢驗(yàn)傳輸數(shù)據(jù)是否有問(wèn)題的機(jī)制。報(bào)文格式如圖1所示。
圖1
如圖2所示,為tftp的傳輸數(shù)據(jù)實(shí)現(xiàn)過(guò)程。在tftpserver.c/h 函數(shù)中有詳細(xì)的TFTP函數(shù)實(shí)現(xiàn)。在IAP_tftp_process_write()函數(shù)中,起始完udp_recv()函數(shù)后,起始FLASH開(kāi)始寫(xiě)文件。需要注意的是,在函數(shù)IAP_wrq_recv_callback()中檢驗(yàn)是否寫(xiě)完,當(dāng)接收返回的數(shù)據(jù)小于512+2+2KB時(shí),說(shuō)明傳輸文件完成,需要置標(biāo)志位,并鎖上STM32內(nèi)部FLASH。
圖2
5. 注意事項(xiàng)程序中以系統(tǒng)時(shí)鐘作為T(mén)CP、ARP定時(shí)器(SystickCnt計(jì)數(shù)變量),在stm32f4xx_it.c 中可以看到,lwip以此時(shí)鐘為基準(zhǔn)調(diào)用LwIP_Periodic_Handle(SystickCnt)函數(shù)。在中斷中,把接收到的緩沖區(qū)數(shù)據(jù)給lwip 處理ethernetif_input(&netif)。
而在netcongf.c 文件中,必須把ARPTimer和TCPTimer的初始值給一個(gè)未定義的數(shù)值的變量localtime才能傳輸,這里先這么用。改成ETH_DMAs試驗(yàn)看是否能夠解決這個(gè)問(wèn)題。
TFTP_IAP.jpg (26.71 KB, 下載次數(shù): 84)
下載附件
2020-10-19 14:19 上傳
HTTP_IAP_3.jpg (43.62 KB, 下載次數(shù): 84)
下載附件
2020-10-19 14:19 上傳
HTTP_IAP_2.jpg (47.68 KB, 下載次數(shù): 90)
下載附件
2020-10-19 14:19 上傳
HTTP_IAP_1.jpg (47.57 KB, 下載次數(shù): 78)
下載附件
2020-10-19 14:19 上傳
單片機(jī)源程序如下:
- /**
- * @file main.c
- * @author WB R&D Team - openmcu666 Debuger by Lyu Xin
- * @version V1.0
- * @date 2017.03.09
- * @brief Main Program body
- */
-
- #include "stm32f4xx.h"
- #include "Gpio.h"
- #include "usart.h"
- #include "main.h"
- #include "stm32f4x7_eth.h"
- #include "netconf.h"
- #include "eth_bsp.h"
- #include "Gpio.h"
- #include "tftpserver.h"
- #include "httpserver.h"
- #include "eeprom.h"
- //uint8_t data[40] = "bootloadering...";
- uint8_t tftp_flag = 0; //文件傳輸完成標(biāo)識(shí)
- __IO uint32_t SystickCnt = 0;
- typedef void (*pFunction)(void);
- pFunction Jump_To_Application;
- uint32_t JumpAddress;
- static void delay(__IO uint32_t nCount)
- {
- __IO uint32_t index = 0;
- for(index = 80000*nCount; index != 0; index--)
- {
- }
- }
- uint32_t get_systick(void)
- {
- return SystickCnt;
- }
- //從扇區(qū)5開(kāi)始擦除 ,偏移128KB ,為0x08020000,作為APP起始地址
- //可用HTTP或TFTP方式,默認(rèn)TFTP,如需更改,見(jiàn)main.h文件
- /*****************************************************************************
- ** Main Function main()
- ******************************************************************************/
- int main(void)
- {
- uint8_t write_buf = 0;
- uint8_t read_buf = 0;
- I2C_EE_Init();
- #ifdef BOOTLOADER_EN
- write_buf = 0x66;
- I2C_EE_BufferWrite(&write_buf,1,1); //第0塊第0字節(jié)
- #endif
-
- #ifdef APP_EN
- write_buf = 0x55;
- I2C_EE_BufferWrite(&write_buf,1,1); //第0塊第0字節(jié)
- #endif
-
- I2C_EE_BufferRead(&read_buf,1,1);
- if( read_buf == 0x55 ){
- iap();
- }
- else if(read_buf != 0x55 ){
- SysTick_Config(SystemCoreClock / 1000); //systick必須在以太網(wǎng)初始化之前配置
- eth_init();
- LwIP_Init();
- #ifdef USE_IAP_HTTP
- IAP_httpd_init();
- #endif
-
- #ifdef USE_IAP_TFTP
- IAP_tftpd_init();
- #endif
- while (1)
- {
- if (ETH_CheckFrameReceived()){
- LwIP_Pkt_Handle();
- }
- LwIP_Periodic_Handle(SystickCnt);
- if(tftp_flag == 1){
- break;
- }
- else{
- // UDP_Client_Broadcast(data,40);
- continue;
- }
- }
- iap();
- }
- }
- void iap(void)
- {
- if (((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000) == 0x20000000)
- {
- //跳轉(zhuǎn)到用戶程序
- JumpAddress = *(__IO uint32_t*) (USER_FLASH_FIRST_PAGE_ADDRESS + 4);
- Jump_To_Application = (pFunction) JumpAddress;
- //初始化用戶程序的堆棧指針
- __set_MSP(*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);
- Jump_To_Application();
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
EHT_IAP 18.11.5 有效.7z
(1.41 MB, 下載次數(shù): 124)
2020-10-19 14:24 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者: lliuxin88 時(shí)間: 2020-10-19 10:57
后期有時(shí)間會(huì)繼續(xù)完善
作者: zzz5668 時(shí)間: 2023-2-1 19:26
感謝樓主,這帖子幫了大忙了
作者: china_wzj 時(shí)間: 2023-12-13 19:09
感謝樓主,真是及時(shí)雨!
作者: fscheung 時(shí)間: 2025-2-17 23:06
感謝樓主,這帖子幫了大忙了
作者: 西點(diǎn)鐘靈毓秀 時(shí)間: 2025-2-18 10:31
感謝樓主,這帖子幫了大忙了
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |