搜索
bottom↓
回复: 19

基于F103+W5500的TFTP方案的bootloader和APP之间的跳转问题

[复制链接]

出0入4汤圆

发表于 2020-8-28 15:09:17 | 显示全部楼层 |阅读模式
100汤圆
本帖最后由 leebilly007 于 2020-8-28 15:38 编辑

平台:STM32F103CBT6 + W5500 + IAR Arm 8.42.1

程序使用的是MXCube 直接生成的工程,使用的HAL库。

软件的设置:



问题描述:
1、全新的电路板的情况下,用stlink v2 烧写bootloader,程序会正常加载APP程序,但在加载完成重启之后,运行完bootloader之后无法正常进入APP程序,程序进入HardFault_Handler(void);

2、全新的电路板的情况下,用stlink v2 分别烧写bootloader 和 APP 程序,程序正常运行,跳转以及所有的功能均正常。且通过WEB打开升级开关,也能正常的从TFTP服务器加载最新的APP程序。但此时分为两种情况,
        ⑴ 新加载的APP程序如果与之前的APP程序没有任何改动的情况下,正常加载之后一切正常,所有功能正常。
        ⑵ 新加载的APP程序如果是修改且编译生成之后的,那情况与1、的情况相同,即无法从bootloader跳转至APP程序。

附上跳转的程序:
1、bootloader跳转至APP:
void reboot_app(void)
{
  pFunction Jump_To_Application;
  uint32 JumpAddress;
  
  HAL_DeInit();
  __disable_irq();
  HAL_RCC_DeInit();
  HAL_NVIC_DisableIRQ(RCC_IRQn);
  
  JumpAddress = *(__IO vu32*) (ApplicationAddress + 0x00000004);
  Jump_To_Application = (pFunction) JumpAddress;
  //initialize user application's stack pointer
   __set_MSP(*(__IO uint32_t *)ApplicationAddress);       
  Jump_To_Application();
}

2、APP跳转至bootloader(重启)
void reboot(void)
{
  HAL_DeInit();

  HAL_RCC_DeInit();
  HAL_NVIC_DisableIRQ(RCC_IRQn);
  HAL_TIM_Base_Stop_IT(&htim1);
  
  pFunction Jump_To_Application;
  uint32 JumpAddress;

  JumpAddress = *(vu32*) (FLASH_BASE + 0x00000004);
  Jump_To_Application = (pFunction) JumpAddress;
  //initialize user application's stack pointer
   __set_MSP(*(__IO uint32_t *)FLASH_BASE);       
  Jump_To_Application();
}

3、APP程序 main()开头的语句

NVIC_SetVectorTable(FLASH_BASE,0x8000);
  __ASM("CPSIE  I");   // 开启中断      
  __enable_irq();   // 开启所以中断
  __enable_fault_irq();
       
基于以上的信息,请帮忙分析问题的原因,并给出正确的解决办法,有任何疑问也请留言提出。谢谢。

附件: 您需要 登录 才可以下载或查看,没有帐号?注册

出12610入4088汤圆

发表于 2020-8-28 15:13:57 来自手机 | 显示全部楼层
请删除大字体的格式。

发帖的时候已经有提醒。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

 楼主| 发表于 2020-8-28 15:39:13 | 显示全部楼层
armok. 发表于 2020-8-28 15:13
请删除大字体的格式。

发帖的时候已经有提醒。

已修改,谢谢。

出40入42汤圆

发表于 2020-8-28 15:59:53 | 显示全部楼层
程序进入HardFault_Handler(void)

可以先确定一下是从BootLoader进的还是从APP进的
一般是中断向量表的问题

出0入0汤圆

发表于 2020-8-28 16:25:01 来自手机 | 显示全部楼层
这种一般都是IAP中使用外设没有复位,运行APP时导致异常。可以上电的时候判断是否升级,不升级则直接跳转,如果要升级就运行IAP,升级完成后再直接跳转。不要在IAP中使用外设后直接跳转。

