7989|12

1万

帖子

204

TA的资源

管理员

楼主
 

[转]基于乐鑫ESP8266的STM32+WIFI的OTA案例分享 [复制链接]

 
 

本篇案例我们将详细介绍如何通过WIFI模组将STM32F469的下载差分包,并且利用艾拉比的差分技术进行升级。

 

升级方案的设计

 

考虑到ESP8266模组内部的空间资源都十分的充足,所以我们为这个案例的升级设计了两套升级方案,下面我们分别展开来描述这两种方案。

 

(1) WIFI模组透传差分包升级MCU

 

如下面框架图所示,与NB网络下升级MCU的方式一致,需要在MCU里内置艾拉比的UA和UC的程序,同样MCU上也要规划一块区域来存放差分包。

 

 

基于上面的软件框架,我们将基于HTTP协议来和OTA服务器进行交互通信,以下是整个升级的流程图:

 

 

从上图中我们可以看到整个升级的流程分以下几个步骤:

 

1. STM32透过ESP8266,向OTA服务器发起注册请求。OTA服务器透过ESP8266下发注册结果,STM32将这些注册信息保存下来

 

2. STM32透过ESP8266,向OTA服务器发起检测版本的请求。OTA服务器透过ESP8266下发新版本的信息,这其中包含了差分包的下载地址

 

3. STM32基于得到的下载地址,透过ESP8266向OTA服务器发送下载差分包请求。OTA服务器会根据请求将差分包透过ESP8266下发给STM32,STM32在收到后将这些数据存储在差分包存储区域

 

4. STM32在下载完差分包并经过校验后,透过ESP8266上报下载升级包的结果给到OTA服务器。OTA服务器透过ESP8266下发上报结果

 

5. STM32在接收到云端返回的上报结果后,进行软重启,启动UA程序

 

6. STM32运行UA程序,进行差分升级,升级完成后存储本次升级的结果并进入系统

 

7. STM32透过ESP8266上报本次升级的结果给到OTA服务器。OTA服务器透过ESP8266下发上报结果

 

8. STM32在接收到云端返回的上报结果后,断开网络,至此整个升级流程结束

 

(2) WIFI内部完成MCU升级回刷MCU方案

 

如下面框架图所示, 这个方案需要在ESP8266内置入UC和UA程序,并且在ESP8266内划分两个区域,一个区域用于存储下载的差分包,另外一个用于临时存储MCU的部分固件。

 

 

基于上面的软件框架,我们将基于HTTP协议来和OTA服务器进行交互通信,以下是整个升级的流程图:

 

 

从上图中我们可以看到整个升级的流程分以下几个步骤:

 

1. STM32向ESP8266发起升级请求

 

2. ESP8266通过获取的STM32的信息,向OTA服务器发送注册请求

 

3. OTA服务器返回注册信息给到ESP8266,ESP8266将MCU的注册信息存储下来

 

4. ESP8266向OTA服务器发起STM32的检测请求, OTA服务器返回STM32

新版本的信息

 

5. ESP8266根据获取的新版本信息,向OTA服务器发起下载差分包的请求,OTA服务器收到请求后下发差分包。

 

6. ESP8266收到差分包,并校验通过后,向OTA服务器发送下载情况上报请求,OTA服务器收到后返回上报结果。

 

7. ESP8266中的UC程序通知UA程序开始进行STM32的差分升级

 

8. ESP8266中的UA程序完成MCU的固件升级后,向STM32请求回刷固件,在STM32允许刷写后,进行固件回刷

 

9. ESP8266中UA程序在STM32升级完成后,存储升级的结果,并通UC程序进行升级结果上报,UC在收到通知后,向OTA服务器上报STM32升级的结果,OTA服务器收到后返回上报的结果给到ESP8266

 

10. ESP8266收到OTA服务器下发的上报结果后,断开网络,至此整个升级流程结束。

 

