硬汉嵌入式论坛

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

[有问必答] STM32F030K6 跳转到 系统BootLoader 失败

  [复制链接]

27

主题

272

回帖

353

积分

高级会员

积分
353
发表于 2020-6-3 14:47:38 | 显示全部楼层 |阅读模式
本帖最后由 suozhang 于 2020-6-3 15:17 编辑
  1. void jump_sys_bootloader( void )
  2. {
  3.         
  4.         uint32_t i = 0;
  5.         
  6.         /* 声明一个函数指针 */
  7.         void (*p_sys_bootloader_run)( void );
  8.         
  9.         /* STM32F030K6 的系统 BootLoader 地址, 来自手册 AN2606 */
  10.         __IO uint32_t boot_address = 0x1FFFEC00;
  11.         
  12.         /* 关闭全局中断 */
  13.         __disable_irq();
  14.         
  15.         /* 关闭滴答定时器,复位到默认值 */
  16.         SysTick ->CTRL = 0;
  17.         SysTick ->LOAD = 0;
  18.         SysTick ->VAL  = 0;
  19.         
  20.         /* 设置所有时钟到默认状态,使用HSI时钟 */
  21.         RCC_DeInit();
  22.         
  23.         /* 关闭所有中断,清除所有中断挂起标志 */
  24.         for( i=0; i<8; i++ )
  25.         {
  26.                 NVIC->ICER[i] = 0xFFFFFFFF;
  27.                 NVIC->ICPR[i] = 0xFFFFFFFF;
  28.         }
  29.         
  30.         /* 使能全局中断 */
  31.         __enable_irq();
  32.         
  33.         /* 跳转到系统 BootLoader ,首地址是 MSP ,地址 +4 是复位中断服务程序地址 */
  34.         p_sys_bootloader_run = (void (*)(void)) (*((uint32_t *) (boot_address + 4)));
  35.         
  36.         /* 设置主堆栈指针 */
  37.         __set_MSP(*(uint32_t *)boot_address);
  38.         
  39.         /* 在 RTOS 工程,这条语句很重要,设置为特权级模式,使用 MSP 指针 */
  40.         __set_CONTROL(0);
  41.         
  42.         /* 跳转到 系统 BootLoader 代码 运行 */
  43.         p_sys_bootloader_run();
  44.         
  45.         /* 跳转不成功,软件复位 */
  46.         while( 1 );
  47.         
  48. }
复制代码

回复

使用道具 举报

27

主题

272

回帖

353

积分

高级会员

积分
353
 楼主| 发表于 2020-6-3 14:48:34 | 显示全部楼层
有哪位大神知道原因 吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2020-6-3 14:53:25 | 显示全部楼层
注意两点:
1、那个跳转地址整准,像H7系列就不是手册里面给的那个地址。
2、引脚别整错,有指定的几个引脚才可以。
回复

使用道具 举报

27

主题

272

回帖

353

积分

高级会员

积分
353
 楼主| 发表于 2020-6-3 14:56:45 | 显示全部楼层
eric2013 发表于 2020-6-3 14:53
注意两点:
1、那个跳转地址整准,像H7系列就不是手册里面给的那个地址。
2、引脚别整错,有指定的几个引 ...

1、地址 应该不错 因为 我 有 截图 为证  
2、我 用硬件飞线方式 串口脚 可以升级 ,也有截图为证
QQ图片20200603145522.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2020-6-3 15:16:59 | 显示全部楼层
suozhang 发表于 2020-6-3 14:56
1、地址 应该不错 因为 我 有 截图 为证  
2、我 用硬件飞线方式 串口脚 可以升级 ,也有截图为证

你截图的这个不是跳转地址,是选项字节的地址。
回复

使用道具 举报

1

主题

35

回帖

43

积分

新手上路

积分
43
发表于 2020-6-3 15:42:54 | 显示全部楼层
地址错了,是0x1FFF EC00

系统Mem地址

系统Mem地址
回复

使用道具 举报

27

主题

272

回帖

353

积分

高级会员

积分
353
 楼主| 发表于 2020-6-3 15:45:59 | 显示全部楼层
