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
复制代码
|