硬汉嵌入式论坛

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

[技术讨论] 请教一下关于跳转系统bootloader的问题

[复制链接]

1

主题

6

回帖

9

积分

新手上路

AA55

积分
9
发表于 2020-4-9 11:09:27 | 显示全部楼层 |阅读模式
参照硬汉哥发的V6的跳转系统Boot进行串口IAP升级教程,目前是在移植到F103ZET上,代码如下
  1. static void JumpToBootloader(void)
  2. {
  3.         uint32_t i=0;
  4.         void (*SysMemBootJump)(void);        /* 声明一个函数指针 */
  5.         __IO uint32_t BootAddr = 0x1FFFF000; /* STM32F1的系统BootLoader地址 */

  6.         /* 关闭全局中断 */
  7.         DISABLE_INT();

  8.         /* 关闭滴答定时器,复位到默认值 */
  9.         SysTick->CTRL = 0;
  10.     SysTick->LOAD = 0;
  11.     SysTick->VAL = 0;

  12.         /* 设置所有时钟到默认状态,使用HSI时钟 */
  13.         RCC_DeInit();

  14.         /* 关闭所有中断,清除所有中断挂起标志 */
  15.         for (i = 0; i < 8; i++)
  16.         {
  17.                 NVIC->ICER[i]=0xFFFFFFFF;
  18.                 NVIC->ICPR[i]=0xFFFFFFFF;
  19.         }       

  20.         /* 使能全局中断 */
  21.         ENABLE_INT();

  22.         /* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
  23.         SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));

  24.         /* 设置主堆栈指针 */
  25.         __set_MSP(*(uint32_t *)BootAddr);
  26.        
  27.         /* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
  28.         __set_CONTROL(0);

  29.         /* 跳转到系统BootLoader */
  30.         SysMemBootJump();

  31.         /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
  32.         while (1)
  33.         {
  34.                 bsp_LedOn(1);
  35.         }
  36. }
复制代码
当前是通过程序正常启动后,通过串口1发送字符‘6’,进行跳转
  1. static void TestDemo(void)
  2. {
  3.         uint8_t ucData;
  4.        
  5.         /* 轮询测试demo命令 */
  6.         if(comGetChar(COM1,&ucData))
  7.         {
  8.                 switch(ucData)
  9.                 {
  10.                         case '1':
  11.                                 RunWaterLed();                /* 流水灯测试 */
  12.                                 DispMenu();
  13.                                 break;
  14.                        
  15.                         case '2':
  16.                                 DemoSpiFlash();                /* SPI_flash测试demo */
  17. //                                printf("测试未添加\r\n");
  18.                                 DispMenu();
  19.                                 break;
  20.                        
  21.                         case '3':
  22.                                 DemoFatFS_SpiFlash();                /* Fatfs测试demo */
  23. //                                printf("测试未添加\r\n");
  24.                                 DispMenu();
  25.                                 break;
  26.                        
  27.                         case '4':
  28.                                 DemoFatFS_SDcard();                /* Fatfs测试demo */
  29. //                                printf("测试未添加\r\n");
  30.                                 DispMenu();
  31.                                 break;
  32.                        
  33.                         case '5':
  34.                                 DemoEEPROM();                /* eeprom测试demo */
  35.                                 DispMenu();
  36.                                 break;
  37.                        
  38.                         case '6':
  39. //                                printf("\r\n跳转至系统BOOT");
  40.                                 bsp_LedOn(2);
  41.                                 JumpToBootloader();
  42. //                                DispMenu();
  43.                                 break;
  44.                        
  45.                        
  46.                         default:
  47.                                 DispMenu();        /* 无效命令,重新打印命令提示 */
  48.                                 break;
  49.                 }
  50.         }
  51. }
复制代码
目前测试,好像是跳转成功了,LED1没有亮,但是设备管理器上识别出来不是STM Bootloader, 用STM32CubeProg也连接不上,请问会是什么问题导致的呢?

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-4-9 11:36:46 | 显示全部楼层
不使用程序跳转,手动设置boot引脚看看是否正常。

如果板子没有boot引脚引出来,飞线出来。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

AA55

积分
9
 楼主| 发表于 2020-4-9 11:47:46 | 显示全部楼层
eric2013 发表于 2020-4-9 11:36
不使用程序跳转,手动设置boot引脚看看是否正常。

如果板子没有boot引脚引出来,飞线出来。

好的,多谢硬汉哥,下午我试试,我现在板子上是直接用的TTL转USB,芯片用的FT232RL,这个有影响吗? 我看V6手册上是用的H7-TOOL当TTL转USB
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-4-9 12:52:50 | 显示全部楼层
13290663121 发表于 2020-4-9 11:47
好的,多谢硬汉哥,下午我试试,我现在板子上是直接用的TTL转USB,芯片用的FT232RL,这个有影响吗? 我看V ...

FT232应该没问题。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

AA55

积分
9
 楼主| 发表于 2020-4-9 14:07:10 | 显示全部楼层
eric2013 发表于 2020-4-9 12:52
FT232应该没问题。

解决了硬汉哥,粗心了,看样子好像跟识别出来是不是STM32 bootloader没关系,之前是因为我的串口打印重定向的也是串口1,发字符'6'跳转到系统Boot后,得把串口助手的串口断开就连接成功了,多谢,这个烧录程序方便多了,不需要另在在做bootloader了,赞
回复

使用道具 举报

4

主题

128

回帖

140

积分

初级会员

积分
140
发表于 2020-4-9 14:38:13 | 显示全部楼层
原来程序中有看门狗,如何关闭看门狗?否则几秒后就复位重启了。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-4-9 14:55:53 | 显示全部楼层
hance2000 发表于 2020-4-9 14:38
原来程序中有看门狗,如何关闭看门狗?否则几秒后就复位重启了。

这里就有个问题,我还没有测试过,你可以试试

就是你现在新的程序已经没有看门狗了,上个程序的看门狗时间到溢出后,这种情况引起的复位实际是对硬件复位引脚发送的复位脉冲,不知道这种情况看门狗是否已经关闭。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-17 12:58 , Processed in 0.051705 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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