硬汉嵌入式论坛

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

基于V6和V5的系统BootLoader方式实现USB DFU和串口IAP也实现了,无需用户自己做boot了

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2020-2-20 09:26:48 | 显示全部楼层 |阅读模式
本周升级V5和V6的相应HAL库章节。


STM32的系统boot,支持串口,CAN,USB,I2C等程序下载。

现在是上电后直接跳转到系统boot,这样就不需要用户自己写boot了。


已经发布http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255

评分

参与人数 1金币 +20 收起 理由
tiantangzai + 20

查看全部评分

回复

使用道具 举报

6

主题

126

回帖

144

积分

初级会员

积分
144
发表于 2020-2-20 09:35:41 | 显示全部楼层
可以不受BOOT引脚限制吗,那厉害了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-2-20 09:59:08 | 显示全部楼层
role_2099 发表于 2020-2-20 09:35
可以不受BOOT引脚限制吗,那厉害了。

对,不受boot引脚限制。
回复

使用道具 举报

3

主题

90

回帖

99

积分

初级会员

积分
99
发表于 2020-2-20 14:08:29 | 显示全部楼层
请问还没更新百度网盘吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-2-20 14:11:33 | 显示全部楼层
lib钱 发表于 2020-2-20 14:08
请问还没更新百度网盘吗?

这个周末就会更新出来发给大家,现在还在整理教程。
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2020-2-20 15:49:30 | 显示全部楼层
回复

使用道具 举报

91

主题

289

回帖

562

积分

金牌会员

积分
562
发表于 2020-2-20 16:08:25 | 显示全部楼层
非常期待
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-2-20 16:13:31 | 显示全部楼层
QQ截图20200220161242.png
回复

使用道具 举报

32

主题

295

回帖

391

积分

高级会员

积分
391
发表于 2020-2-21 10:17:57 | 显示全部楼层
期待硬汉的系统BootLoader,这个实现思路不是自己写个BOOT,然后BOOT去判断指定地址APP更新标志和版本吗?之前是BOOT上电去判断APP版本和标志,如果需要更新 就执行数据搬移,先执行擦除、在COPY,硬汉这个思路应该比这种更简单有效;
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
发表于 2020-2-21 11:29:38 | 显示全部楼层
可以不受BOOT引脚限制吗,大佬厉害
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-2-21 11:41:33 | 显示全部楼层
sy2009 发表于 2020-2-21 11:29
可以不受BOOT引脚限制吗,大佬厉害

对,不需要boot引脚,可以直接跳转过去。
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
发表于 2020-2-21 12:19:02 | 显示全部楼层
还能系统boot的来做 那方便多了  我到时候也研究研究  大佬辛苦啦
回复

使用道具 举报

2

主题

16

回帖

22

积分

新手上路

积分
22
发表于 2020-4-7 18:59:44 | 显示全部楼层
我用的标准库,V6开发版,无法从应用程序跳转到系统存储区,程序流程是:
1、检测到按键按下后写标志到备份寄存器,然后reset;
2、在主程序开始检测备份寄存器的标志,然后跳转到系统存储区。
现象是备份寄存器标志是对的,但是就是跳转不到系统存储区,或者跳转过去了就是不执行boot程序。

  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

积分
106738
QQ
 楼主| 发表于 2020-4-7 19:46:04 | 显示全部楼层
yuyewoniu 发表于 2020-4-7 18:59
我用的标准库,V6开发版,无法从应用程序跳转到系统存储区,程序流程是:
1、检测到按键按下后写标志到备 ...


V6板子已经发布对应例程了,不管你是寄存器,HAL库,标准库还是LL库,都可以使用
http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255&extra=page%3D1


回复

使用道具 举报

2

主题

16

回帖

22

积分

新手上路

积分
22
发表于 2020-4-7 20:31:54 | 显示全部楼层
eric2013 发表于 2020-4-7 19:46
V6板子已经发布对应例程了,不管你是寄存器,HAL库,标准库还是LL库,都可以使用
http://www.armbbs.c ...

看了文档,找到原因了,是没有把系统boot的地址映射到0x00000000,用V6板子已经成功了。

不过发现另一个问题,为什么用USB_HS的两个引脚的USB口,电脑不能识别USB?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-4-7 21:16:40 | 显示全部楼层
yuyewoniu 发表于 2020-4-7 20:31
看了文档,找到原因了,是没有把系统boot的地址映射到0x00000000,用V6板子已经成功了。

不过发现另一 ...

看V6的教程,教程里面写了支持那个USB接口及其引脚。
回复

使用道具 举报

2

主题

16

回帖

22

积分

新手上路

