硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4421|回复: 12
收起左侧

[有问必答] 请问代码直接跳转ISP谁实现过?

[复制链接]

36

主题

1446

回帖

1554

积分

至尊会员

积分
1554
发表于 2019-7-21 20:18:50 | 显示全部楼层 |阅读模式
最近需要使用F2系列,代码中直接跳转到ISP,然后使用DFU进行代码升级,这样就不需要操作BOOT引脚了,这种方式哪位大佬实现过呢?我测试没成功呢。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107098
QQ
发表于 2019-7-22 08:27:21 | 显示全部楼层
可以成功的,之前还有个群友搞过一次,USB DFU要注意事情比较多,特别是他那个上位机软件,比较难用。可以先用串口的测试下。

回复

使用道具 举报

36

主题

1446

回帖

1554

积分

至尊会员

积分
1554
 楼主| 发表于 2019-7-22 09:16:17 | 显示全部楼层
eric2013 发表于 2019-7-22 08:27
可以成功的,之前还有个群友搞过一次,USB DFU要注意事情比较多,特别是他那个上位机软件,比较难用。可以 ...

好的,我已经可以直接跳转了,之前是因为地址错了。我来试试下载成功率咋样。感谢老大的帮助!
回复

使用道具 举报

335

主题

2039

回帖

3049

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3049
发表于 2019-11-5 08:39:24 | 显示全部楼层
sanit 发表于 2019-7-22 09:16
好的,我已经可以直接跳转了,之前是因为地址错了。我来试试下载成功率咋样。感谢老大的帮助!

求软件内部直接跳转到isp模式的函数代码。 stm32F4系列,感谢!
回复

使用道具 举报

7

主题

125

回帖

146

积分

初级会员

积分
146
发表于 2019-11-5 09:25:39 | 显示全部楼层
caicaptain2 发表于 2019-11-5 08:39
求软件内部直接跳转到isp模式的函数代码。 stm32F4系列,感谢!

Jump to system memory from software on STM32
这个可以的
回复

使用道具 举报

36

主题

1446

回帖

1554

积分

至尊会员

积分
1554
 楼主| 发表于 2019-11-5 09:56:01 | 显示全部楼层
/* 跳转变量 */
typedef  void  (*pAppFunction) (void);
pAppFunction   application;
uint32_t app_address;
#define APP_LOADED_ADDR_START       0x1FFF0000  /* 跳转起始地址 */

在main函数中实现跳转:
    /*if (((*(__IO uint32_t*)APP_LOADED_ADDR_START) & 0x2FFE0000) == 0x20000000)*///已经注释
    {
      app_address = *(__IO uint32_t*) (APP_LOADED_ADDR_START + 4);
      application = (pAppFunction) app_address;

      /* initialize user application's stack pointer */
      __set_MSP(*(__IO uint32_t*) APP_LOADED_ADDR_START);

      /* jump to user application */
      application();
    }

在STM32F205系列已经成功实现。

回复

使用道具 举报

335

主题

2039

回帖

3049

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3049
发表于 2019-11-7 09:40:38 | 显示全部楼层
sanit 发表于 2019-11-5 09:56
/* 跳转变量 */
typedef  void  (*pAppFunction) (void);
pAppFunction   application;

我碰到一个问题,跳转成功后,原程序的看门狗还在运行,而且关闭不了,几秒后自动重启了。。。。。

那么,我跳转前,强行把看门狗设定成最大值,也只有30秒左右。必须在这30秒内连接上st的串口下载软件,才能保证继续运行isp的步骤。有点头疼
回复

使用道具 举报

36

主题

1446

回帖

1554

积分

至尊会员

积分
1554
 楼主| 发表于 2019-11-7 11:51:12 | 显示全部楼层
caicaptain2 发表于 2019-11-7 09:40
我碰到一个问题,跳转成功后,原程序的看门狗还在运行,而且关闭不了,几秒后自动重启了。。。。。

那 ...

我测试好像没开看门狗,这个问题就不太清楚了
回复

使用道具 举报

7

主题

125

回帖

146

积分

初级会员

积分
146
发表于 2019-11-8 01:36:01 | 显示全部楼层
caicaptain2 发表于 2019-11-7 09:40
我碰到一个问题,跳转成功后,原程序的看门狗还在运行,而且关闭不了,几秒后自动重启了。。。。。

那 ...

st的独立开门狗一旦开了,就关不掉了,除非硬件复位,以前项目里踩过一次坑
回复

