STM32F7

初次接触到STM32F7,可能会有个疑惑,为什么0地址变成了ITCM RAM的起始地址。系统复位还是从地址0处开始执行吗?如果是,那这似乎看起来是冲突的。实际上,STM32F7是基于Cortex-M7内核,而Cortex-M7和Cortex-M3/M4的复位序列有些不一样。本文中,将针对这个问题做详细讲解。

STM32F4的复位序列

STM32F4基于Cortex-M4。对于基于Cortex-M3/M4的芯片,复位后总是从0x00000000地址处,取主堆栈指针(MSP)的值,从0x00000004处,取出PC的初始值(这个值是复位向量),然后从这个值对应的地址处取指。


这两个值,就是中断向量表里的第一个和第二个表项的值。


在Cortex-M3/M4里,复位后默认中断向量表在0地址开始的位置。之后,可以通过修改VTOR寄存器的值,重定位中断向量表。在IAP的应用中,我们会遇到这种情况,如下图:


上电复位,先执行IAP程序。此时用到的是位于0地址处的IAP程序的向量表(虽然图中说此时VTOR的值等于0x08000000,实际上,因为ST提供了存储器地址重映射的功能,通过boot引脚的配置,已经将0x08000000处的存储空间重映射到了地址0处,所以0x08000000和地址0x00000000处开始的存储空间是同一块物理空间,其内容当然也是一样的。所以不用修改VTOR的值,VTOR=0也是一样的)。言归正传,上电后,先从IAP复位中断程序开始执行IAP程序,执行完IAP程序后,需要跳转到用户程序,这时就需要将向量表重定位到用户程序的向量表位置(修改VTOR寄存器的值到用户向量表的起始地址)。

这是M3/M4的情况,STM32F7之前的所有芯片都是一样的。

STM32F7的复位序列

前面讲的那些情况,在STM32F7中就有些不一样了。在ARM Cortex-M7的Generic User Guide中,有一段如下描述:“On system reset, thevector table is at the address configured at implementation, typically0x00000000. ”从这段话,我们可以看出,在M7中,复位后向量表的位置不是固定在0地址处,而是可以由各个芯片厂商自己定义。

对于STM32F7来说,它是由BOOT_ADD0[15:0]和BOOT_ADD1[15:0]这两个optionbytes决定的。


Boot 脚= 0时,由BOOT_ADD0 [15:0] 的值决定,ST默认值为0x0020 0000。这是ITCM-FLASH的起始地址(通过ART加速器,访问FLASH);

Boot 脚= 1时,由BOOT_ADD1 [15:0] 的值决定,ST默认值为0x0010 0000。这是system Bootloader的起始地址。

* 如果对BOOT_ADDx写入的地址值超出了存储器映射的范围或者到了保留地址空间,系统将自动转为下面的值:

BOOT_ADD0 = 0x0020 0000;

BOOT_ADD1 = 0x0000 0000(和出厂时ST默认的值0x0010 0000不一样)

也就是说,只要你配置好了boot address, stm32F7芯片的硬件会自动修改向量表的偏移地址寄存器VTOR,使之与boot address相匹配。不需要再通过软件修改VTOR寄存器。

回到本文开始的那个问题。对于STM32F7来说,默认状态下,复位后它并不是从0地址开始执行,而是从0x0020 0000 或者0x0010 0000开始执行,所以与ITCM-RAM从0地址处开始并不冲突。如果你非要将向量表放在0地址开始的位置(修改VTOR寄存器),也不是不可以。只是这是,如果你还要在ITCM-RAM里面跑别的程序的话,就要注意向量表不要与其他程序的地址重叠了。

来源: STM32单片机

围观 166

来源:STM32单片机

对于微处理界第一颗基于ARM®Cortex®-M7内核的高性能微控制器STM32F7系列,相信很多人对它都不陌生了。比如STM32F7系列微控制器采用90nm工艺,工作频率高达216MHz,采用6级超标量流水线和浮点单元,测试分数高达1000 CoreMarks,性能提升的同时保持高能效,与STM32F4系列管脚高度兼容等等。

