上一篇文章介绍了开发环境搭建,那个工程模板用的就是NOR XIP执行,下面介绍其原理 所谓的XIP,意思就是就地执行。像Linux或者Windows,一般的可执行程序存放于flash,需要将其加载到内存,然后执行,而XIP,则是不需要加载到内存,直接将flash做映射,映射到内部总线的一段地址上面,然后在这段地址上面执行。我们所熟知的STM32的flash起始地址0x8000000,其实也是XIP的一段地址。 下图展示了STM32上XIP的流程。
XIP的主要流程都在Template_XIP_Boot工程里面。要实现片外FLASH的XIP,首先还是需要初始化存储器,初始化的函数为 MX_XSPI2_Init和MX_XSPI1_Init 这两个函数最终调用了 HAL_XSPI_Init 和 HAL_XSPIM_Config 具体硬件配置可以看原理图 其中XSPI2外接的是NOR FLASH,型号是MX66UW1G XSPI1外接的是PSRAM,型号是 APS256XXN 注意这个函数是用于实现XSPI上器件的初始化,这个XSPI器件也可以不开启XIP功能的 这里的XSPI初始化,只需要注意一下GPIO的速度,要设置为最高,不然会初始化失败 完成XSPI初始化之后,会调用 MX_EXTMEM_MANAGER_Init 进行内存映射操作 这个函数的配置直接参考ST默认的即可 这个是XSPI的对应关系,以及带宽
这些是XSPI器件的读写command配置
内存映射的地址,可以见ST的手册,可以看到XSPI1固定使用0x90000000,XSPI2固定使用0x70000000
配置好XSPI和内存映射后,可以执行跳转,也就是调用 BOOT_Application ST目前也封装了这个API,不需要用户自行实现,只需要配置一下参数。在这个工程里面,参数配置在stm32_extmem_conf.h 这个地方需要指定XIP的器件在哪个extmem_list_config上面,这个extmem_list_config结构体定义就是在上面的MX_EXTMEM_MANAGER_Init函数里面实现。这里选择EXTMEMORY_1,也就是EXTMEM_NOR_SFDP
这个强制跳转就不过多介绍了,跟以前F1经常使用的IAP跳转API差不多,不过对于H7系列的,还要关掉cache。
下面再介绍下app下载的流程。打开Template_XIP_Appli,这里要配置一个sct文件 sct文件直接用st默认的即可,不用修改 另外还要配置一下FLASH,如下图 这样,在keil点击下载,就会下载到片外flash。前提是要烧录了boot到片上flash。
|