STM32 IAP跳转APP后运行问题,求大神们帮忙分析一下,在线等!!!

maotoufeifei 2020-11-12 04:02:21
目前在做一个STM32定位模块的IAP 远程升级的功能, boot跳转到APP后,APP只执行了main函数开始一段代码就挂住了,window10上开 usb串口也变成未知USB设备:

boot主要代码如下:

int main(void)
{
u16 len = 0, data_len =0;
int ret = 0, i =0, n = 0;
u32 offset = 0;

USB_Config();
USB_Cable_Config(ENABLE);
//Init_Image_tx();
//led_on (LED_ALL);
while(1)
{
len = 0;
memset(UWBRxBuff, 0x0,sizeof(UWBRxBuff));
len = USB_RxRead(UWBRxBuff, sizeof(UWBRxBuff));
if(UWBRxBuff[0] == 0x19 && UWBRxBuff[1] == 0xF1)
{
jumpToApp(0x080005000);
return 0;
}
else
{
n = sprintf(SendBuff,"waite for jump command!!");
USB_TxWrite(SendBuff,n);
}
Sleep(1000);

}
}

void jumpToApp(uint32_t appxaddr)
{
int n = 0;
n = sprintf((char*)&SendBuff[0], "%s\r\n", "Reay ...");
USB_TxWrite(SendBuff, n);
n = sprintf((char*)&SendBuff[0], "addr:%08x\r\n", appxaddr);
USB_TxWrite(SendBuff, n);
if (((*(volatile uint32_t*)appxaddr) & 0x2FFE0000 ) == 0x20000000)
{
n = sprintf((char*)&SendBuff[0], "%s", "Go!\r\n");
USB_TxWrite(SendBuff, n);
/* Jump to user application */
JumpAddress = *(volatile uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
n = sprintf((char*)&SendBuff[0], "JumpAddress:%08x\r\n", JumpAddress);
USB_TxWrite(SendBuff, n);
/* Initialize user application's Stack Pointer */
//USB_Cable_Config(DISABLE);
//INTX_DISABLE();
__disable_irq();
SCB->VTOR = FLASH_BASE | ApplicationAddress;
__set_MSP(*(volatile uint32_t*) appxaddr);
Jump_To_Application();
}
}



APP main代码

int main(void)
{
volatile u16 adcx;

INTX_DISABLE();
SCB->VTOR = FLASH_BASE | 0x00005000UL;
USB_Config();
USB_Cable_Config(ENABLE);
uart_init(UART_BAUDRATE);
GPIO_Configuration(); //PB6/PB7 LED0-1
SPI_Configuration(); /*SPI1, CS->GPIOA PIN4/5/6/7*/
peripherals_init();
INTX_ENABLE();
//Flash_Configuration();
led_on(LED_ALL);
printf("0123456789\r\n");
printf("abcdefghjk\r\n");
printf("xxxxxxxxxx\r\n"); //boot跳转后,从串口输出在这里停止了。后面Display_UWBInfo(1);也有printf 输出,但是没有打印出来
//RTC_Alarm_Configuration();//Init RTC ALARM
//MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR, (u32)DMA_USART_Buff, 3000);
//USART_DMACmd(USART1, USART_DMAReq_Tx,ENABLE); //DMA
Display_UWBInfo(1);
waittingForCleConfig(0);

return 0;
}


boot 和APP 独立刷机是可以正常运行的;用xcom 发送跳转命令,跳转后app上的打印在串口上有输出,说明跳转是成功的;
APP开始运行一段后就挂住,USB虚拟串口在window10上也不能正常识别了,请大家帮忙分析看看是什么原因,谢谢大家!!
...全文
20640 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
拯救BUG小码农 2022-03-22
  • 打赏
  • 举报
回复

楼主最后怎么解决的,我也遇到了,插上USB跳转就出问题,不插屁事没有,但是客户要一直使用的啊

maotoufeifei 2020-11-23
  • 打赏
  • 举报
回复
引用 13 楼 forget345 的回复:
没有在听 ? system_stm32f10x.c 中的 SystemInit() 里有这段代码
#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif 
SystemInit 在 启动文件中有调用,除非你将它屏蔽了
; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP
你应该做的是 将 VECT_TAB_OFFSET 设置为 你要的值
#define VECT_TAB_OFFSET   0x5000
VECT_TAB_OFFSET 之前这个偏移地址也已经设置过,跳转时没有问题的,只不过设置的地方不对,导致APP起来运行一下就挂住了,改到usart 和 usb虚拟串口重新初始化完成之后在设置就好了。
forget345 2020-11-20
  • 打赏
  • 举报
回复
没有在听 ?
system_stm32f10x.c 中的 SystemInit() 里有这段代码
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif
SystemInit 在 启动文件中有调用,除非你将它屏蔽了
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP

你应该做的是 将 VECT_TAB_OFFSET 设置为 你要的值
#define VECT_TAB_OFFSET   0x5000
maotoufeifei 2020-11-20
  • 打赏
  • 举报
回复
IAP 升级后跳转到APP后,中断向量的地址变了,是需要重新设置的。
forget345 2020-11-19
  • 打赏
  • 举报
回复
SCB->VTOR 这个东西 在调用 SystemInit () 的时候就调用了,你只要 改 VECT_TAB_OFFSET 就可以了啊,为啥要在 main 里再次设置?
maotoufeifei 2020-11-19
  • 打赏
  • 举报
回复
修改了一下,把中断向量重定向放在usb 和 串口初始化完成后,就OK。

int main(void)
{ 
    volatile u16 adcx;
     
    INTX_DISABLE();
    //SCB->VTOR = FLASH_BASE | 0x00005000UL;
    USB_Config();
    USB_Cable_Config(ENABLE);
    uart_init(UART_BAUDRATE);
    GPIO_Configuration();  //PB6/PB7 LED0-1
    SPI_Configuration(); /*SPI1, CS->GPIOA PIN4/5/6/7*/
    peripherals_init();
    SCB->VTOR = FLASH_BASE | 0x00005000UL; //移到这个位置
    INTX_ENABLE();
    //Flash_Configuration();
    led_on(LED_ALL);
    printf("0123456789\r\n");
    printf("abcdefghjk\r\n");
    printf("xxxxxxxxxx\r\n");  //boot跳转后,从串口输出在这里停止了。后面Display_UWBInfo(1);也有printf 输出,但是没有打印出来
    //RTC_Alarm_Configuration();//Init RTC ALARM   
     //MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR, (u32)DMA_USART_Buff, 3000);  
    //USART_DMACmd(USART1, USART_DMAReq_Tx,ENABLE); //DMA
    Display_UWBInfo(1);
    waittingForCleConfig(0);
 
return 0;
}
有人能帮忙解释一下什么原因么??
maotoufeifei 2020-11-18
  • 打赏
  • 举报
回复
好的,谢谢!
ZzzYc.. 2020-11-17
  • 打赏
  • 举报
回复
我用f103RCT6做了一个IAP远程升级,需要的话可以发给你,2107772670qq
茸茸侯 2022-08-16
  • 举报
回复
@ZzzYc.. 请问可以分享给我一份吗?非常感谢
maotoufeifei 2020-11-16
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
挂住要分析一下挂在什么位置,再分析是什么代码,再找解决方案
从串口打印的调试信息看是在USB虚拟串口发送请求之前就挂了,请教一下有什么方法确认或者分析挂的具体位置呢?
maotoufeifei 2020-11-16
  • 打赏
  • 举报
回复
引用 4 楼 帮帮你我她 的回复:
使用虚拟串口的方法不好吧,直接用串口就不会有这个问题,虚拟串口重新初始化前要反初始化的,建议在APP中不要开定时器和看门狗可以使用机外看门恶狗,跳转记得前反初始化,内存区也尽量分开使用,不分开使用记得变量重新赋值后使用
1、 用USB虚拟串口,是因为主控设备只有USB端口可以连接,同过虚拟串口实时上报收集的数据信息给主控设备。 2、内存本来就比较小,分开使用的话担心后面功能扩展后不够用。另外请教一下,内存分开是不是和ROM一样,配置分开就行了??如下图配置 3、 从我目前的代码上看应该是跳转之后没有反初始化,今天马上测试一下看看
maotoufeifei 2020-11-16
  • 打赏
  • 举报
回复
引用 2 楼 dancingmoon08 的回复:
使用的是哪个芯片?
用的是STM32 F103TB, 使用USB虚拟串口,连接主控设备
帮帮你我她 2020-11-14
  • 打赏
  • 举报
回复
使用虚拟串口的方法不好吧,直接用串口就不会有这个问题,虚拟串口重新初始化前要反初始化的,建议在APP中不要开定时器和看门狗可以使用机外看门恶狗,跳转记得前反初始化,内存区也尽量分开使用,不分开使用记得变量重新赋值后使用
worldy 2020-11-13
  • 打赏
  • 举报
回复
挂住要分析一下挂在什么位置,再分析是什么代码,再找解决方案
dancingmoon08 2020-11-13
  • 打赏
  • 举报
回复
使用的是哪个芯片?
dancingmoon08 2020-11-13
  • 打赏
  • 举报
回复
跳转之前要注意把所有用过的资源全部复位,尤其是中断问题。

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