硬汉嵌入式论坛

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

[技术讨论] 请教一下STM32F103VE 软件跳转bootloder失败

  [复制链接]

30

主题

139

回帖

234

积分

高级会员

积分
234
发表于 2022-12-12 16:54:22 | 显示全部楼层 |阅读模式
本帖最后由 Biby 于 2022-12-13 11:52 编辑

我是按照教程里写的,把bootloder的地址改了一下,但是下载程序后,没有任何反应。
是其它的地方还需要改动吗?
[C] 纯文本查看 复制代码
/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{
    HAL_Init();
    SystemClock_Config(); /* 配置系统时钟为72MHz */
    JumpToBootloader();

    while(1)
    {
    }
}



[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*        函 数 名: JumpToBootloader
*        功能说明: 跳转到系统BootLoader
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/

void (*SysMemBootJump)(void);        /* 声明一个函数指针 */
__IO uint32_t BootAddr = 0x1FFFF000; /* STM32H7的系统BootLoader地址 */

static void JumpToBootloader(void)
{
    uint32_t i = 0;


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

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

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

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

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

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

    /* 设置主堆栈指针 */
    __set_MSP(*(uint32_t *)BootAddr);

    /* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
    __set_CONTROL(0);

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

    /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
    while (1)
    {
        printf("Bootloader跳转失败\r\n");
    }
}



自问自答STM32F103 的嵌入式引导加载程序不提供 DFU 功能,[color=var(--lwc-brandTextLink,rgb(60, 180, 230))]AN2606表 3 中找到。
image.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106760
QQ
发表于 2022-12-12 17:43:50 | 显示全部楼层
103的系统bootloader地址一直没有找到过,之前测试了很多地址,都无法正常跳转。
回复

使用道具 举报

30

主题

139

回帖

234

积分

高级会员

积分
234
 楼主| 发表于 2022-12-12 17:46:03 | 显示全部楼层
eric2013 发表于 2022-12-12 17:43
103的系统bootloader地址一直没有找到过,之前测试了很多地址,都无法正常跳转。

了解了
回复

使用道具 举报

30

主题

139

回帖

234

积分

高级会员

积分
234
 楼主| 发表于 2022-12-12 17:56:56 | 显示全部楼层
2022-12-12 17 54 51.png
有没有可能和这个人说的一样?
https://community.st.com/s/quest ... -bootloader-address
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106760
QQ
发表于 2022-12-13 01:05:44 | 显示全部楼层
Biby 发表于 2022-12-12 17:56
有没有可能和这个人说的一样?
https://community.st.com/s/question/0D50X00009XkfF8SAJ/stm32f10xxx-b ...

F1的没有再深究过了。
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
发表于 2022-12-13 20:16:39 | 显示全部楼层
你的地址没有错误,我这边有一个参考硬汉老师H7的跳转bootloader代码试过了是可以的,分享给你试试看。
/*
*********************************************************************************************************
*        函 数 名: JumpToBootloader
*        功能说明: 跳转到系统BootLoader
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static void JumpToBootloader(void)
{
        uint32_t i=0;
        void (*SysMemBootJump)(void);        /* 声明一个函数指针 */
        __IO uint32_t BootAddr = 0x1FFFF000; /* STM32F1的系统BootLoader地址 */

        /* 关闭全局中断 */
        DISABLE_INT();
       
        /* 设置所有时钟到默认状态,使用HSI时钟 */
        HAL_RCC_DeInit();       

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



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

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

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

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

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

        /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
        while (1)
        {
               
        }
}
回复

使用道具 举报

20

主题

114

回帖

174

积分

初级会员

积分
174
发表于 2022-12-14 08:50:00 | 显示全部楼层
//        __IO uint32_t BootAddr = 0x1FFF0000; /* STM32F4的系统BootLoader地址 */
    __IO uint32_t BootAddr = 0x1FFFF000; /* STM32F1的系统BootLoader地址 */
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106760
QQ
发表于 2022-12-14 10:36:46 | 显示全部楼层
frankff 发表于 2022-12-13 20:16
你的地址没有错误,我这边有一个参考硬汉老师H7的跳转bootloader代码试过了是可以的,分享给你试试看。
/* ...

测试F1跳转是否正常,之前好几个坛友测试跳转F103不正常。
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
发表于 2022-12-15 11:26:20 | 显示全部楼层
eric2013 发表于 2022-12-14 10:36
测试F1跳转是否正常,之前好几个坛友测试跳转F103不正常。

硬汉哥,我用的STM32F103VCT6的单片机,测试很多次都是可以进入Bootloader
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106760
QQ
发表于 2022-12-15 13:53:18 | 显示全部楼层
frankff 发表于 2022-12-15 11:26
硬汉哥,我用的STM32F103VCT6的单片机,测试很多次都是可以进入Bootloader

感谢,之前好几个坛友测试说无法跳转进去,看来后面我得自己试试了。
回复

使用道具 举报

30

主题

139

回帖

234

积分

高级会员

积分
234
 楼主| 发表于 2023-1-15 22:58:16 | 显示全部楼层
frankff 发表于 2022-12-15 11:26
硬汉哥,我用的STM32F103VCT6的单片机,测试很多次都是可以进入Bootloader

串口是可以的,usb好像不行
回复

使用道具 举报

6

主题

637

回帖

655

积分

金牌会员

积分
655
QQ
发表于 2023-1-17 09:53:24 | 显示全部楼层
mark,感谢分享、收藏
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-2-27 08:31:32 | 显示全部楼层
来看看,谢谢分享
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 05:10 , Processed in 0.432672 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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