STM32
直播中

kmno4

12年用户 971经验值
私信 关注
[问答]

Stm32CubeMx生成的LWIP通信程序,通过LWIP发送升级包后,写Flash后再跳转APP总是失败的原因?

STM32CubeMx生成的LWIP通信程序,下位机做客户端,自己移植了 IAP,IAP与APP互转没问题。
通过LWIP发送升级包后,写Flash后再跳转APP总是失败。
通过UART发送升级包写FLASH正常跳转APP。
仿真测试发现写Flash后总是判断APP地址失败, 不明白为什么串口升级是正常的,求各位大佬解答。
if(((*(vu32*)(0X20001000+4)) 0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.


  • /* USER CODE BEGIN 1 */
  •   u32 oldcount=0; //老的串口接收数据值
  •   u32 applenth=0; //接收到的app代码长度
  •         u8 key;
  •   u16 i = 0;

  •   /* USER CODE END 1 */

  •   /* MCU Configuration--------------------------------------------------------*/
  •         __enable_irq();
  •   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  •   //HAL_RCC_DeInit();
  •         //NVIC_DeInit();

  •         HAL_Init();

  •   /* USER CODE BEGIN Init */

  •   /* USER CODE END Init */

  •   /* Configure the system clock */
  •   //SystemClock_Config();
  •         Stm32_Clock_Init(336,8,2,7);          //设置时钟,168Mhz
  •   /* USER CODE BEGIN SysInit */

  •   /* USER CODE END SysInit */

  •   /* Initialize all configured peripherals */
  •   MX_GPIO_Init();
  •         //TIM3_Init(1000-1, 10000-1);
  •         delay_init(168);
  •         uart_init(115200);                     //初始化USART
  •         KEY_Init();                                                //初始化KEY
  •         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET);
  •         delay_ms(50);
  •         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_SET);
  •           MX_LWIP_Init();
  •   /* USER CODE BEGIN 2 */
  •         TCP_Client_Init();
  •   /* USER CODE END 2 */

  •   /* Infinite loop */
  •   /* USER CODE BEGIN WHILE */
  •   while (1)
  •   {
  •     /* USER CODE END WHILE */

  •     /* USER CODE BEGIN 3 */
  •                 if(!swupdateflag)
  •                 {
  •                         //MX_LWIP_Process();
  •                 }

  •                                  if(USART_RX_CNT)
  •                 {
  •                         if(oldcount==USART_RX_CNT)//新周期内,没有收到任何数据,认为本次数据接收完成.
  •                         {
  •                                 applenth=USART_RX_CNT;
  •                                 oldcount=0;
  •                                 USART_RX_CNT=0;
  •                                 printf("用户程序接收完成!rn");
  •                                 printf("代码长度:%dBytesrn",applenth);
  •                         }else oldcount=USART_RX_CNT;
  •                 }
  •                 delay_ms(10);
  • #if 1

  •                         if(LWIP_RX_CNT)
  •                         {
  •                                 if(oldcount==LWIP_RX_CNT)//新周期内,没有收到任何数据,认为本次数据接收完成.
  •                                 {

  •                                         swupdateflag = 1;
  •                                         applenth = LWIP_RX_CNT;
  •                                         oldcount = 0;
  •                                         LWIP_RX_CNT=0;
  •                                         //printf("收到应用程序升级命令!rn");
  •                                 }
  •                                 else
  •                                         oldcount=LWIP_RX_CNT;
  •                         }


  •                 if(swupdateflag == 1)        //收到升级命令
  •                 {
  •                         client_close();
  •                         //printf("开始更新应用程序...rn");
  •                         if(((*(vu32*)(0X20001000+4)) 0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
  •                         {
  •                                 //iap_write_appbin(FLASH_APP1_ADDR,LWIP_RX_BUF,applenth);//更新FLASH代码
  •                                 iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码
  •                                 swupdateflag = 2;
  •                                 HAL_ETH_DeInit( heth);
  •                         }
  •                         else
  •                         {
  •                                 printf("无效应用程序!rn");
  •                         }

  •                 }
  •         key=KEY_Scan(0);
  •                 if(key==KEY2_PRES)        //KEY2按下
  •                 //if(swupdateflag == 2)
  •                 {
  •                         //printf("应用程序启动!rn");

  •                         if(((*(vu32*)(FLASH_APP1_ADDR+4)) 0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
  •                         {
  •                                 //HAL_ETH_DeInit( heth);

  •                                 iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
  •                         }else
  •                         {
  •                                 //printf("非应用程序,无法执行!rn");
  •                         }
  •                 }
  • #endif


回帖(1)

池鹄展

2024-3-27 14:54:27
怀疑通过LWIP发送升级包后,在跳转前有没有处理完的中断存在,影响了正常跳转。你核对下。

跳转前一定保证干净清爽,不要不要半路发生中断。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分