AT32讲堂021 | 如何使用AT32 MCU的SPIM作为外部存储器的扩展功能

概述 
spim(external spi flash memory interface)最大地址段为0x08400000-0x093fffff(16mb),是at32 mcu独有的一种flash访问方式。用户可以使用自己的flash作为at32 mcu的外挂flash。该方式有别于片上bank1/bank2,用户可根据具体需求选择是否开启。开启spim后可以作为flash扩展实现如下功能:
在spim地址存放用户执行程序,类似于bank1/bank2一样执行程序。用户程序直接访问spim地址,作为存储字体库,图片等存储器使用。spim配置 
spim仅允许按字(32bit)或者半字(16bit)操作,在执行读、编程、擦除spim前,必须首先执行初始化及解锁操作。
spim在at32不同系列产品及不同封装上,可能使用的pin有所不同,具体请参考对应型号产品的rm和ds,下面以at32f403a系列为例,描述操作步骤
初始化及解锁操作
初始化及解锁的步骤,在at32的bsp中已经封装成库函数,用户可以直接调用1) 使能gpioa、gpiob和iomuxcrm时钟。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。
flash型号选择
spim可以配置支持不同型号的spi flash,支持的指令集如下表,更详细描述可以看参考手册flash章节。表1. spim支持的指令集
读操作
直接按字(32bit)或者半字(16bit)访问需要读取数据的地址段:0x08400000–0x093fffff
编程操作
编程操作步骤,在at32的bsp中已经封装成库函数,用户可以直接调用1) 打开编程操作,flash_ctrl3寄存器fprgm位置12) 直接按字(32bit)或者半字(16bit)在需要编程的地址写入数据3) 检查是否写入完成读取flash_sts3寄存器的obf位是否清除,如果清除表示写入完成4) 关闭编程操作,flash_ctrl3寄存器fprgm位置05) 检查是否写入成功,读取flash_sts3寄存器的prgmerr和epperr位,如果都为0则表示写入成功
擦除操作
spim擦除分为mass erase和sector erase,每个sector固定为4kb,在at32的bsp中已经封装成库函数,用户可以直接调用mass erase1) 使能擦除,flash_ctrl3寄存器chpers位置12) 开始擦除,flash_ctrl3寄存器erstr位置13) 关闭擦除,flash_ctrl3寄存器chpers位置0sector erase1) 使能擦除,flash_ctrl3寄存器secers位置12) 选择擦除扇区地址,flash_addr3寄存器写入需要擦除扇区的地址3) 开始擦除,flash_ctrl3寄存器erstr位置14) 关闭擦除,flash_ctrl3寄存器secers位置0
加密操作
因为spim电路裸露在mcu芯片外部,为防止存储在spim flash里边的数据被外界直接读取,spim提供了加密功能,将原始数据通过特有算法进行加密操作后再写入flash,at32 mcu读取spim数据时会先进行解密得到原始数据,然后才使用,保证数据安全。加密算法所用的spim scrambled key为用户系统数据区的地址0x1ffff820-0x1ffff82f范围内数据。
当spim scrambled key值全为0xffffffff时,加密功能关闭。当spim scrambled key值不全为0xffffffff时,加密功能开启。at32 mcu根据flash_da寄存器值作为加密范围分界,小于0x08400000+flash_da地址段的数据为密文,其余范围数据仍然采用明文存储。注意:数据写入时的加密状态必须和读取时的加密状态保持一致,否则可能导致读取的数据是乱码而无法正确使用或者运行。即写入时如果配置了spim scrambled key及flash_da,那么在读取时也必须配置相同的spim scrambled key及flash_da。
图1. spim scrambled key存放地址图2. spim地址范围
硬件电路
因为spim连接在外部电路,受环境影响较大,为保证电路稳定,需尽量减少pcb布线长度。
注意:spim运行频率为mcu的ahb时钟频率的1/2,所以当开启spim时,mcu对应的运行ahb频率有最大限制值,不同型号mcu在spim开启时运行的最大频率值请用户参考ds的通用工作条件章节描述。
图3. 参考电路
i/o复用
要使用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功能
demo示例 
at32的bsp中,有两个例程operate_spim和run_in_spim演示了如何使用spim。
用户程序访问spim存储区
如果通过用户程序去执行读、编程及擦除操作,只需要按照正常配置初始化及解锁后就可以实现。bsp中examples\flash\operate_spim执行了spim的初始化、擦除、编程和读取流程,并通过led显示执行结果。
下载用户程序到spim或者用户程序在spim执行
如果用户程序通过keil下载到spim中,或者想程序直接在spim执行,需要执行一些额外的操作。附件工程run_in_spim通过led的闪烁,简单的演示了代码如何在spim上运行。1) options-debug-settings-flash download中选择添加外挂flash类型。图6. 配置spim flash类型2) options-target中添加spim起始地址和容量大小,但不勾选。demo中将spim定义在irom2位置,用于存储c文件注意:如果勾选则keil在编译时可能会将其余不需要运行在spim的函数编译到spim地址段。图7. 配置spim起始地址和容量3) project中选择需要运行在spim对应位置的c文件,鼠标右键选options进入将memory assignment的code地址改为对应地址段。注意:如果工程中函数还有更多指定地址分段编译的需求,可以继续添加到对应 rom1/2/3 等,也可以手动修改sct文件图8. 配置需运行在spim第一部分代码4) 编译时勾选自动生成sct文件的选项,编译完成后浏览sct文件可以发现需要运行在spim区域的函数已被正确编译到该区域。图9 勾选自动生成sct文件
图10 自动生成的sct文件
注意:整个代码的启动必须从bank1开始,须保证spim flash的初始化代码在程序执行到spim前运行。
关于雅特力雅特力科技于2016年成立,是一家致力于推动全球市场32位微控制器(mcu)创新趋势的芯片设计公司,专注于arm cortex-m4/m0+的32位微控制器研发与创新,全系列采用55nm先进工艺及arm cortex-m4高效能或m0+低功耗内核,缔造m4业界最高主频288mhz运算效能,并支持工业级别芯片工作温度范围(-40°~105°)。雅特力目前已累积相当多元的终端产品成功案例:如微型打印机、扫地机、光流无人机、热成像仪、激光雷达、工业缝纫机、伺服驱控、电竞周边市场、断路器、adas、t-box、数字电源、电动工具等终端设备应用,广泛地覆盖5g、物联网、消费、商务及工控等领域。

