OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3825|回复: 0

新手求助: STM32 IAP远程升级,boot跳转到APP 挂死

[复制链接]

1

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-11-12
在线时间
2 小时
发表于 2020-11-13 10:18:12 | 显示全部楼层 |阅读模式
2金钱
STM32 新手一枚,目前在做一个STM32定位模块的IAP 远程升级的功能, boot跳转到APP后,APP只执行了main函数开始一段代码就挂住了,window10上开 usb串口也变成未知USB设备.

boot主要代码如下:

  1. int main(void)
  2. {
  3.         u16 len = 0, data_len =0;
  4.         int ret = 0, i =0, n = 0;
  5.         u32 offset = 0;

  6.         USB_Config();
  7.            USB_Cable_Config(ENABLE);
  8.         //Init_Image_tx();
  9.         //led_on (LED_ALL);
  10.         while(1)
  11.         {
  12.                 len = 0;
  13.                 memset(UWBRxBuff, 0x0,sizeof(UWBRxBuff));
  14.                 len = USB_RxRead(UWBRxBuff, sizeof(UWBRxBuff));
  15.                 if(UWBRxBuff[0] == 0x19 && UWBRxBuff[1] == 0xF1)
  16.                 {
  17.                         jumpToApp(0x080005000);
  18.                         return 0;
  19.                 }
  20.                 else
  21.                 {
  22.                         n = sprintf(SendBuff,"waite for jump command!!");
  23.                         USB_TxWrite(SendBuff,n);
  24.                 }
  25.                 Sleep(1000);

  26.         }
  27. }

  28. void jumpToApp(uint32_t appxaddr)
  29. {
  30.          int n = 0;
  31.          n = sprintf((char*)&SendBuff[0], "%s\r\n", "Reay ...");
  32.          USB_TxWrite(SendBuff, n);
  33.          n = sprintf((char*)&SendBuff[0], "addr:%08x\r\n", appxaddr);
  34.          USB_TxWrite(SendBuff, n);
  35.    if (((*(volatile  uint32_t*)appxaddr) & 0x2FFE0000 ) == 0x20000000)
  36.     {
  37.            n = sprintf((char*)&SendBuff[0], "%s", "Go!\r\n");
  38.            USB_TxWrite(SendBuff, n);
  39.       /* Jump to user application */
  40.       JumpAddress = *(volatile  uint32_t*) (ApplicationAddress + 4);
  41.       Jump_To_Application = (pFunction) JumpAddress;
  42.           n = sprintf((char*)&SendBuff[0], "JumpAddress:%08x\r\n", JumpAddress);
  43.           USB_TxWrite(SendBuff, n);
  44.       /* Initialize user application's Stack Pointer */
  45. USB_Cable_Config(DISABLE);
  46. INTX_DISABLE();
  47.                   SCB->VTOR = FLASH_BASE | ApplicationAddress;
  48.       __set_MSP(*(volatile  uint32_t*) appxaddr);
  49.                         Jump_To_Application();
  50.      }
  51. }       

复制代码
APP main 代码如下:
  1. int main(void)
  2. {
  3.     volatile u16 adcx;
  4.      
  5.     INTX_DISABLE();
  6.     SCB->VTOR = FLASH_BASE | 0x00005000UL;
  7.     USB_Config();
  8.     USB_Cable_Config(ENABLE);
  9.     uart_init(UART_BAUDRATE);
  10.     GPIO_Configuration();  //PB6/PB7 LED0-1
  11.     SPI_Configuration(); /*SPI1, CS->GPIOA PIN4/5/6/7*/
  12.     peripherals_init();
  13.     INTX_ENABLE();
  14.     //Flash_Configuration();
  15.     led_on(LED_ALL);
  16.     printf("0123456789\r\n");
  17.     printf("abcdefghjk\r\n");
  18.     printf("xxxxxxxxxx\r\n");  //boot跳转后,从串口输出在这里停止了。后面Display_UWBInfo(1);也有printf 输出,但是没有打印出来
  19.     //RTC_Alarm_Configuration();//Init RTC ALARM   
  20.      //MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR, (u32)DMA_USART_Buff, 3000);  
  21.     //USART_DMACmd(USART1, USART_DMAReq_Tx,ENABLE); //DMA
  22.     Display_UWBInfo(1);
  23.     waittingForCleConfig(0);

  24. return 0;
  25. }
复制代码
boot 和APP 独立刷机是可以正常运行的;用xcom 发送跳转命令,跳转后app上的打印在串口上有输出,说明跳转是成功的;
APP开始运行打印出
  1. printf("xxxxxxxxxx\r\n");
复制代码

就挂住,USB虚拟串口在window10上也不能正常识别了,请大家帮忙分析看看是什么原因,谢谢大家!


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-4 06:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表