你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32cubeMX LWIP 做Client, APP+IAP 失败

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

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

  6.   /* USER CODE END 1 */

  7.   /* MCU Configuration--------------------------------------------------------*/
  8.         __enable_irq();
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  10.   //HAL_RCC_DeInit();
  11.         //NVIC_DeInit();
  12.        
  13.         HAL_Init();

  14.   /* USER CODE BEGIN Init */

  15.   /* USER CODE END Init */

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

  20.   /* USER CODE END SysInit */

  21.   /* Initialize all configured peripherals */
  22.   MX_GPIO_Init();
  23.         //TIM3_Init(1000-1, 10000-1);
  24.         delay_init(168);
  25.         uart_init(115200);                     //初始化USART
  26.         KEY_Init();                                                //初始化KEY
  27.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET);
  28.         delay_ms(50);
  29.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_SET);
  30.           MX_LWIP_Init();
  31.   /* USER CODE BEGIN 2 */
  32.         TCP_Client_Init();
  33.   /* USER CODE END 2 */

  34.   /* Infinite loop */
  35.   /* USER CODE BEGIN WHILE */
  36.   while (1)
  37.   {
  38.     /* USER CODE END WHILE */

  39.     /* USER CODE BEGIN 3 */
  40.                 if(!swupdateflag)
  41.                 {
  42.                         //MX_LWIP_Process();
  43.                 }

  44.                                  if(USART_RX_CNT)
  45.                 {
  46.                         if(oldcount==USART_RX_CNT)//新周期内,没有收到任何数据,认为本次数据接收完成.
  47.                         {
  48.                                 applenth=USART_RX_CNT;
  49.                                 oldcount=0;
  50.                                 USART_RX_CNT=0;
  51.                                 printf("用户程序接收完成!\r\n");
  52.                                 printf("代码长度:%dBytes\r\n",applenth);
  53.                         }else oldcount=USART_RX_CNT;                       
  54.                 }
  55.                 delay_ms(10);
  56. #if 1

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

  61.                                         swupdateflag = 1;
  62.                                         applenth = LWIP_RX_CNT;
  63.                                         oldcount = 0;
  64.                                         LWIP_RX_CNT=0;
  65.                                         //printf("收到应用程序升级命令!\r\n");                                                       
  66.                                 }
  67.                                 else
  68.                                         oldcount=LWIP_RX_CNT;                       
  69.                         }

  70.                 
  71.                 if(swupdateflag == 1)        //收到升级命令
  72.                 {
  73.                         client_close();
  74.                         //printf("开始更新应用程序...\r\n");       
  75.                         if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
  76.                         {         
  77.                                 //iap_write_appbin(FLASH_APP1_ADDR,LWIP_RX_BUF,applenth);//更新FLASH代码   
  78.                                 iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码   
  79.                                 swupdateflag = 2;       
  80.                                 HAL_ETH_DeInit(&heth);                               
  81.                         }
  82.                         else
  83.                         {          
  84.                                 printf("无效应用程序!\r\n");
  85.                         }
  86.                                          
  87.                 }
  88.         key=KEY_Scan(0);
  89.                 if(key==KEY2_PRES)        //KEY2按下
  90.                 //if(swupdateflag == 2)
  91.                 {
  92.                         //printf("应用程序启动!\r\n");
  93.                        
  94.                         if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
  95.                         {       
  96.                                 //HAL_ETH_DeInit(&heth);
  97.                                
  98.                                 iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
  99.                         }else
  100.                         {
  101.                                 //printf("非应用程序,无法执行!\r\n");   
  102.                         }                                                                         
  103.                 }                                       
  104. #endif
复制代码




收藏 评论1 发布时间:2022-6-15 14:44

举报

1个回答
xmshao 回答时间:2022-6-17 14:00:50
怀疑通过LWIP发送升级包后,在跳转前有没有处理完的中断存在,影响了正常跳转。你核对下。


跳转前一定保证干净清爽,不要不要半路发生中断。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版