一般来讲,基于ARM®Cortex®-M7内核的微控制器大多具有相似的处理器配置选项。通常包括:
● 一个64位AXI系统总线接口
● 一个指令和数据高速缓存
● 64位指令紧耦合存储器(ITCM)
● 双32位数据紧耦合存储器(DTCM)

不过,本文只是从应用开发的层面介绍STM32F7系列有别于其它使用Cortex-M7内核的MCU的几个特色。

首先,第一个重要特色在于STM32F7器件同时具有ITCM接口和AXI接口连接到片内闪存,如图1所示。

图1:基于ARMCortex-M7内核的系统级芯片的框图

图1:基于ARMCortex-M7内核的系统级芯片的框图

ITCM和AXI双接口的存在使得执行代码时具备更大的灵活性。此外,STM32F7还有一个称为自适应实时加速器(ARTAccelerator™)的内置闪存加速器,从而实现闪存零等待执行。使用TCM接口和ART加速器能能实现与带缓存AXI接口相似的性能。同时用户代码也不会有高速缓存失效或高速缓存维护操作的麻烦。

利用ART Accelerator加速引擎和高达16kB的L1缓存,STM32F7MCU可实现ARM Cortex-M7的最佳性能。不管是从片内闪存还是外部存储器执行代码,在216MHz下均可达到1082 CoreMark/462 DMIPS。

第二个重大特色在于内部SRAM分布在不同的模块中,以降低动态功耗,并允许从各个总线主机同时访问不同的SRAM模块,以优化带宽和延迟。

此架构的一个典型应用实例就是人机界面,在人机界面中,音频和图形数据与系统RAM之间的传输必须同时进行。

第三个就是它的高级浮点单元。STM32F7系列器件具有一个高性能的单或双精度浮点单元(FPU),支持所有ARM单或双数据处理指令和数据类型。FPU在需要浮点数学精度的许多应用中提供了优势,包括环路控制、音频处理、音频解码和数字滤波等。

它还有个额外优势,那就是将某些功能的执行或处理可以从CPU分流到FPU,使CPU用于其他任务。它支持双精度,因此更易于使用双精度浮点指令的基于PC的数学软件。

第四,STM32F7 MCU最具特色的设计之一是它们的智能系统架构,它使用两个子系统,如图2所示:

图2:STM32F7微控制器的总线矩阵

图2:STM32F7微控制器的总线矩阵

AXI-to-multi-AHB桥将AXI4协议转换成AHB-Lite协议
multi-AHB总线矩阵管理主机之间的访问仲裁

该仲裁使用循环调度算法保障主机对从机的访问,即使多个高速外设同时工作,也能实现同时访问并高效运行。

最后,不得不提它的L1高速缓存。STM32F7嵌入了指令和数据高速缓存,当从片上或片外存储器读取代码和数据时可弥补插入等待状态,从而提高性能。当然,如果出现高速缓存失效和高速缓存行填充,此时查看高速缓存将无法保证数据的确定性。

这就是为什么要强烈推荐使用TCM存储器来执行关键代码、存储关键数据的原因。这在必须保证安全操作的应用中(如家电和电机)通常都很有用。

由于高速缓存不仅可以由CPU访问,也可以通过其他主机进行访问(包括直接存储器访问(DMA)控制器),因此需要软件维护操作。访问物理存储器时,这些主机可能会读出过期的数据,而更新的数据在CPU高速缓存中已可用。

为了避免这个问题,开发者编写用户代码时应该采取以下措施:

A.当除CPU以外的主机将执行对高速缓存的访问之前,推荐进行高速缓存清零。这是为了确保CPU的最新的更新数据被写回到物理存储器。

B.当除CPU以外的主机对高速缓存数据进行了更新后,在对高速缓存进行读操作之前,CPU应该使高速缓存失效。这是为了确保从物理存储器的直接读取。

C.有时也需考虑无高速缓存操作。当高速缓冲存频繁被其他主机访问时,可以通过CPU配置不可缓存属性防止数据的不一致性。

围观 517
订阅 RSS - STM32F7