已解决  地址 应该 是 来自文档 AN2606 的  0x1FFFEC00 ,解决问题的根本原因 是 应该 把 APP 用到的外设初始化 ,比如串口 和 ADC , 详细代码如下:
  1. void jump_sys_bootloader( void )
  2. {
  3.        
  4.         uint32_t i = 0;
  5.        
  6.         /* 声明一个函数指针 */
  7.         void (*p_sys_bootloader_run)( void );
  8.        
  9.         /* STM32F030K6 的系统 BootLoader 地址, 来自手册 AN2606 */
  10.         __IO uint32_t boot_address = 0x1FFFEC00;
  11.        
  12.         /* 关闭全局中断 */
  13.         __disable_irq();
  14.        
  15.         /* 关闭滴答定时器,复位到默认值 */
  16.         SysTick ->CTRL = 0;
  17.         SysTick ->LOAD = 0;
  18.         SysTick ->VAL  = 0;
  19.        
  20.         /* 设置所有时钟到默认状态,使用HSI时钟 */
  21.        
  22.         ADC_DeInit( ADC1 );
  23.         USART_DeInit( USART1 );
  24.         RCC_DeInit();

  25.         /* 关闭所有中断,清除所有中断挂起标志 */
  26.         for( i=0; i<8; i++ )
  27.         {
  28.                 NVIC->ICER[i] = 0xFFFFFFFF;
  29.                 NVIC->ICPR[i] = 0xFFFFFFFF;
  30.         }
  31.        
  32.         /* 使能全局中断 */
  33.         __enable_irq();
  34.        
  35.         /* 跳转到系统 BootLoader ,首地址是 MSP ,地址 +4 是复位中断服务程序地址 */
  36.         p_sys_bootloader_run = (void (*)(void)) (*((uint32_t *) (boot_address + 4)));
  37.        
  38.         /* 设置主堆栈指针 */
  39.         __set_MSP(*(uint32_t *)boot_address);
  40.        
  41.         /* 在 RTOS 工程,这条语句很重要,设置为特权级模式,使用 MSP 指针 */
  42.         __set_CONTROL(0);
  43.        
  44.         /* 跳转到 系统 BootLoader 代码 运行 */
  45.         p_sys_bootloader_run();
  46.        
  47.         /* 跳转不成功,软件复位 */
  48.         while( 1 );
  49.        
  50. }
复制代码
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2020-6-3 16:09:11 | 显示全部楼层
看来都开始直接用芯片自带的BOOTLOADER了嘛
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2020-6-3 16:33:40 | 显示全部楼层
suozhang 发表于 2020-6-3 15:45
已解决  地址 应该 是 来自文档 AN2606 的  0x1FFFEC00 ,解决问题的根本原因 是 应该 把 APP 用到的外设初 ...

看来还是H7,F4更方便些。
回复

使用道具 举报

14

主题

11

回帖

53

积分

初级会员

积分
53
发表于 2021-9-3 18:00:36 | 显示全部楼层
本帖最后由 bdjinger 于 2021-9-3 18:50 编辑
suozhang 发表于 2020-6-3 15:45
已解决  地址 应该 是 来自文档 AN2606 的  0x1FFFEC00 ,解决问题的根本原因 是 应该 把 APP 用到的外设初 ...

也在弄串口bootloader烧程序,我现在的问题是,跳转到APP程序没有问题,但是跳转不到Bootloader,我的芯片是stm32f103zg,开始是这样写的,用stm32programmer的话,连不上USART。
  1. <font size="3">static void JumpToBootloader(void)
  2. {
  3.         uint32_t i=0;
  4.         void (*SysMemBootJump)(void);
  5.         __IO uint32_t BootAddr =  0x1FFFE000;
  6.         
  7.      
  8.         __disable_irq();
  9.         
  10.       
  11.         SysTick->CTRL = 0;
  12.         SysTick->LOAD = 0;
  13.         SysTick->VAL = 0;
  14.         


  15.         HAL_RCC_DeInit();

  16.       
  17.         for (i = 0; i < 8; i++)
  18.         {
  19.                 NVIC->ICER[i]=0xFFFFFFFF;
  20.                 NVIC->ICPR[i]=0xFFFFFFFF;
  21.         }
  22.         
  23.    
  24.         __enable_irq();
  25.         
  26.      
  27. //        __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();
  28.         
  29.      
  30.         SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));
  31.         
  32.      
  33.         __set_MSP(*(uint32_t *)BootAddr);
  34.         
  35.      
  36.         __set_CONTROL(0);
  37.         
  38.      
  39.         SysMemBootJump();
  40. }</font>