从上面两个升级方案中,MCU的升级都采用的是差分升级,这相较于传统WIFI下的MCU升级优势在于:

 

(1)升级包下载的时间大大减小,同时也降低了升级的功耗。

 

(2) 升级的时间也会比整包升级的时间也大为减小,整体提升了升级的效率。下面我们再来看一下,整个设备升级的实际过程。

 

设备操作流程

 

从下面两张图上我们看到,一张图是STM32F469的Discovery开发板子,一张图是ESP8266的串口模块,我们将通过串口线将两个设备连接在一起,对STM32开发板进行差分升级。

 

 

这个STM32的开发板是支持触屏操作的,所以首先我们点击屏幕上的“Check for Update“发起升级流程。

 

 

点击屏幕后,OTA服务器很快返回了新版本的信息,屏幕这时候也显示了新版本的差分包大小。

检测到新版本后,设备会自动去请求下载差分包,从下面两张图中我们可以从屏幕上看到下载的进度显示。

 

从上图来看,差分包已经下载完成,设备会立即向OTA服务器上报这个下载的结果。我们也可以从PC上的Debuger工具中看到这个过程的log

 

 

差分包下载完成后,设备会进行重启,进入了bootloader,在这个阶段,集成在设备bootloader里的UA程序会进行差分升级的工作,我们从下面两张图来看一下这个过程

 

 

 

从上图可以看到,屏幕上显示升级进度已经完成,升级已经完成,我们也可以在PC端的Debuger工具中看到这个过程

 

 

接下来,设备会进入APP,我们为了区别版本特意将这个版本的屏幕颜色做了改动,大家可以从下面两张图上看到

 

 

我们从屏幕上可以看到,这个时候软件的版本好已经升级为2.0,设备自动开始

升级结果的上报并且已经上报成功,从PC端的Debuger软件中我们也能看到这个过程

 

升级结果的上报并且经上报成功,从PC端的Debuger软件中我们也能看到这个过程

 

 

至此,STM32F469的这个开发板已经差分升级成功,升级流程结束。从这几个阶段的log来看,这次的差分包大小是1875个字节,整个固件的大小是87KB,下载的差分包的时间是3秒,升级的时间是11秒,不过这个时长也受限于log的串口打印以及模组的AT交互的消耗,如果在商用批量产品使用中不考虑这些限制,整个升级需要的时长、消耗的功耗都将进一步大幅降低。

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

最新回复

对于wifi这种的  完全可以搞大flash或者外置一个存储来备份儿升级包。主要就是从flash和存储的价格去衡量。因为不担心流量。他这种差分只有再对流量要求比较严格的场合用处多一下,其实还是性价比的问题,你自己流量贵还是找他合作贵,衡量着来。   详情 回复 发表于 2020-4-1 09:55
点赞 关注(2)
个人签名

玩板看这里:

https://bbs.eeworld.com.cn/elecplay.html

EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!

 
 

回复
举报

67

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

艾拉比这个差分包制作和还原算法是免费的么?  还是必须用他们的平台?

点评

同关注这个问题。还是掌握在自己手上最安全。app全部更新也不是不可以。  详情 回复 发表于 2020-2-14 11:23
 
 
 

回复

423

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
zhuzd 发表于 2019-9-17 08:41 艾拉比这个差分包制作和还原算法是免费的么?  还是必须用他们的平台?

同关注这个问题。还是掌握在自己手上最安全。app全部更新也不是不可以。

 
 
 

回复

423

帖子

0

TA的资源

一粒金砂(高级)

4
 

@wateras1 

谢谢!

 
 
 

回复

9720

帖子

24

TA的资源

版主

5
 

IAP using ESP8266  WiFi module

Copyright 2016 STMicroelectronics

 


