硬汉嵌入式论坛

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

[有问必答] STM32F4的bootload程序例程导致重启

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2023-8-7 15:38:13 | 显示全部楼层 |阅读模式
芯片:STM32F429ZIT6
实验:程序bootload
实验工具:一个外部的flash,STM32F429开发板,上位机flash下载软件。
实验流程:先将程序分成两个,一个bootload程序,一个APP程序,APP程序跳转地址0x08008000,生成一个bin文件烧录搭配flash中,bootload程序通过按键读取flash的内容到MCU中,跳转程序运行。用到例程:



/*
*********************************************************************************************************
*        函 数 名: JumpToBootloader
*        功能说明: 跳转到BootLoader
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void JumpToBootloader(void)
{
        uint32_t i=0;
        void (*SysMemBootJump)(void);        /* 声明一个函数指针 */
        __IO uint32_t BootAddr = APP_ADDR; /* BootLoader地址 */

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

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

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

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

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

        /* 设置重映射到系统Flash */
        __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();

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

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

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

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

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

        }
}

---------------------------------------------------------------------------------------------------------------
出现问题:我自测的app和bootload的程序一切正常;当我用我的bootload下载项目的的程序,会重启,自查发现是__HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();这一句屏蔽即可正常。
下载 (1).png


下载 (2).png

想问问,这句调用是把MCU的flash重映射到0x00000000,为什么要用到这一句,有没有必要,调用后产生的复位是为什么吗?

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-7 16:39:52 | 显示全部楼层
重映射涉及到此贴的一个问题,芯片默认就是内部Flash首地址0x0800 0000重映射到0x0000 0000

【不是问题的问题】为什么STM32的Flash地址要设置到0x08000000
https://www.armbbs.cn/forum.php?mod=viewthread&tid=109321
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2023-8-7 17:08:54 | 显示全部楼层
eric2013 发表于 2023-8-7 16:39
重映射涉及到此贴的一个问题,芯片默认就是内部Flash首地址0x0800 0000重映射到0x0000 0000

【不是问题 ...

看了转贴的内容,里面是对0x00000000的重映射讲解,有说到M3、M4已经重映射到0x08000000了,内容一致了,还需要这句重映射的调用吗?
另,用示波器测试到,如果调用此句话,硬件看门狗有一个高电平脉冲重启程序,是否跟这个有关系,我测试我的APP程序是不会重启的,请问为什么用项目的程序会导致程序重启?
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2023-8-7 19:11:33 | 显示全部楼层
gouQiu 发表于 2023-8-7 17:08
看了转贴的内容,里面是对0x00000000的重映射讲解,有说到M3、M4已经重映射到0x08000000了,内容一致了, ...

首先感谢版主的回答,重启的原因已经找到,我的开发板是用FLASH做程序盘的,例程是SYSTEM FLASH,所以出现调用错误。是我没有仔细看资料和学习,属于是低级错误了。至于原理,还请版主做一下详解,也请版主帮忙介绍一下boot0/1的选择,程序跑在各个MEMORY的原理和过程,再次感谢。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-8 10:06:49 | 显示全部楼层
gouQiu 发表于 2023-8-7 19:11
首先感谢版主的回答,重启的原因已经找到,我的开发板是用FLASH做程序盘的,例程是SYSTEM FLASH,所以出 ...

你说的SYSTEM FLASH是指的芯片你们自带的那个系统bootloader区吧,这个是自带的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 21:48 , Processed in 0.212307 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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