复制代码

后来看了您的解决方法,对外设进行初始化,
  1. <font size="3">  MX_GPIO_Init();
  2.   HAL_UART_DeInit(&huart1);
  3. //  FSMC_NORSRAM_DeInit(FSMC_NORSRAM_DEVICE,FSMC_NORSRAM_EXTENDED_DEVICE,FSMC_NORSRAM_BANK1);
  4. //  HAL_SPI_DeInit(&hspi1);
  5.   HAL_SPI_DeInit(&hspi2);
  6.         HAL_RCC_DeInit();</font>
复制代码

如果只初始化IO和串口还好,虽然连不上但程序好像是正常的,如果加上初始化SPI等等,就会进入硬件错误。

如果将BOOT0接高的话,是可以连接上的,所以应该不是硬件上的问题。
请大神帮忙看看
回复

使用道具 举报

6

主题

126

回帖

144

积分

初级会员

积分
144
发表于 2021-9-18 18:41:53 | 显示全部楼层
恭喜楼主,我的F030上面是死活不行啊

QQ图片20210918184118.png

回复

使用道具 举报

6

主题

126

回帖

144

积分

初级会员

积分
144
发表于 2021-9-18 20:47:50 | 显示全部楼层
楼主用的是usart1(PA2 PA3)吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2021-9-19 09:48:45 | 显示全部楼层
role_2099 发表于 2021-9-18 18:41
恭喜楼主,我的F030上面是死活不行啊

这个应该是串口线不太行,或者串口不是指定引脚

回复

使用道具 举报

6

主题

126

回帖

144

积分

初级会员

积分
144
发表于 2021-9-19 15:39:58 | 显示全部楼层
eric2013 发表于 2021-9-19 09:48
这个应该是串口线不太行,或者串口不是指定引脚

好的,谢谢硬汉老师,我换另一组试试
回复

使用道具 举报

334

主题

2031

回帖

3038

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3038
发表于 2021-9-24 09:04:39 | 显示全部楼层
suozhang 发表于 2020-6-3 15:45
已解决  地址 应该 是 来自文档 AN2606 的  0x1FFFEC00 ,解决问题的根本原因 是 应该 把 APP 用到的外设初 ...

你这个USART_DeInit()不是初始化串口啊,它只是恢复串口寄存器到复位后的状态。。。。
回复

使用道具 举报

334

主题

2031

回帖

3038

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3038
发表于 2021-9-24 09:06:03 | 显示全部楼层
role_2099 发表于 2021-9-18 18:41
恭喜楼主,我的F030上面是死活不行啊

感觉使用系统的boot,特别注意RCC必用内部震荡才行,。其他关键外设必须设定为复位后状态,避免冲突。
回复

使用道具 举报

27

主题

272

回帖

353

积分

高级会员

积分
353
 楼主| 发表于 2021-9-24 13:22:24 | 显示全部楼层
role_2099 发表于 2021-9-19 15:39
好的,谢谢硬汉老师,我换另一组试试

问题 解决了吗
回复

使用道具 举报

6

主题

126

回帖

144

积分

初级会员

积分
144
发表于 2021-9-27 15:36:04 | 显示全部楼层

解决了,换另外一组,用PA9和PA10就可以了
但是cubemx默认是PA2和PA3有点误导人了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2021-9-27 16:33:44 | 显示全部楼层
role_2099 发表于 2021-9-27 15:36
解决了,换另外一组,用PA9和PA10就可以了
但是cubemx默认是PA2和PA3有点误导人了

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 06:26 , Processed in 0.292672 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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