AT32 SPIM Application Note

AN0042

应用笔记

AT32 SPIM Application Note

前言

这篇应用笔记描述了怎么使用AT32 MCUSPIM作为外部存储器的扩展功能。

支持型号列表:

支持型号

AT32F403系列

AT32F403A系列

AT32F407系列

AT32F413系列

AT32A403A系列

目录

1                   概述... 5

2                   SPIM配置... 6

2.1        初始化及解锁操作... 6

2.2        Flash型号选择... 6

2.3        读操作... 6

2.4        编程操作... 7

2.5        擦除操作... 7

2.6        加密操作... 7

2.7        硬件电路... 8

2.8        IO复用... 9

3                   demo示例... 10

3.1        用户程序访问SPIM存储区... 10

3.2        下载用户程序到SPIM或者用户程序在SPIM执行... 10

4                   版本历史.. 13

表目录

表1. SPIM支持的指令集... 6

表1. 文档版本历史... 13

图目录

图1. SPIM scrambled KEY存放地址... 7

图2. SPIM地址范围... 8

图3. 参考电路... 8

图4. XMC和SPIM共用引脚... 9

图5. 单独关闭XMC_NADV功能... 9

图6. 配置SPIM Flash类型... 10

图7. 配置SPIM起始地址和容量... 11

图8. 配置需运行在SPIM第一部分代码... 11

图 9 勾选自动生成sct文件... 12

图 10 自动生成的sct文件... 12

  1. 概述

SPIM (External SPI FLASH memory interface)最大地址段为0x08400000 - 0x093FFFFF(16MB),是AT32 MCU独有的一种Flash访问方式。用户可以使用自己的Flash作为AT32 MCU的外挂Flash。该方式有别于片上Bank1/Bank2,用户可根据具体需求选择是否开启。开启SPIM后可以作为Flash扩展实现如下功能:

  1. SPIM地址存放用户执行程序,类似于Bank1/Bank2一样执行程序。
  2. 用户程序直接访问SPIM地址,作为存储字体库,图片等存储器使用。
  1. SPIM配置

SPIM仅允许按字(32bit)或者半字(16bit)操作,在执行读、编程、擦除SPIM前,必须首先执行初始化及解锁操作。

SPIM在AT32不同系列产品及不同封装上,可能使用的pin有所不同,具体请参考对应型号产品的RM和DS,下面以AT32F403A系列为例,描述操作步骤

    1. 初始化及解锁操作

初始化及解锁的步骤,在AT32的BSP中已经封装成库函数,用户可以直接调用

  1. 使能GPIOA、GPIOB和IOMUX CRM时钟。
  2. 配置对应pin PA8、PA11、PA12、PB1、PB6、PB7为推挽复用输出模式。
  3. IOMUX_REMAP2寄存器中使能SPIM接口。
  4. 设置FLASH_SELECT寄存器选择配置SPIM Flash的类型。
  5. 使用KEY解锁SPIM:写FLASH_UNLOCK3寄存器2次,按顺序分别写0x45670123和0xCDEF89AB。
  6. 检查SPIM是否解锁成功,读取FLASH_CTRL3寄存器的OPLK位,如果被清除为0,则可以开始操作SPIM。
    1. Flash型号选择

SPIM可以配置支持不同型号的spi Flash,支持的指令集如下表,更详细描述可以看参考手册FlASH章节。

1. SPIM支持的指令集

指令名称

指令码

FLASH_SELECT

寄存器配置

补充说明

Write Enable

0x06

0x1/0x2

2类型号闪存均需要支持0x06指令

Quad Page Program

0x32

0x1/0x2

2类型号闪存均需要支持0x32指令

Sector Erase

0x20

0x1/0x2

2类型号闪存均需要支持0x20指令

Chip Erase

0xC7

0x1/0x2

2类型号闪存均需要支持0xC7指令

Read Status Register

0x05

0x1/0x2

2类型号闪存均需要支持0x05指令

Quad I/O Read

0xEB

0x1/0x2

2类型号闪存均需要支持0xEB指令

24bit Addr + 6个Dummy cycle

Volatile status

Register write

enable

0x50

0x1

3条指令用于当选择型号1闪存时,硬体自动发送指令配置闪存Status Register中的Quad Enable(QE位)

型号1闪存需要支持:

0x50与0x01

或是支持0x50与0x31

Write Status

Register-1

0x01

Write Status Register-2

0x31

    1. 读操作

直接按字(32bit)或者半字(16bit)访问需要读取数据的地址段:0x08400000 – 0x093FFFFF

    1. 编程操作

编程操作步骤,在AT32的BSP中已经封装成库函数,用户可以直接调用

  1. 打开编程操作,FLASH_CTRL3寄存器FPRGM位置1
  2. 直接按字(32bit)或者半字(16bit)在需要编程的地址写入数据
  3. 检查是否写入完成读取FLASH_STS3寄存器的OBF位是否清除,如果清除表示写入完成
  4. 关闭编程操作,FLASH_CTRL3寄存器FPRGM位置0
  5. 检查是否写入成功,读取FLASH_STS3寄存器的PRGMERR和EPPERR位,如果都为0则表示写入成功
    1. 擦除操作

