打印
[应用相关]

STM32cubeMX LWIP 做Client, APP+IAP 失败

[复制链接]
421|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
powerantone|  楼主 | 2022-6-16 09:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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("用户程序接收完成!\r\n");
  •                                 printf("代码长度:%dBytes\r\n",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("收到应用程序升级命令!\r\n");
  •                                 }
  •                                 else
  •                                         oldcount=LWIP_RX_CNT;
  •                         }
  •                 if(swupdateflag == 1)        //收到升级命令
  •                 {
  •                         client_close();
  •                         //printf("开始更新应用程序...\r\n");
  •                         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("无效应用程序!\r\n");
  •                         }
  •                 }
  •         key=KEY_Scan(0);
  •                 if(key==KEY2_PRES)        //KEY2按下
  •                 //if(swupdateflag == 2)
  •                 {
  •                         //printf("应用程序启动!\r\n");
  •                         if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
  •                         {
  •                                 //HAL_ETH_DeInit(&heth);
  •                                 iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
  •                         }else
  •                         {
  •                                 //printf("非应用程序,无法执行!\r\n");
  •                         }
  •                 }
  • #endif

复制代码



使用特权

评论回复
沙发
mutable| | 2022-6-18 15:21 | 只看该作者
应该是不全吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

561

主题

2435

帖子

4

粉丝