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

STM32F7 IAP跳转的问题,高手进

[复制链接]
小小小小强 提问时间:2018-10-26 18:19 /
IAP程序参考ST官方例程,只是做了开发板的视频,app程序是一个非常简单的程序,只配置了uart作为调试信息输出。app main函数如下:
int main(void)
{
  __disable_irq();
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  printf("!!!!!!!!!inintt ok\r\n");
  MX_TIM14_Init();
  HAL_Delay(5);
  printf("!!!!!!!!!ddd\r\n");
  while(1)
{

}
}

IAP跳转部分代码为:
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
    {
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
                        //printf("JumpAddress:0x%x,msp:0x%x\r\n",JumpAddress,*(__IO uint32_t*) APPLICATION_ADDRESS);
      JumpToApplication = (pFunction) JumpAddress;
      /* Initialize user application's Stack Pointer */
                        HAL_RCC_DeInit();
                        app_nvic_deinit();
                        __disable_irq();
      __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
      JumpToApplication();
    }

现在跳转后出现的现象是:HAL_Delay前的打印信息能够正常输出,HAL_Delay后的则异常,从ST例程的readme.txt中有如下描述:
@note Care must be taken when using HAL_Delay(), this function provides accurate delay (in milliseconds)
      based on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from
      a peripheral ISR process, then the SysTick interrupt must have higher priority (numerically lower)
      than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
      To change the SysTick interrupt priority you have to use HAL_NVIC_SetPriority() function.

然后修改了中断优先级,以前优先级都为0,现在把systick以外的中断优先级修改为4,systick为0,修改后的优先级为:
HAL_NVIC_SetPriority(MemoryManagement_IRQn, 4, 0);
  HAL_NVIC_SetPriority(BusFault_IRQn, 4, 0);
  HAL_NVIC_SetPriority(UsageFault_IRQn, 4, 0);
  HAL_NVIC_SetPriority(SVCall_IRQn, 4, 0);
  HAL_NVIC_SetPriority(DebugMonitor_IRQn, 4, 0);
  HAL_NVIC_SetPriority(PendSV_IRQn, 4, 0);
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);     

用修改后的app程序测试,跳转后现象是一样的,都是HAL_Delay前的正常,HAL_Delay后没有执行。
问了ST FAE,回复是应用程序问题,但是应用没有其他代码了。只有注释掉HAL_Delay就正常。还请坛子里各位高手指点。

收藏 1 评论15 发布时间:2018-10-26 18:19

举报

15个回答
小小小小强 回答时间:2018-10-26 18:44:44
我还发现一个问题,我的应用是带freertos,如果带操作系统,IAP跳转后也不能正常的运行。跪求各位高手指点
小小小小强 回答时间:2018-10-27 09:03:30
继续等高手来解答
队长shiwo 回答时间:2018-10-29 10:55:08
#define BootloaderAddress          0x08000000           // STM32_INFLASH_SECTOR_0_ADDRESS
#define ApplicationAddress         0x08040000           // STM32_INFLASH_SECTOR_6_ADDRESS
typedef  void (*pFunction)(void);
uint32_t JumpAddress;
pFunction Jump_To_Application;
pFunction Jump_To_Bootloader;

void EXE_ISP_Jump_ApplicationCode(void)
{
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);

Jump_To_Application = (pFunction) JumpAddress;

__set_MSP(*(__IO uint32_t*) ApplicationAddress);

Jump_To_Application();
}

F207的跳转,可以参考下

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

zzccww 回答时间:2018-10-29 11:03:11
打开中断,并且中断向量要记得重映射,HAL_Delay函数需要在中断里执行

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

废鱼 回答时间:2018-10-29 11:11:59
HAL需要开启systick中断。是不是因为systick被关闭导致。如果直接烧写应用程序,是否正常运行。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

小小小小强 回答时间:2018-10-30 18:38:09
zzccww 发表于 2018-10-29 11:03
打开中断,并且中断向量要记得重映射,HAL_Delay函数需要在中断里执行

”HAL_Delay需要在中断里执行“是什么意思?应用函数在启动的时候会初始化ethernet等设备,驱动会调用HAL_DELAY
小小小小强 回答时间:2018-10-30 18:38:58
安 发表于 2018-10-29 11:11
HAL需要开启systick中断。是不是因为systick被关闭导致。如果直接烧写应用程序,是否正常运行。 ...

HAL_Delay tick是来演于TIM14,没有用systick作为源
小小小小强 回答时间:2018-10-30 18:40:50
现在能够正常跳转了,但还是不能调用HAL_Delay,一旦调用后就卡住了。现在HAL_Delay的tick来源于TIM14,没有用systick,TIM14中断优先级为0,所以不知道为什么TIM14的中断没有触发
小小小小强 回答时间:2018-10-30 19:06:31
队长shiwo 发表于 2018-10-29 10:55
#define BootloaderAddress          0x08000000           // STM32_INFLASH_SECTOR_0_ADDRESS
#define Applicati ...

谢谢,我尝试过你的办法,能够跳转。但现在主要问题跳转后调用HAL_Delay卡住
废鱼 回答时间:2018-10-31 09:16:07
楼主看一下是不是初始化TIM14时进入的HA_DELAY。如果是这样,只能将计时器加入到systick中去解决这个问题。
从现象分析,就是因为TIM14并未正常开启。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

小小小小强 回答时间:2018-12-27 08:20:00
现在问题已经解决,但是是采用规避的办法,没有找到最终的原因。刚开始时IAP里加了lwip,freertos,通过网络下载新的固件,然后写入到应用程序区域,现在修改为在应用里面下载新的固件,写入到flash一个区域,然后重启进入OTA,OTA从缓存flash区域读出数据,然后写入到应用程序区域.
a45541 回答时间:2019-11-19 10:36:59
我也遇到了这个现象,能够从IAP正常跳转到应用程序,但会在应用程序的HAL_DELAY()函数死机。重写HAL_DELAY()函数可以解决 ,但是根本原因没找到。
butterflyspring 回答时间:2019-11-21 17:54:51
HAL_DELAY()对应systic的中断服务程序。 跳转到APP后,向量表重新映射,所以新的中断服务程序中也需要对应的函数内容才能运行。
MissOne 回答时间:2021-1-19 09:02:16
我也遇到这个情况了。有人解决没有啊?官方有说法没?
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版