SPIM擦除分为Mass Erase和Sector Erase,每个sector固定为4KB,在AT32的BSP中已经封装成库函数,用户可以直接调用

Mass Erase

  1. 使能擦除,FLASH_CTRL3寄存器CHPERS位置1
  2. 开始擦除,FLASH_CTRL3寄存器ERSTR位置1
  3. 关闭擦除,FLASH_CTRL3寄存器CHPERS位置0

Sector Erase

  1. 使能擦除,FLASH_CTRL3寄存器SECERS位置1
  2. 选择擦除扇区地址,FLASH_ADDR3寄存器写入需要擦除扇区的地址
  3. 开始擦除,FLASH_CTRL3寄存器ERSTR位置1
  4. 关闭擦除,FLASH_CTRL3寄存器SECERS位置0
    1. 加密操作

因为SPIM电路裸露在MCU芯片外部,为防止存储在SPIM Flash里边的数据被外界直接读取,SPIM提供了加密功能,将原始数据通过特有算法进行加密操作后再写入Flash,AT32 MCU读取SPIM数据时会先进行解密得到原始数据,然后才使用,保证数据安全。加密算法所用的SPIM scrambled KEY为用户系统数据区的地址0x1FFFF820-0x1FFFF82F范围内数据。

  1. 当SPIM scrambled KEY值全为0xFFFFFFFF时,加密功能关闭。
  2. 当SPIM scrambled KEY值不全为0xFFFFFFFF时,加密功能开启。AT32 MCU根据FLASH_DA寄存器值作为加密范围分界,小于0x08400000+FLASH_DA地址段的数据为密文,其余范围数据仍然采用明文存储。

注意:数据写入时的加密状态必须和读取时的加密状态保持一致,否则可能导致读取的数据是乱码而无法正确使用或者运行。即写入时如果配置了SPIM scrambled KEYFLASH_DA,那么在读取时也必须配置相同的SPIM scrambled KEYFLASH_DA

1. SPIM scrambled KEY存放地址

2. SPIM地址范围

    1. 硬件电路

因为SPIM连接在外部电路,受环境影响较大,为保证电路稳定,需尽量减少PCB布线长度。

注意:SPIM运行频率为MCUAHB时钟频率的1/2,所以当开启SPIM时,MCU对应的运行AHB频率有最大限制值,不同型号MCUSPIM开启时运行的最大频率值请用户参考DS的通用工作条件章节描述。

3. 参考电路

    1. IO复用

要使用SPIM,需要注意跟其他外设IP的IO复用问题。

当SPIM使用的IO还有对应的其他外设使能的话,有些IO即使其他外设应用中没有用到,但也可能会占用。

例如:XMC和SPIM同时使用时,在F403A上PB7用作SPIM的IO2,但是如果配置使能了XMC,即使XMC_NADV功能没有使用,则PB7也会被XMC_NADV默认开启占用,导致SPIM工作异常。此时需手动配置IOMUX_REMAP2寄存器关闭XMC_NADV功能,调用库函数即可,如下

gpio_pin_remap_config (XMC_NADV_MUX, TRUE)

4. XMC和SPIM共用引脚

5. 单独关闭XMC_NADV功能

  1. demo示例

AT32的BSP中,有两个例程operate_spim和run_in_spim演示了如何使用SPIM。

    1. 用户程序访问SPIM存储区

如果通过用户程序去执行读、编程及擦除操作,只需要按照正常配置初始化及解锁后就可以实现。BSP中examples\flash\operate_spim执行了SPIM的初始化、擦除、编程和读取流程,并通过LED显示执行结果。

    1. 下载用户程序到SPIM或者用户程序在SPIM执行

如果用户程序通过keil下载到SPIM中,或者想程序直接在SPIM执行,需要执行一些额外的操作。

附件工程run_in_spim通过LED的闪烁,简单的演示了代码如何在SPIM上运行。

  1. Options-Debug-Settings-Flash Download中选择添加外挂flash类型。

6. 配置SPIM Flash类型

  1. Options-Target中添加SPIM起始地址和容量大小,但不勾选。Demo中将SPIM定义在IROM2位置,用于存储C文件

注意:如果勾选则KEIL在编译时可能会将其余不需要运行在SPIM的函数编译到SPIM地址段

7. 配置SPIM起始地址和容量

  1. Project中选择需要运行在SPIM对应位置的C文件,鼠标右键选Options进入将Memory Assignment的code地址改为对应地址段。

注意:如果工程中函数还有更多指定地址分段编译的需求,可以继续添加对应ROM1/2/3等,也可以手动修改sct文件

8. 配置需运行在SPIM第一部分代码

  1. 编译时勾选自动生成sct文件的选项,编译完成后浏览sct文件可以发现需要运行在SPIM区域的函数已被正确编译到该区域。

9 勾选自动生成sct文件

10 自动生成的sct文件

注意:整个代码的启动必须从bank1开始,须保证SPIM flash的初始化代码在程序执行到SPIM前运行。

  1. 版本历史

2. 文档版本历史

日期

版本

变更

2022.01.19

2.0.0

最初版本

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值