出0入4汤圆

 楼主| 发表于 2020-8-28 22:36:22 | 显示全部楼层
落叶知秋 发表于 2020-8-28 15:59
可以先确定一下是从BootLoader进的还是从APP进的
一般是中断向量表的问题

明白,这是一个思路,先试试看

出0入4汤圆

 楼主| 发表于 2020-8-29 10:22:12 | 显示全部楼层
lingdianhao 发表于 2020-8-28 16:25
这种一般都是IAP中使用外设没有复位,运行APP时导致异常。可以上电的时候判断是否升级,不升级则直接跳转, ...

IAP中用到了uart,用来printf,SPI2用来驱动W5500,和软件模拟的I2C用来驱动一个外部24C08,且都没开中断,IAP程序开始时就判断是否需要升级,不需要的话直接跳转

出0入4汤圆

 楼主| 发表于 2020-9-4 18:16:28 | 显示全部楼层
落叶知秋 发表于 2020-8-28 15:59
可以先确定一下是从BootLoader进的还是从APP进的
一般是中断向量表的问题


目前大致可以判断是从APP程序进的,或者说,问题就是出在APP的中断向量表上。
理由是:用编译器下载程序之后,程序能够正常跳转,一切功能都正常。而且,用之前编译器下载时正常的bin文件进行升级,也是一切正常。
但程序但凡做了任何一点点修改(比如,之前两个灯一起闪烁,改为只闪烁一个灯,仅此而已),编译之后产生的bin文件再进行升级,就会出现无法跳转的问题。

从F103的ROM里可以看出端倪,

两个灯闪烁的bin文件,这是已经烧写至单片机内的,通过stlink读出来的。

一个灯闪烁的bin文件

可以看出,修改了一行代码之后,中断向量表就发生了偏移,此时如果通过TFTP将图二的bin文件(一个灯闪烁)烧进单片机,就会出现无法跳转的问题。
但如果通过MDK直接烧写到单片机,就可以运行。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出40入42汤圆

发表于 2020-9-4 21:25:17 | 显示全部楼层
leebilly007 发表于 2020-9-4 18:16
目前大致可以判断是从APP程序进的,或者说,问题就是出在APP的中断向量表上。
理由是:用编译器下载程序 ...

你应该找找改程序后向量表偏移了的原因

出0入0汤圆

发表于 2020-9-4 21:36:21 来自手机 | 显示全部楼层
我做stm32l,类似应用时,app到boot,是写一个标志位,在eep或者flash中。然后软件复位。boot一开始,先判断标志位,无效就检查app的复位向量地址是否有效,如果,如果有效,还要检查app的固定地址是否有预定的字符串描述,都满足,才跳转到app。这之前是不初始化任何外设的。如果跳转条件不满足,就跑boot。然后初始化个个外设。因为我的应用是usb mscboot,所以就初始化usb。下完app固件后,不要跳转到app,而是去除标志位,然后直接软件复位。

出0入4汤圆

 楼主| 发表于 2020-9-5 10:37:13 | 显示全部楼层
落叶知秋 发表于 2020-9-4 21:25
你应该找找改程序后向量表偏移了的原因

但似乎这个偏移并不是引起无法跳转的原因,因为用这个bin文件。
比如,先编译,生成了一个bin文件,通过TFTP成功加载至单片机之后,无法跳转至APP运行的。
然后,程序不动的情况下,直接点MDK里的Download(F8),复位之后程序却可以正常运行。

出0入0汤圆

发表于 2020-9-5 13:18:00 | 显示全部楼层
NVIC_SetVectorTable(FLASH_BASE,0x8000);

/*
这里务必加入时钟或中断的初始化代码,不然还是继续bootloader的初始化结果,导致异常。
*/

  __ASM("CPSIE  I");   // 开启中断      
  __enable_irq();   // 开启所以中断
  __enable_fault_irq();

出40入42汤圆

