我有一个STM32 MCU,我在其中刷新了闪存(0x0800_0000)开始时的 bootstrap 加载程序和地址为0x0801_0000的应用程序(扇区4).

如果我正在调试我的应用程序代码,并且我重置了芯片,代码将切换到 bootstrap 加载程序.我由此了解到,地址0x0800_0000别名为CPU的0x0000_0000,并且MCU始终在重置后首先执行 bootstrap 加载程序中的代码.

我的问题是,我是否可以将0x0000_0000地址别名为应用程序开始地址(或一般来说,除了0x0800_0000之外的闪存中的特定地址),以便在重置后直接从那里开始?

推荐答案

这取决于STM32型号.在某些STM32F7、H7和其他型号中,您有指定 bootstrap 地址的特殊选项字节

大多数STM32 MCU没有它,处理器从闪存(或RAM/系统ROM-但我们现在对此不感兴趣)的开头开始. bootstrap 加载程序应该判断固件的存在及其完整性,然后通过以下方式将控制传递给固件

  • 设置堆栈指针
  • 设置向量表
  • 禁用中断
  • 将所有由BootLoader外围设备使用的设置为重置状态

并最终调用固件重置处理程序.

C++相关问答推荐

使用sd-设备列举设备导致seg错误

为什么已经设置的值在C中被重置为for循环条件中的新值?

当打印字符串时,为什么在c中没有使用常量限定符时我会收到警告?

减法运算结果的平方的最快方法?

为什么C语言允许你使用var =(struct NAME){

在C语言中,在数学运算过程中,为什么浮点数在变量中的行为不同

插座打开MacOS组件

从uint8_t*转换为char*可接受

为什么WcrTomb只支持ASCII?

通过对一个大的Malloc内存进行切片来使用Malloc的内存片

如何摆脱-WIMPLICIT-Function-声明

具有正确标头的C struct 定义问题

GETS()在C++中重复它前面的行

有没有办法减少C语言中线程的堆大小?

我编写这段代码是为了判断一个数字是质数、阿姆斯特朗还是完全数,但由于某种原因,当我使用大数时,它不会打印出来

无算术运算符和循环的二进制乘法

解密Chrome加密密钥

令人困惑的返回和 scanf 问题相关

malloc:损坏的顶部大小无法找出问题

我们可以在不违反标准的情况下向标准函数声明添加属性吗?