本文浅谈S32k1xx系列mcu的memory结构以及如何快速使用nxp官方使用的sdk对其eeprom和flash进行快速使用。
一.memory结构:
如数据手册所示,S32k1xx系列mcu的memory结构由几个方面组成:P-flash(用于代码存储),Data-flash(NVM),以及一个flexram(可用于模拟EE或作为普通的ram使用)。每个型号的各个memory大小不同,11x系列较小,14x系列较大。
二.eeprom的使用方法:
使用方法为将flexram配置为EE,同时要划分一部分区域的NVM给与EE进行备份存储。划分NVM和RAM的大小需要寄存器进行配置。这里拿S32K116进行举例:
配置一个占用NVM24KB,占用ram 2KB的eeprom。
sdk配置使用:
1.配置好各个memory的使用地址后,初始化flash
2.判断flash结构体中的ee大小是否为0,如果为0则需要调用sdk库中的FLASH_DRV_DEFlashPartition函数对ee进行配置,参数uEEEDataSizeCode与uDEPartitionCode根据寄存器配置,使用2kb的ram和24kb的NVM,分别配置为0x03和0x09,各不同的配置根据上面寄存器中所展示的值进行配置
3.调用函数FLASH_DRV_SetFlexRamFunction使能flexram作为ee的使用
4.写入ee:调用函数FLASH_DRV_EEEWrite在特定地址写入数据,需要注意地址对齐
5.读取ee:通过指针取出特定地址上的数据
6.擦除一块sector :特定地址写入四个字节的0xFF
7.在操作ee时,均需判断flash结构体中的eesize是否为0
8.在配置和操作ee之前,注意关闭mcu全局中断,完成之后再开启
三.flash的使用
s32k1xx拥有许多的flash功能,这里只介绍其擦除与写入功能。所有的flash操作都是通过一套寄存器指令进行的。具体可看数据手册。
1.擦除:s32k1xx的flash是按照sector单位进行擦除的,11x系列的sector为2kb,14x系列的sector为4kb。调用库中函数Flash_EraseSector进行擦除,在操作前需关闭全局中断
2.写入:s32k1xx的flash是按照字节单位进行写入的,一般每次可写入8字节。调用库中函数Flash_Program进行写入,在操作前需关闭全局中断
3.在每个flash的操作函数中都调用了一个FLASH_DRV_CommandSequence函数,其作用是执行flash操作的指令。如果直接调用库中的各种flash操作函数操作flash本身,则可能会造成flash错误,程序跑飞。所以在一些产品开发的过程当中(例如汽车ecu的bootloader),为了保护程序,在擦除或写入时通常将FLASH_DRV_CommandSequence作为flash驱动放入ram中运行,就可以解决这个问题。具体的方法是:使用指针函数将这个函数映射到ram的地址上运行。