发表于 2020-9-5 14:36:43 | 显示全部楼层
leebilly007 发表于 2020-9-5 10:37
但似乎这个偏移并不是引起无法跳转的原因,因为用这个bin文件。
比如,先编译,生成了一个bin文件,通过T ...

根据你这个帖子的描述,现在的问题不是无法跳转,而是程序无法正常运行

而你在楼主位的帖子里已经说明了,程序进入了HardFault_Handler(void),就是异常中断
在后面的帖子里,你判断“大致”的问题在中断向量表,那不去查这个偏移的问题,应该去查啥呢?

建议还是把程序无法正常运行的原因确定下来,再去找问题所在
比如把所有中断关掉,测试闪灯就用for()循环来延时,看两种方式能不能正常运行,这样就能判断原因是否在中断向量表

出0入4汤圆

 楼主| 发表于 2020-9-8 17:57:17 | 显示全部楼层
落叶知秋 发表于 2020-9-5 14:36
根据你这个帖子的描述,现在的问题不是无法跳转,而是程序无法正常运行

而你在楼主位的帖子里已经说明了 ...


前面扽描述可能有点混乱,部分还有误,抱歉,昨天重新试了很多次之后,认真记录了,有如下结论和现象:

测试步骤:
1、用网上一个完整例程的MDK工程进行测试的。bootloader程序跟之前几乎一样,APP就只剩下点灯灭灯的程序。

2、如果先对芯片进行erase,然后烧写bootloader,重启之后,TFTP程序自动加载app,不管是之前那个复杂的APP,还是后来这个简单的点灯APP,加载完成之后,都能正常运行,正常跳转,一切正常。

结论:只要进行全芯片擦除,跳转正常,功能正常。由此判断,TFTP程序正常。

3、在第2步加载正常的情况下,对点灯灭灯的APP进行修改(增加一个灯),之后编译,得到一个新的bin文件。此时进行了两种不同的测试。
        1) 重启单片机,让tftp自动加载新的APP,此时无法正常跳转。
        2)直接点击MDK中的Download下载进去,重启之后一切正常,功能正常,跳转正常。

结论:不管程序是否修改,如果用MDK的download下载程序,一切正常,跳转正常,功能正常。由此判断:跳转部分程序正常,中断向量表正常

4、不管是第1步中全芯片擦除之后加载,还是第2步中用MDK的download下载,正常运行的程序,只要不修改程序,此bin文件再通过TFTP加载进单片机,也能正常加载,正常运行,正常跳转。

出0入4汤圆

 楼主| 发表于 2020-9-8 17:59:23 | 显示全部楼层
BongBong 发表于 2020-9-5 13:18
NVIC_SetVectorTable(FLASH_BASE,0x8000);

