跳转至

下载算法

i.MXRT 1176 没有内置非易失性存储器,需要外挂一块存储器用于加载启动,最常用的是通过FlexSPI外挂串行NOR Flash,挂了NOR Flash我们既可以离线启动,也可以在线调试,而在线调试就必然离不开下载算法(Programming Algorithm)。

MDK下Flash下载算法是开源的,有较详细的文档,文档在arm-software的github主页,根据这些文档,我们基本可以了解下载算法设计细节。另外 KEIL 安装目录下 C:\Keil_v5\ARM\Flash\_Template,提供了 下载算法的参考模板。Jlink下载算法和 KEIL下载算法 采用相同的接口,一般可以通用

下载算法需要 根据 MCU 和 Flash 的连接以及型号 而定,对于了解其原理的人来说,制作下载算法并不难,但是对于不了解的人来说却又不容易。从i.MXRT原厂技术支持角度,重复的工作又不太想一次次去做,基于此,痞子衡发起了一个开源项目,命名为 RT-UFL,就是设计一个超级下载算法。

本项目基于 痞子衡 RT-UFL,制作 适用于 Pixhawk V6X-RT 的下载算法。

硬件地址

根据 Pixhawk V6X-RT 开发标准,i.MXRT 1176 处理器通过 FlexSPI1 连接 MX25UM51345GXDI00。

查询 i.MX RT1170 Processor ReferenceManual3.2 System memory map (CM7) 可知:

  • RT1176 FlexSPI1 Start Address:0x30000000

查询 MX25UM51345G Datasheet5. MEMORY ORGANIZATION 可知,MX25UM51345G 总共 64MB,分成 1024 个block(64MB/1024=64KB),每个 block 由 16 个sector (64KB/16=4KB)组成,另外有256byte page buffe,因此:

  • MX25UM51345G Memory size: 512Mb (64MB, 0x04000000)
  • MX25UM51345G Block size: 64KB
  • MX25UM51345G Sector size: 4KB (uniform, 0x1000)
  • MX25UM51345G Page size: 256bytes (0x100)

修改算法

下载 https://github.com/JayHeng/RT-UFL 到本地

git clone https://github.com/JayHeng/RT-UFL

打开build/mdk/FlashPrg.c文件,修改 31 行左右flexspi_nor_config_t flashConfig结构体,增加 sectorSize字段并初始化为 0x1000 (4KB,uniform)

flexspi_nor_config_t flashConfig = {
    .pageSize = FLASH_DRV_PAGE_SIZE,
    .sectorSize = FLASH_DRV_SECTOR_SIZE,
};
flexspi_nor_config_t flashConfig = {.pageSize = FLASH_DRV_PAGE_SIZE};

打开build/mdk/FlashDev.c文件,修改 128 行左右 struct FlashDevice const FlashDevice结构体

主要修改内容为:

  • RT1176 FlexSPI1 Start Address:0x30000000
  • MX25UM51345G Size:0x04000000(64MB,512Mb)
  • MX25UM51345G Page size:0x100 (256Bytes)
  • MX25UM51345G Sector size: 0x1000 (4KB,uniform)
struct FlashDevice const FlashDevice = {
FLASH_DRV_VERS,             // Driver Version, do not modify!
"MIMXRT1176_MX25UM51345G",  // Device Name
EXTSPI,                     // Device Type
0x30000000,                 // Device Start Address (RT1176 FlexSPI AMBA)
0x04000000,                 // Device Size in Bytes (64 MB)
FLASH_DRV_PAGE_SIZE,        // Programming Page Size (256 B)
0,                          // Reserved, must be 0
0xFF,                       // Initial Content of Erased Memory
3000,                       // Program Page Timeout 3000 mSec
15000,                      // Erase Sector Timeout 15000 mSec

// Specify Size and Address of Sectors
FLASH_DRV_SECTOR_SIZE, 0x00000000,    // Sector Size 4 kB
SECTOR_END
};
struct FlashDevice const FlashDevice = {
FLASH_DRV_VERS,             // Driver Version, do not modify!
"MIMXRT_FLEXSPI",           // Device Name
EXTSPI,                     // Device Type
0x00000000,                 // Device Start Address
0x40000000,                 // Device Size in Bytes (1GB)
FLASH_DRV_PAGE_SIZE,        // Programming Page Size
0,                          // Reserved, must be 0
0xFF,                       // Initial Content of Erased Memory
3000,                       // Program Page Timeout 100 mSec
15000,                      // Erase Sector Timeout 15000 mSec

// Specify Size and Address of Sectors
FLASH_DRV_SECTOR_SIZE, 0x00000000,    // Sector Size  4kB (256 Sectors)
SECTOR_END
};

然后用 MDK 打开build/mdk/MIMXRT_FLEXSPI_UV5.uvprojx工程,重新编译生成 MIMXRT1176_MX25UM51345G.FLM 文件。

如何使用

参考资料

  1. 痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计