This application shows how to use the ESP8266 WiFi module to perform an IAP ("In Application Programming") using STM32 Cube HAL.
This application can be run with two different ways:
          
  1. Using a remote PC
     
          
  •  In this first scenario, the STM32F769xx board equipped, with the WiFi Module ESP8266, joins, alongside a PC ,a  WiFi access point.
  •  The PC is running a HTTP Web Server, the Wamp Server for example, that hosts the "hello.bin" FW file.
  •  Once WiFi access point is joined, the stm32f769 board establishes a TCP connection to the PC and send a request to download
     the "hello.bin. As soon the downloading is finished the "hello.bin" file is written to the flash.
  •  Once done, the board  will run the "hello.bin" application. when rebooted.
 
  1. Using a mobile phone
  • In this second scenario, a mobile phone is configured as a WiFi access point to which the ESP8266 will connect.
  • The mobile phone is also running a HTTP web server, the Palpa web server in this case, and is hosting the hello.bin 
  • After joining the WiFi access point on the mobile phone, the stm32F7 board establishes a WiFi connection to the Palpa web server, then download the "hello.bin".
  • Once done, the "hello.bin" FW is written into the flash.
  • Rebooting the board starts the newly flashed binary.


Note:
After flashing the binary file, the IAP original application can be restarted by rebooting the board while pressing down the "USER" button.

 

 

Esp8266_IAP_Client.rar (319.98 KB, 下载次数: 36)

 

/* Includes ------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "main.h"
#include "esp8266.h"
#ifdef USE_LCD
#include "lcd_log.h"
#endif /* USE_LCD */
#include "flash_if.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define HTML_SUCCESS_STRING "200 OK"
#define VSYNC               1 
#define VBP                 1 
#define VFP                 1
#define VACT                480
#define HSYNC               1
#define HBP                 1
#define HFP                 1
#define HACT                800

#define LAYER0_ADDRESS               (LCD_FB_START_ADDRESS)
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
typedef  void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t JumpAddress;
static uint8_t HtmlData[DATA_MAX_SIZE];
static uint8_t HtmlRequest[256];
static uint32_t FlashWriteAddress;
uint8_t IpAddress[15];

/* Private typedef -----------------------------------------------------------*/
extern LTDC_HandleTypeDef hltdc_discovery;
extern DSI_HandleTypeDef hdsi_discovery;
DSI_CmdCfgTypeDef CmdCfg;
DSI_LPCmdTypeDef LPCmd;
DSI_PLLInitTypeDef dsiPllInit;
static RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct;

/* Private function prototypes -----------------------------------------------*/
static void SystemClock_Config(void);
static void ErrorHandler(void);
static void StartWiFiIAP(void);
static void CPU_CACHE_Enable(void);


#ifdef USE_LCD
 static void LCDConfig(void);
 static void LTDC_Init(void);
#endif /* USE_LCD */

/* Private functions ---------------------------------------------------------*/

/**
  * [url=home.php?mod=space&uid=159083]@brief[/url]  Main program
  * @param  None
  * @retval None
  */

