带有 AXIM/ITCM 闪存的 STM32F7 VMA 和 LMA

Posted

技术标签:

【中文标题】带有 AXIM/ITCM 闪存的 STM32F7 VMA 和 LMA【英文标题】:STM32F7 VMA and LMA with AXIM/ITCM flash 【发布时间】:2021-04-26 13:13:48 【问题描述】:

我正在为我的 stm32f767zi 板编写一些基本的裸机 C 代码(如果这也很重要,请使用 Keil uVision IDE),我希望我的向量表(以及在某些时候所有 .text 的东西)有一个闪存中的 LMA 通过 AXIM 总线和闪存中的 VMA 通过 ITCM 总线。我想要的是链接器脚本中的以下内容:

MEMORY

    FLASH_AXIM (rwx) : ORIGIN = 0x08000000, LENGTH = 0x001FFFFF
    FLASH_ITCM  (rx) : ORIGIN = 0x00200000, LENGTH = 0x001FFFFF


SECTIONS

    .vector_table : ALIGN(4)
    
        KEEP(*(.vectors))
        . = ALIGN(4);
     > FLASH_ITCM AT > FLASH_AXIM /* VMA in ITCM flash, LMA in AXIM flash */
...

此链接描述文件会导致程序在尝试调试时无法运行并挂起。当程序挂起时,调试器显示(在 Keil uVision 内存窗口中进行内存读取时)地址 0x08000000 和 0x00200000 处的数据完全相同,即

在地址 0x08000000 处读取内存: 0x08000000: 00 F4 01 20 1D 02 20 00 9D .....

在地址 0x00200000 处读取内存: 0x00200000: 00 F4 01 20 1D 02 20 00 9D .....

在我看来,这重申了 AXIM 闪存和 ITCM 闪存漏斗到完全相同的物理闪存并通过 AXIM 总线将程序加载到闪存中,然后通过 ITCM 总线从闪存读取指令应该工作......但它没有,至少在我目前的设置下没有。

相反,我必须将链接描述文件修改为以下内容,以使程序顺利运行并能够在重置处理程序中开始调试:

MEMORY

    FLASH_AXIM (rwx) : ORIGIN = 0x08000000, LENGTH = 0x001FFFFF
    FLASH_ITCM  (rx) : ORIGIN = 0x00200000, LENGTH = 0x001FFFFF


SECTIONS

    .vector_table : ALIGN(4)
    
        KEEP(*(.vectors))
        . = ALIGN(4);
     > FLASH_AXIM /* VMA and LMA in AXIM flash */

为什么将 .vector_table 输出部分的 VMA 更改为与 LMA 相同会影响我运行程序的能力?另请注意,如果我将 .vector_table 输出部分的 VMA 和 LMA 设置为 FLASH_ITCM 而不是 FLASH_AXIM,则会收到关于闪存中不匹配数据的 Keil uVision 闪存编程错误。

【问题讨论】:

【参考方案1】:

已解决,由于请求对齐 VMA,因此 .text 部分(在 .vector_table 部分之后)的 LMA 未对齐问题。更详细的解释见https://github.com/DISTORTEC/distortos/commit/12765ae58aefad3d51d579a3b90c0abbb7eb75a0。

【讨论】:

以上是关于带有 AXIM/ITCM 闪存的 STM32F7 VMA 和 LMA的主要内容,如果未能解决你的问题,请参考以下文章

带有 STM32F7 的 SPI 从模式和循环 DMA

STM32F7:ADC DMA 传输只工作一次

STM32 - 内存映射模式下的 QSPI Flash 只读问题

闪存扇区擦除 - STM32F207

STM32F103 闪存保护部分

stm32f427usb无法发送