iOS11.0.3升级体验:遭网友群嘲 “修复了太流畅的bug?”
采用AT89C2051单片机实现数字电容表的设计
新iPhone破发 苹果如何才能继续抬高产品的溢价
AI芯片助推华米科技穿戴产业升级
美国半导体领域优势正在萎缩,拥有全球近一半的市场份额
AT32讲堂021 | 如何使用AT32 MCU的SPIM作为外部存储器的扩展功能
ARM超便携设备市场份额2013年有望超英特尔
隔离型反激式转换器免光耦合器简化设计
口碑最好的国产蓝牙耳机,2021国产最好用的蓝牙耳机
储能微网应用SCR选型设计(4)
HIFI智能手机价格集体跳水 便携音频设备未来出路在哪
基于Linux系统和ZigBee的智能家居系统方案
无线共享充电技术怎么就成了三星旗舰机的标配
华为任正非:我们要敢于吸收国内外人才,发挥创造才华
我国电动汽车已经进入产业化阶段,动力锂电池市场需求巨大
数字压力传感器在气象监测系统中的作用
崇达技术2023年汽车电子订单增长14%,2024年有望继续增长
水流量计选型_水流量计的种类
非网络专业开发人员专有网络名词解释大全
欧司朗光电半导体 Duris S 产品家族又添新丁