int main(void)
{
  uint32_t Trial = 0;
  ESP8266_StatusTypeDef Status; 

  /* Enable the CPU Cache */
  CPU_CACHE_Enable();
  
  /* STM32F7xx HAL library initialization:
       - Configure the Flash ART accelerator on ITCM interface
       - Configure the Systick to generate an interrupt each 1 msec
       - Set NVIC Group Priority to 4
       - Global MSP (MCU Support Package) initialization
     */

  HAL_Init();

  /* Configure the system clock to 200 MHz */
  SystemClock_Config();

  /* Initialize the SDRAM */
  BSP_SDRAM_Init();
  
  /* Configure leds */
  BSP_LED_Init(LED1);
  BSP_LED_Init(LED2);
  
  /* Configure Key Button */      
  BSP_PB_Init(BUTTON_USER, BUTTON_MODE_GPIO);  

  /* Test if Key Tamper -button on STM32F769I-Discovery Board is not pressed */
  if (BSP_PB_GetState(BUTTON_USER) == 0x00)
  { /* Key Tamper -button not pressed: jump to user application */
    
    /* Check if valid stack address (RAM address) then jump to user application */
    if (((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
    {
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (USER_FLASH_FIRST_PAGE_ADDRESS + 4);
      Jump_To_Application = (pFunction) JumpAddress;
      
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);
      Jump_To_Application();
    }
  }
 
#ifdef USE_LCD
  /* Configure LCD */
  LCDConfig();
    BSP_LCD_LayerDefaultInit(0, LAYER0_ADDRESS);     
  BSP_LCD_SelectLayer(0); 
  
  /* Initialize the log unit */
  LCD_LOG_Init();
  /* Send Display On DCS Command to display */
  HAL_DSI_ShortWrite(&(hdsi_discovery),
                     0,
                     DSI_DCS_SHORT_PKT_WRITE_P1,
                     OTM8009A_CMD_DISPON,
                     0x00);

  BSP_LCD_SetTextColor(LCD_COLOR_BLUE); 
  BSP_LCD_FillRect(0, 0, 800, 112);
  
  /* Write the demo header log */
  LCD_LOG_SetHeader((uint8_t *)"WiFi IAP Demo");
    /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
  HAL_Delay(1000);
#endif /* USE_LCD */
  
#ifdef USE_LCD
  LCD_UsrLog("Initializing Wifi module...\n");
    /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
#endif /* USE_LCD */

  /* Initialize the WiFi module ESP8266 */
  Status = ESP8266_Init();
   
  /* Check if initialization passed */
  if (Status != ESP8266_OK)
  {
#ifdef USE_LCD
   LCD_ErrLog("Initializing Wifi module  Failed!\n\n");
     /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
#endif /* USE_LCD */
    ErrorHandler();
  }
#ifdef USE_LCD
  else
  {
   LCD_UsrLog("O.K!\n\n");
     /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
  }
  
  /* Join Access Point defined by user */
  LCD_UsrLog("Joining Access Point  ' "WIFI_SSID " ' ...\n");
    /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
#endif /* USE_LCD */
  while(ESP8266_JoinAccessPoint((uint8_t *)WIFI_SSID, (uint8_t *)WIFI_PASSWORD) != ESP8266_OK)
  {
#if USE_LCD
    LCD_UsrLog("Retrying ( %d )to Join Access Point  "WIFI_SSID"\n\n",  (int)++Trial);
      /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
#endif /* USE_LCD */
    if (Trial == MAX_NUM_TRIAL)
      break;
  }
  
  /* Check if maximum number of trials has been reached */
  if (Trial == MAX_NUM_TRIAL)
  {
#if USE_LCD
    LCD_ErrLog("Joining Access Point  ' "WIFI_SSID" '  Failed!\n\n");
      /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
#endif /* USE_LCD */
    ErrorHandler();
  }
  else
  {
	/* Reset the IP address field to 0 */
    memset(IpAddress, '\0', 15);
	
	/* Access point joined: start getting IP address */    
    ESP8266_GetIPAddress(ESP8266_STATION_MODE, IpAddress);
#ifdef USE_LCD
    LCD_UsrLog("OK!\nGot IP Address: %s\n\n", (char *)IpAddress);
      /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
#endif /* USE_LCD */
    HAL_Delay(1000);
   }
  /* IP Address acquired: Start the IAP over WiFi (retrieve the binary file 
     for server and download it to Flash memory) */
  StartWiFiIAP();
}

static void StartWiFiIAP(void)
{
  uint8_t *FwData;
  uint32_t FwSize;
  uint32_t DataSize = 0;
  uint32_t Trial = 0;
  
  ESP8266_ConnectionInfoTypeDef ConnectionInfo;
  ESP8266_StatusTypeDef Result = ESP8266_OK;

  /* Initialize the HTML request field to 0 */
  memset(HtmlRequest, '\0', 128);
  
  /*
    Send an HTML GET request to download the "FW_FILE", the request is as follows
   ====================================
    GET /<fw_file> HTTP/1.1
    Host: <http_server>
    User-Agent: <esp8266_for_example>
    Accept: * / *  <= no space here
    Connection: keep-alive
   ====================================
   the request MUST end with a "\r\n\r\n" otherwise it won't be processed correctly.
   */
  sprintf((char *)HtmlRequest, "GET /"FW_FILE" HTTP/1.1%c%cHost: "HOST_ADDRESS"%c%cUser-Agent: esp8266/stm32%c%cAccept: */*%c%cConnection: keep-alive%c%c%c%c",
                      '\r','\n','\r','\n','\r','\n','\r','\n','\r','\n','\r','\n');

#ifdef USE_LCD
    LCD_UsrLog("Connecting to %s:%d ...\n", HOST_ADDRESS, HOST_PORT);
      /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
#endif /* USE_LCD */
 
  /* Initialize Connection info structure */
  Trial = 0;
  memset(&ConnectionInfo, '\0', sizeof (ESP8266_ConnectionInfoTypeDef));
  
  ConnectionInfo.connectionType = ESP8266_TCP_CONNECTION;
  ConnectionInfo.ipAddress = (uint8_t *)HOST_ADDRESS;
  ConnectionInfo.isServer = ESP8266_FALSE;
  ConnectionInfo.port = HOST_PORT;

  /* Wait for communication establishment */
  while (ESP8266_EstablishConnection(&ConnectionInfo) != ESP8266_OK)
  {
#ifdef USE_LCD
    LCD_UsrLog("Retrying( %d ) to connect to %s:%d \n", (int)++Trial, HOST_ADDRESS, HOST_PORT);
      /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
    HAL_Delay(1000);

#endif /* USE_LCD */

    if (Trial == MAX_NUM_TRIAL)
    {
      break;
    }
  }
    
  /* Check if trials number exceeded maximum limit */
  if (Trial == MAX_NUM_TRIAL)
  {
#ifdef USE_LCD
    LCD_ErrLog("Connecting to %s:%d  Failed!\n", HOST_ADDRESS, HOST_PORT);
    LCD_ErrLog("Quitting Access Point...\n\n");
      /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
#endif /* USE_LCD */

    /* Leave the access point */
    ESP8266_QuitAccessPoint();
	
	/* Deinitialize the WiFi module */
    ESP8266_DeInit();
    
	/* Call the error Handler */
    ErrorHandler();
  }
  
#ifdef USE_LCD
  else
  {
    LCD_UsrLog("O.K!\n\n");
      /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
    HAL_Delay(1000);
  }
#endif /* USE_LCD */
  
  /* Reset the HTML data field to 0 */
  memset(HtmlData, '\0', ARRAY_SIZE(HtmlData));

#ifdef USE_LCD
    LCD_UsrLog("Downloading the firmware ' "FW_FILE" '...\n");
      /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
#endif /* USE_LCD */

  Result = ESP8266_SendData(HtmlRequest, strlen((char *)HtmlRequest));

  /* In case of error, quit the Access point */  
  if (Result != ESP8266_OK)
  {
#ifdef USE_LCD
    LCD_ErrLog("Downloading the firmware ' "FW_FILE" '  Failed!\n");
    LCD_ErrLog("Quitting Access Point...\n\n");
      /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
#endif /* USE_LCD */   

	/* Deinitialize the WiFi module */
    ESP8266_DeInit();
    
	/* Call the error Handler */
    ErrorHandler();
  }
     
  /* Check whether the data was correctly received.
     This is can be done by checking the GET request response.
     in case of success the string '200 OK' is received.
     see (https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) */
  Result = ESP8266_ReceiveData(HtmlData, DATA_MAX_SIZE, &DataSize);
    
  /* If data reception failed */
  if (Result != ESP8266_OK)
  {
#ifdef USE_LCD
    LCD_ErrLog("Downloading the firmware ' "FW_FILE" '  Failed!\n");
    LCD_ErrLog("Quitting Access Point...\n\n");
      /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
#endif /* USE_LCD */   

    /* Leave the access point */
    ESP8266_QuitAccessPoint();
	
	/* Deinitialize the WiFi module */
    ESP8266_DeInit();
    
	/* Call the error Handler */
    ErrorHandler();
  }
  
  /* If data reception passed */
  if(strstr((char *)HtmlData, HTML_SUCCESS_STRING) == NULL)
  {
#ifdef USE_LCD
    LCD_ErrLog("Downloading the firmware ' "FW_FILE" '  Failed!\n");
    LCD_ErrLog("Quitting Access Point...\n\n");
      /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
#endif /* USE_LCD */

    /* Leave the access point */
    ESP8266_QuitAccessPoint();
	
	/* Deinitialize the WiFi module */
    ESP8266_DeInit();
    
	/* Call the error Handler */
    ErrorHandler();
  }
  
  /* The actual fw data is located after the HTML HEADER
   the end of header is marked with the string "\r\n\r\n" */
  FwData = (uint8_t *)(strstr((char *)HtmlData, "\r\n\r\n"));
  
  /* Check if data is null */
  if (FwData != NULL)
  {
	 /* Increment data pointer by 4 to get the data load */
     FwData += 4;
  
    /* Stop WiFi module to avoid errors when erasing flash */
    ESP8266_DeInit();
    
    /* The actual fw data size can be retrieved from the html header
       by looking at the "Content-Length" field.
       but let's do it in a faster way: FwSize = DataSize - (FwData - HtmlData) */
    FwSize = DataSize - (FwData - HtmlData);
  
#ifdef USE_LCD
    LCD_UsrLog("Downloaded firmware ' %s ', size = %ld Bytes\n\n", FW_FILE, FwSize);
      /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
    HAL_Delay(1000);
#endif /* USE_LCD */
  
    /* Now the firmware can be written into Flash memory */
#ifdef USE_LCD
    LCD_UsrLog("State: Programming...\n");
      /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
#endif /* USE_LCD */

    /* Initialize the Flash memory module for write operations */
    FLASH_If_Init();

    /* Erase 2 sectors, 128KB each (the downloaded firmware size doesn't exceed 192KB) */
    FLASH_If_Erase(USER_FLASH_FIRST_PAGE_ADDRESS);
    FLASH_If_Erase(USER_FLASH_SECOND_PAGE_ADDRESS);

	/* Set the write address */
    FlashWriteAddress = USER_FLASH_FIRST_PAGE_ADDRESS; 
  
    /* Start writing the binary file into the Flash memory */
    if (FLASH_If_Write(&FlashWriteAddress, (uint32_t*)FwData, FwSize) != 0)
    {
#ifdef USE_LCD
      LCD_ErrLog("Programming Failed !\n");
        /*Refresh the LCD display*/
      HAL_DSI_Refresh(&hdsi_discovery);
#endif /* USE_LCD */
		/* Leave the access point */
    ESP8266_QuitAccessPoint();
	
	  /* Deinitialize the WiFi module */
    ESP8266_DeInit();
    
	  /* Call the error Handler */
    ErrorHandler();
    }
    else
    {
#ifdef USE_LCD
     LCD_UsrLog("Programming Done !\n");
       /*Refresh the LCD display*/
     HAL_DSI_Refresh(&hdsi_discovery);
#endif
    }
  }
  else
  {
#ifdef USE_LCD
    LCD_ErrLog("The firmware ' "FW_FILE" ' is empty\n");
    LCD_ErrLog("Quitting Access Point...\n\n");
      /*Refresh the LCD display*/
    HAL_DSI_Refresh(&hdsi_discovery);
#endif /* USE_LCD */

    /* Leave the access point */
    ESP8266_QuitAccessPoint();
	
	/* Deinitialize the WiFi module */
    ESP8266_DeInit();
    
	/* Call the error Handler */
    ErrorHandler();
  }
  
  /* Stop WiFi module */
  ESP8266_DeInit();

  /* Set LED2 On */
  BSP_LED_On(LED2);

  while(ESP8266_TRUE)
  {
    HAL_Delay(300);
    BSP_LED_Toggle(LED2);
  }
}


/**
  * @brief  This function is executed in case of error occurrence.
  * @param  None
  * @retval None
  */
static void ErrorHandler(void)
{
  /* Stop WiFi Module */
  ESP8266_DeInit();
  
  /* Keep blinking LED1 */
  while(1)
  {
    HAL_Delay(100);
    BSP_LED_Toggle(LED1);
  }
}

 

st_logo.png (18.67 KB, 下载次数: 0)

st_logo.png

点评

@zhuzd 看看这里  详情 回复 发表于 2020-3-5 21:56
手动点赞!版主一出手就是干货,能否介绍一下  详情 回复 发表于 2020-3-5 19:36
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

423

帖子

0

TA的资源

一粒金砂(高级)

6
 
littleshrimp 发表于 2020-3-4 19:11 IAP using ESP8266  WiFi module Copyright 2016 STMicroelectronics ...

手动点赞!版主一出手就是干货,能否介绍一下

点评

官方cubemxf7包里的例程  详情 回复 发表于 2020-3-6 08:01
 
 
 

回复

423

帖子

0

TA的资源

一粒金砂(高级)

7
 
littleshrimp 发表于 2020-3-4 19:11 IAP using ESP8266  WiFi module Copyright 2016 STMicroelectronics ...

@zhuzd 看看这里

 
 
 

回复

9720

帖子

24

TA的资源

版主

8
 
threetigher 发表于 2020-3-5 19:36
手动点赞!版主一出手就是干货,能否介绍一下

官方cubemxf7包里的例程
 
 
 

回复

295

帖子

1

TA的资源

版主

9
 

不知道差分包的源码公开不公开

点评

肯定不要想了~~  详情 回复 发表于 2020-3-6 10:41
 
 
 

回复

423

帖子

0

TA的资源

一粒金砂(高级)

10
 
hotsauce1861 发表于 2020-3-6 08:13 不知道差分包的源码公开不公开

肯定不要想了~~

点评

那就是没的商量了啊哈哈  详情 回复 发表于 2020-3-6 14:23
 
 
 

回复

295

帖子

1

TA的资源

版主

11
 

那就是没的商量了啊哈哈

点评

本地搞一个大的FLASH,然后分多次包,估计只能这样了吧。   不知道有没有更好的方案  详情 回复 发表于 2020-3-6 18:15
 
 
 

回复

423

帖子

0

TA的资源

一粒金砂(高级)

12
 
hotsauce1861 发表于 2020-3-6 14:23 那就是没的商量了啊哈哈

本地搞一个大的FLASH,然后分多次包,估计只能这样了吧。

 

不知道有没有更好的方案

点评

对于wifi这种的  完全可以搞大flash或者外置一个存储来备份儿升级包。主要就是从flash和存储的价格去衡量。因为不担心流量。他这种差分只有再对流量要求比较严格的场合用处多一下,其实还是性价比的问题,你自  详情 回复 发表于 2020-4-1 09:55
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(中级)

13
 
threetigher 发表于 2020-3-6 18:15 本地搞一个大的FLASH,然后分多次包,估计只能这样了吧。   不知道有没有更好的方案

对于wifi这种的  完全可以搞大flash或者外置一个存储来备份儿升级包。主要就是从flash和存储的价格去衡量。因为不担心流量。他这种差分只有再对流量要求比较严格的场合用处多一下,其实还是性价比的问题,你自己流量贵还是找他合作贵,衡量着来。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表