/*

这里测试过,没有变化。

前面扽描述可能有点混乱,部分还有误,抱歉,昨天重新试了很多次之后,认真记录了,有如下结论和现象:

测试步骤:
1、用网上一个完整例程的MDK工程进行测试的。bootloader程序跟之前几乎一样,APP就只剩下点灯灭灯的程序。

2、如果先对芯片进行erase,然后烧写bootloader,重启之后,TFTP程序自动加载app,不管是之前那个复杂的APP,还是后来这个简单的点灯APP,加载完成之后,都能正常运行,正常跳转,一切正常。

结论:只要进行全芯片擦除,跳转正常,功能正常。由此判断,TFTP程序正常。

3、在第2步加载正常的情况下,对点灯灭灯的APP进行修改(增加一个灯),之后编译,得到一个新的bin文件。此时进行了两种不同的测试。
        1) 重启单片机,让tftp自动加载新的APP,此时无法正常跳转。
        2)直接点击MDK中的Download下载进去,重启之后一切正常,功能正常,跳转正常。

结论:不管程序是否修改,如果用MDK的download下载程序,一切正常,跳转正常,功能正常。由此判断:跳转部分程序正常,中断向量表正常

4、不管是第1步中全芯片擦除之后加载,还是第2步中用MDK的download下载,正常运行的程序,只要不修改程序,此bin文件再通过TFTP加载进单片机,也能正常加载,正常运行,正常跳转。

出0入4汤圆

 楼主| 发表于 2020-9-8 17:59:58 | 显示全部楼层
lingdianhao 发表于 2020-8-28 16:25
这种一般都是IAP中使用外设没有复位,运行APP时导致异常。可以上电的时候判断是否升级,不升级则直接跳转, ...

前面扽描述可能有点混乱,部分还有误,抱歉,昨天重新试了很多次之后,认真记录了,有如下结论和现象:

测试步骤:
1、用网上一个完整例程的MDK工程进行测试的。bootloader程序跟之前几乎一样,APP就只剩下点灯灭灯的程序。

2、如果先对芯片进行erase,然后烧写bootloader,重启之后,TFTP程序自动加载app,不管是之前那个复杂的APP,还是后来这个简单的点灯APP,加载完成之后,都能正常运行,正常跳转,一切正常。

结论:只要进行全芯片擦除,跳转正常,功能正常。由此判断,TFTP程序正常。

3、在第2步加载正常的情况下,对点灯灭灯的APP进行修改(增加一个灯),之后编译,得到一个新的bin文件。此时进行了两种不同的测试。
        1) 重启单片机,让tftp自动加载新的APP,此时无法正常跳转。
        2)直接点击MDK中的Download下载进去,重启之后一切正常,功能正常,跳转正常。

结论:不管程序是否修改,如果用MDK的download下载程序,一切正常,跳转正常,功能正常。由此判断:跳转部分程序正常,中断向量表正常

4、不管是第1步中全芯片擦除之后加载,还是第2步中用MDK的download下载,正常运行的程序,只要不修改程序,此bin文件再通过TFTP加载进单片机,也能正常加载,正常运行,正常跳转。

出40入42汤圆

发表于 2020-9-8 19:50:55 | 显示全部楼层
leebilly007 发表于 2020-9-8 17:57
前面扽描述可能有点混乱,部分还有误,抱歉,昨天重新试了很多次之后,认真记录了,有如下结论和现象:

...

根据这个描述,觉得是TFTP在存在APP的情况下,再加载一个新的APP的话,会出问题

MDK下载功能是根据分散加载文件设定的地址进行擦写的,地址肯定不会有问题的,但自己写的TFTP就不一定没有BUG了

出0入0汤圆

发表于 2020-9-9 12:40:00 | 显示全部楼层
leebilly007 发表于 2020-9-8 17:59
这里测试过,没有变化。

前面扽描述可能有点混乱,部分还有误,抱歉,昨天重新试了很多次之后,认真记录 ...

3、在第2步加载正常的情况下,对点灯灭灯的APP进行修改(增加一个灯),之后编译,得到一个新的bin文件。此时进行了两种不同的测试。
        1) 重启单片机,让tftp自动加载新的APP,此时无法正常跳转。
        2)直接点击MDK中的Download下载进去,重启之后一切正常,功能正常,跳转正常。

/*
   (为什么不此时将flash读出来比较下与直接下进去的是否一样。)
    如果不一样:显然这是什么原因就明了了。
    如果又一样呢?
*/

出0入0汤圆

发表于 2020-9-14 10:00:22 | 显示全部楼层
楼主您好,我能知道你的项目中使用的W5500以太网芯片晶振的具体型号吗?我手头上的EVB板子是2500TE52DA,这玩意儿网上搜不到

出0入4汤圆

 楼主| 发表于 2020-9-14 16:53:07 | 显示全部楼层
BSMGood 发表于 2020-9-14 10:00
楼主您好,我能知道你的项目中使用的W5500以太网芯片晶振的具体型号吗?我手头上的EVB板子是2500TE52DA,这 ...

YSX321SL 25MHZ 20PF 10PPM -40~+85℃  
YXC扬兴科技   X322525MSB4SI
嘉立创编号:C13740
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2022-7-2 15:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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