和记娱乐官网为什么STM32从Flash地址0x080000
来源:    发布时间: 2018-06-01 09:29   63 次浏览   大小:  16px  14px  12px
和记娱乐官网为什么STM32从Flash地址0x080000

  程序时,遇到一个困惑,STM32的Flash在MDK里被设置为起始地址0x0800 0000,而CM3手册芯片复位时要从0x0000 0000地址开始取出中断向量 ,那STM32怎么样执行代码呢?地址

  仔细阅读手册,发现这件事是因为STM32设计的Flash起始地址是在0x0800 0000开始的。全部代码都只能从这里开始存储。详见STM32 referenc manual手册第54页。

  那既然从这里才能存储代码,就必须在MDK里设置Flash地址为0x0800 0000,下面是MDK设置页面,这个应该都看到过。

  这样就还有一个问题,理论上,CM3中上电后CPU是从0地址开始执行,但是这里中断向量表却被烧写在0x0800 0000地址里,那启动时不就找不到中断向量表了?既然CM3定下的规矩是从0地址启动,SMT32当然不能ARM定下的“规矩”,所以它做了一个启动映射的过程,就是和芯片上总能见到的BOOT0和BOOT1有关了,当选择从主Flash启动模式后,芯片一上电,Flash的0x0800 0000地址被映射到0地址处,不影响CM3内核的读取,所以这时的CM3既可以在0地址处访问中断向量表,也可以在0x0800 0000地址处访问中断向量表,而代码还是在0x0800 0000地址处存储的。这就是最难理解的地方,其实,这是基本上所有ARM芯片采用的启动映射方法。ARM7,ARM9没有内部Flash的通常都是这样做的。这个过程出自STM32 referenc manual手册,和记娱乐官网里面是有说明的。

  还要注意,这个中断向量表是可以在程序中再次被映射的。控制它的就是CM3已经的NVIC寄存器SCB->

  VTOR。在STM32库中给出的启动代码里,startup_stm32f10x_hd.s文件里,第146行,是上电后读取中断向量表中的复位中断,并执行复位中断处理代码,代码如下:

  注意复位后第一个被执行的是SystemInit代码,这个代码在库目录下的system_stm32f10x.c文件里,它初始化了时钟,NVIC等一系列操作,这里摘要与中断向量有关的代码:

  可以看出中断向量重映射是一个选择性编译,通常宏定义VECT_TAB_SRAM都没有被定义,所以这里执行结束后,SCB->

  VTOR就是FLASH_BASE了,和记娱乐官网值为0x0800 0000。以后CM3再取中断向量里,就会根据SCB->

  VTOR的设置,从这里取向量执行了。中断向量自此终于转正。

  注意这时连__main函数都还没进,看起来中断向量的重映射还是够早的。

Power by 建站之星 | 美橙互联 版权所有