使用道具 举报

36

主题

1446

回帖

1554

积分

至尊会员

积分
1554
 楼主| 发表于 2019-11-8 10:06:24 | 显示全部楼层
caicaptain2 发表于 2019-11-7 09:40
我碰到一个问题,跳转成功后,原程序的看门狗还在运行,而且关闭不了,几秒后自动重启了。。。。。

那 ...

软件重启看门狗应该会关闭。那么你需要跳转的话,先写入一个标志,然后软件重启,然后判断标志之后在进行跳转【这次不要开看门狗】,这样你试试
回复

使用道具 举报

2

主题

16

回帖

22

积分

新手上路

积分
22
发表于 2020-4-7 18:09:28 | 显示全部楼层
跳转不过去,必须操作boot0,用的v6的开发版,stm32f429,楼主帮忙检查一下。
程序流程是:
1、检测按键,按下就在备份寄存器写入标志,然后复位;
2、程序开头检测备份寄存器的标志,如果标志正确就跳转到系统存储区。
代码如下:
  1. typedef  void (*pFunction)(void);
  2. pFunction Jump_To_Application;
  3. uint32_t JumpAddress;
  4. #define APPLICATION_ADDRESS   0x1FFF0000

  5. //跳转到应用程序区
  6. static void JumpToApp(void)
  7. {
  8.     JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
  9.         /* 用户应用地址 */
  10.         Jump_To_Application = (pFunction) JumpAddress;
  11.         /* 初始化MSP */
  12.         __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
  13.         Jump_To_Application();
  14. }
  15. void Boot_Start(void)
  16. {
  17.         /* 电源接口时钟使能 (Power interface clock enable) */
  18.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  19.         /* DBP 位置 1,使能对备份域的访问 */
  20.         PWR_BackupAccessCmd(ENABLE);
  21.         RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div2);
  22.         RCC_RTCCLKCmd(ENABLE);
  23.         if(RTC_ReadBackupRegister(RTC_BKP_DR0) == 0xE0E0)
  24.         {
  25.                
  26.                
  27.                 //Delay_Ms(100);
  28.                 RTC_WriteBackupRegister(RTC_BKP_DR0, 0x0);
  29.                 //Delay_Ms(100);
  30.                
  31.                 RCC_RTCCLKCmd(DISABLE);
  32.                 PWR_BackupAccessCmd(DISABLE);
  33.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, DISABLE);
  34.                
  35.                 JumpToApp();//跳转到应用程序区
  36.                
  37.                 while(1)
  38.                 {
  39.                 };
  40.         }
  41.         else
  42.         {
  43.                 RCC_RTCCLKCmd(DISABLE);
  44.                 PWR_BackupAccessCmd(DISABLE);
  45.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, DISABLE);
  46.         }
  47. }

  48. void SoftReset(void)
  49. {
  50.     __set_FAULTMASK(1);
  51.     NVIC_SystemReset();
  52. }


  53. void Boot_Reset(void)
  54. {
  55.         /* 电源接口时钟使能 (Power interface clock enable) */
  56.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  57.         /* DBP 位置 1,使能对备份域的访问 */
  58.         PWR_BackupAccessCmd(ENABLE);
  59.         RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div2);
  60.         RCC_RTCCLKCmd(ENABLE);
  61.        
  62.         RTC_WriteBackupRegister(RTC_BKP_DR0, 0xE0E0);
  63.        
  64.         if(RTC_ReadBackupRegister(RTC_BKP_DR0) == 0xE0E0)
  65.         {
  66.                 SoftReset();
  67.                 while(1);
  68.         }
  69. }
复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107098
QQ
发表于 2020-4-7 18:44:57 | 显示全部楼层
yuyewoniu 发表于 2020-4-7 18:09
跳转不过去,必须操作boot0,用的v6的开发版,stm32f429,楼主帮忙检查一下。
程序流程是:
1、检测按键 ...

V6板子已经发布对应例程了,学习下
http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255&extra=page%3D1

111111.png
回复

使用道具 举报

2

主题

16

回帖

22

积分

新手上路

积分
22
发表于 2020-4-7 20:09:46 | 显示全部楼层
eric2013 发表于 2020-4-7 18:44
V6板子已经发布对应例程了,学习下
http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255&extra=pa ...

谢谢老大、、、、、、
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-17 10:12 , Processed in 0.202247 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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