本帖最后由 lzh12a3nf 于 2023-9-8 18:02 编辑
#申请原创#@21小跑堂1.前言 最近在学习APM32过程中,会发现程序在烧录成功后,发现出不来正常的现象,以至于在SDK包中下载简单的跳灯程序也出现不了正确现象。后经排查发现,是因为BOOT脚配置错误,导致程序下载到其他区域内。那为什么BOOT脚设置错误,程序便执行不了正确的现象呢? 接下来,我将以APM32F407这款开发板为例子探讨一下问题。
2.问题思考所涉及知识点
2.1 程序启动配置 如上图APM32F407的启动配置,它可以通过配置BOOT[1:0]引脚,可以让系统分别从Flash存储器或系统存储器或内置SRAM启动。如下: 1、系统从主闪存存储器中启动,即BOOT0引脚设置为0,BOOT1引脚不论0或1即可,那么Flash地址0x08000000便会被映射到0x00000000的地址上。一般情况下,平时使用JTAG或SWD模式下载程序时,便是下载到这里,重启后,便是从这里开始启动。 2、系统从系统存储器(Bootloader)中启动,即BOOT1引脚设置为0,BOOT0引脚设置为1,那么0x1FFF0000地址便会映射到0x00000000。 3、系统从内置SRAM中启动,即BOOT1和BOOT0引脚均设置为1。那么,SRAM地址0x20000000便会映射到0x00000000。但SRAM不像Flash,无法在断电之后保持其内容。因此,在复位时从SRAM启动,内容会丢失,因此,只能在开始的地址区域内访问SRAM。
有了上面的知识,我们会知道单片机有三种启动配置方式,在单片机复位后,会从0x0区域开始启动,但是0x0启动后,我们怎么跳转到对应区域呢?接着问题,我们继续探讨。
2.2地址重映射 如上内存映射图可知,MCU复位启动后,在0x00000000区域内,会根据BOOT0和BOOT1管脚中配置的电平值,选择将0x00000000-0x0007FFFF映射到不同的区域上,映射到不同的区域上。
3.总结 如上,解决了我的问题。即,当程序设置好在0x08000000区域内下载代码,会将0x08000000地址映射到启动空间0x00000000中,程序复位后,会根据BOOT[1:0]的电平值设置,跳转回0x08000000区域中访问。如果设置不对,即出现错误现象。
|