积分
22
发表于 2020-4-7 21:27:40 | 显示全部楼层
eric2013 发表于 2020-4-7 21:16
看V6的教程,教程里面写了支持那个USB接口及其引脚。

看到了,谢谢。。。。。。
回复

使用道具 举报

2

主题

16

回帖

22

积分

新手上路

积分
22
发表于 2020-4-12 22:28:44 | 显示全部楼层
跳转到Bootloader前不是要关闭中断吗?为什么关了之后又把中断打开了,这样不会有影响吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-4-13 08:17:23 | 显示全部楼层
yuyewoniu 发表于 2020-4-12 22:28
跳转到Bootloader前不是要关闭中断吗?为什么关了之后又把中断打开了,这样不会有影响吗?

方便APP程序中没开启全局中断。
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2020-4-13 14:31:23 | 显示全部楼层
  1. /** @brief  Main Flash memory mapped at 0x00000000
  2.   */
  3. #define __HAL_SYSCFG_REMAPMEMORY_FLASH()             (SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE))

  4. /** @brief  System Flash memory mapped at 0x00000000
  5.   */
  6. #define __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH()       do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\
  7.                                                          SYSCFG->MEMRMP |= SYSCFG_MEMRMP_MEM_MODE_0;\
  8.                                                         }while(0);

  9. /** @brief  Embedded SRAM mapped at 0x00000000
  10.   */
  11. #define __HAL_SYSCFG_REMAPMEMORY_SRAM()       do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\
  12.                                                   SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_0 | SYSCFG_MEMRMP_MEM_MODE_1);\
  13.                                                  }while(0);
复制代码


就是用好这几个映射吧......
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2020-4-13 14:51:55 | 显示全部楼层
另外,文档中有错误的地方,应该是把H7的截图,粘贴到了F4的上面

勘误V6的BootLoader.jpg
回复

使用道具 举报

20

主题

114

回帖

174

积分

初级会员

积分
174
发表于 2020-4-13 15:43:55 | 显示全部楼层
有碰到过这样的问题的吗?多尝试几次后就这样啦

QQ浏览器截图20200413154314.jpg

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-4-13 15:46:08 | 显示全部楼层
morning_enr6U 发表于 2020-4-13 14:51
另外,文档中有错误的地方,应该是把H7的截图,粘贴到了F4的上面


谢谢,我记录下。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-4-13 15:47:20 | 显示全部楼层
magicoctoier 发表于 2020-4-13 15:43
有碰到过这样的问题的吗?多尝试几次后就这样啦

貌似串口线不稳。
回复

使用道具 举报

20

主题

114

回帖

174

积分

初级会员

积分
174
发表于 2020-4-13 16:04:19 | 显示全部楼层
eric2013 发表于 2020-4-13 15:47
貌似串口线不稳。

一测试果然,波特率改9600,就OK了
回复

使用道具 举报

20

主题

114

回帖

174

积分

初级会员

积分
174
发表于 2020-4-13 16:31:10 | 显示全部楼层
InkedQQ浏览器截图20200413154314_LI.jpg

出现上述问题时,将4个红圈处重新选择一次。
感觉STM32这个软件的参数保存功能没有生效导致的,重新选择一次就OK了!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-4-14 10:22:05 | 显示全部楼层
magicoctoier 发表于 2020-4-13 16:04
一测试果然,波特率改9600,就OK了

IAP下载这种,对串口线要求略微高一些,普通的CH340那种就不行。
回复

使用道具 举报

29

主题

62

回帖

149

积分

初级会员

积分
149
发表于 2020-4-16 08:52:45 | 显示全部楼层
一直在等SD卡或者U盘烧录程序的例程,几月份能给大家发布呀?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-4-16 10:13:56 | 显示全部楼层
lophost 发表于 2020-4-16 08:52
一直在等SD卡或者U盘烧录程序的例程,几月份能给大家发布呀?

正在抓紧,争取早日安排上,分享例子给大家。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-4-16 10:16:06 | 显示全部楼层
lophost 发表于 2020-4-16 08:52
一直在等SD卡或者U盘烧录程序的例程,几月份能给大家发布呀?

急的话,先看群友的学习即可:

F407的接U盘用的IAP
http://www.armbbs.cn/forum.php?m ... 6219&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

5

主题

132

回帖

147

积分

初级会员

积分
147
发表于 2020-5-7 16:53:50 | 显示全部楼层
请教一下硬汉哥,我发现串口和dfu的系统bootloader地址不一样,在F4的参考手册找了好久也没找到这个地址在那一章写着,想做个F1的,不知道这个地址是否一样?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-5-7 17:48:21 | 显示全部楼层
无关风月 发表于 2020-5-7 16:53
请教一下硬汉哥,我发现串口和dfu的系统bootloader地址不一样,在F4的参考手册找了好久也没找到这个地址在 ...

V7用户手册系统BootLoader章节相关资源整理汇总下载(2020-02-22)
http://www.armbbs.cn/forum.php?m ... 6573&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2020-5-14 20:57:43 | 显示全部楼层
如果有外部看门狗就不能用片内boot了,还有就是片内的boot是不是无法烧录片外flash呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-5-15 08:13:52 | 显示全部楼层
心然 发表于 2020-5-14 20:57
如果有外部看门狗就不能用片内boot了,还有就是片内的boot是不是无法烧录片外flash呢

1、是的,可以考虑控制下外部看门狗的通断来解决。
2、借助STM32CubeProg可实现。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2020-7-22 15:37:32 | 显示全部楼层
这个存在下载失败的风险吗?烧录失败了,APP代码是不是已经被擦除了,再次烧写会不会烧不了,因为flash里没有代码了,是这样吗,新手
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-7-22 16:26:07 | 显示全部楼层
小扳手小扳手 发表于 2020-7-22 15:37
这个存在下载失败的风险吗?烧录失败了,APP代码是不是已经被擦除了,再次烧写会不会烧不了,因为flash里没 ...

这个可以调整下载到指定地址。不要往你现有的位置下即可。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2020-7-27 09:42:58 | 显示全部楼层
请教一下,我用BOOT0上拉,能进入USB DFU,也能用进入串口IAP。但是用以下代码,只能进入USB DFU,不能进入串口IAP,我用的是STM32F407,不知道什么原因

void jump_sys_bootloader( void )
{

     uint32_t i = 0;

     /* 声明一个函数指针 */
     void (*p_sys_bootloader_run)( void );

     /* STM32F030K6 的系统 BootLoader 地址, 来自手册 AN2606 */
     __IO uint32_t boot_address = 0x1FFF0000;
     
     /* 关闭全局中断 */
     __disable_irq();
     
     /* 关闭滴答定时器,复位到默认值 */
     SysTick ->CTRL = 0;
     SysTick ->LOAD = 0;
     SysTick ->VAL= 0;
     
     /* 设置所有时钟到默认状态,使用HSI时钟 */
     RCC_DeInit();

     
     /* 关闭所有中断,清除所有中断挂起标志 */
     for( i=0; i<8; i++ )
     {
         NVIC->ICER[i] = 0xFFFFFFFF;
         NVIC->ICPR[i] = 0xFFFFFFFF;
     }
     
     /* 使能全局中断 */
     __enable_irq();
     
     /* 跳转到系统 BootLoader ,首地址是 MSP ,地址 +4 是复位中断服务程序地址 */
     p_sys_bootloader_run = (void (*)(void)) (*((uint32_t *) (boot_address + 4)));
     
     /* 设置主堆栈指针 */
     __set_MSP(*(uint32_t *)boot_address);
     
     /* 在 RTOS 工程,这条语句很重要,设置为特权级模式,使用 MSP 指针 */
     __set_CONTROL(0);
     
     /* 跳转到 系统 BootLoader 代码 运行 */
     p_sys_bootloader_run();
     
     /* 跳转不成功,软件复位 */
     while( 1 );
     
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-7-27 10:03:57 | 显示全部楼层
gdmaoqqq 发表于 2020-7-27 09:42
请教一下,我用BOOT0上拉,能进入USB DFU,也能用进入串口IAP。但是用以下代码,只能进入USB DFU,不能进入 ...


我们这个就是STM32F407的,你测试下看看

http://www.armbbs.cn/forum.php?m ... 3255&extra=page%3D1

QQ截图20200727100355.png
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2020-7-28 00:52:37 | 显示全部楼层
eric2013 发表于 2020-7-27 10:03
我们这个就是STM32F407的,你测试下看看

http://www.armbbs.cn/forum.php?m ... 3255&extra=page%3D ...

用这个工程来做的话,有一定概率可以连接上,但是把代码复制到我自己的工程就不行了。我用的是CubeMX生成的工程。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-7-28 07:18:30 | 显示全部楼层
gdmaoqqq 发表于 2020-7-28 00:52
用这个工程来做的话,有一定概率可以连接上,但是把代码复制到我自己的工程就不行了。我用的是CubeMX生成 ...

1、有一定概率链接上的话,查下你的USB线,USB驱动和USB接口是不是出问题了,我这里百发百中。基本上可以说明你的测试环境是有点问题的。

2、如果是CubeMX生成的,可以考虑上电后直接跳转试试。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 05:47 , Processed in 0.308017 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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