【Autosar】MCAL - FLS(NXP - S32K14x)

MCAL - FLS(NXP - S32K14x)

MCAL - 汇总

  • 配置工具:EB Tresos Studio
  • 芯片类型:S32K146

1. 概述

1.1 内存介绍

Flash组成:Code Falsh(program flash) / Data Flash(FlexNVM)。Data Flash一般用来储存数据,通过配置也可以用作模拟EEPROM的备份。

从下图可以看到,S32K146you 1M的Code Flash和64K的Data Flash:

在这里插入图片描述

从下面的配置表界面可以看到,Fls Physical Sector中已经设定好了32个FLS DATA(2k)和256个FLS CODE(4k)供用户选择:

在这里插入图片描述

1.2 虚拟内存

从配置界面下可以看到,有Fls Physical SectorFls Sector两个配置,分别对应物理内存虚拟内存

在这里插入图片描述

如下图所示,假设用户配置了3个扇区的虚拟内存(每个扇区大小4K),用户在配置的时候将虚拟内存对应到物理内存,在软件操作的时候,用户都是面向虚拟内存,FLS模块底层会根据配置信息将虚拟内存对应到实际的物理内存。

在这里插入图片描述

1.3 任务处理

FLS所有的提交任务都是以异步的方式处理的,它的原理就是通过Fls_MainFunction函数轮询当前的任务状态,当有任务时就去处理,处理完成后触发回调函数。Fls_MainFunction就是一个状态机,Fls_EraseFls_WriteFls_Read等函数都是用来提交任务,将当前需要处理的数据的信息(起始地址、大小、读/写等)"提交"后(公共变量复制),由Fls_MainFunction去处理。(当前任务处理未完成的情况下,新的任务不能提交)。FLS回调函数没有参数,上层用户无法通过回调获取当前执行的任务信息,所以用户需要自己保存任务信息,当FLS触发回调之后,再根据信息去处理接下去的任务。

按照这种异步的设计方式,上层用户使用FLS的时候有两种方式:

  • 上层提交任务后,通过FLS的完成回调函数通知上层,上层再根据本地保存信息处理后续任务。
  • 上层提交任务后,通过轮询的方式查看FLS的状态来判断是否完成任务。

1.4 Access Code

Access Code是一段专门用于擦/写操作的代码,这部分代码独立在Fls_Ac.c中。由于不规范的Flash操作可能会导致RWW(Read while write)问题出现,RWW问题意思就是在同一时刻对同分区内存既又(擦/写),这里的不是指用户从内存读数据,而是MCU从内存中取指令。由于硬件(flash访问接口)的原因,假设你的代码运行在FLASH - A中,在这期间你是不能执行(写/擦)操作的,但是你可以去(擦/写)FLASH- B。因此FLS模块的设计包含将AC代码搬移到其他区执行的功能(用户根据自己的内存分配来决定是否开启该功能)。下图为不同分区内存之间允许同时进行的操作描述图:

在这里插入图片描述
S32k146的内存分区如下所示(此图没有画出P-RAM),从下图我们可以看到,Code Flash有2个分区,每个分区512k,Data Flash是一个分区,FlexRam是一个分区,P-RAM是一个分区。

例 - 1:程序设计将数据保存在Data Flash中,(擦 / 写)代码运行在Code Flash中,那么不需要开启AC搬移的功能,因为这是两个不同的分区。

例 - 2:程序设计将数据保存在Code Flash中,恰好与(擦 / 写)代码所处于同一分区,那么此时要开启AC搬移功能,先将AC搬移到指定的内存(其他分区)中再执行。

在这里插入图片描述

2. API

函数描述
Fls_Init初始化FLS模块
Fls_Erase擦除内存数据
Fls_Write写入内存数据
Fls_Read读取内存数据
Fls_Cancel取消当前操作
Fls_GetStatus获取当前工作状态
Fls_GetJobResult获取任务执行结果
Fls_Compare数据比较
Fls_SetMode设置工作模式
Fls_MainFunction任务处理函数(状态机)

3. 配置介绍

3.1 General

3.1.1 FlsConfigSet

在这里插入图片描述
Fls Access Code Erase:RAM地址

Fls Access Code Write:RAM地址

AC code加载地址,当Fls Load Access Code On Job Start 开启时需要关注

Fls Access Code Erase Pointer:NULL_PTR

Fls Access Code Write Pointer:NULL_PTR

除非用户要自己实现擦/写函数,如果自己实现,并且开启AC搬移,需注意代码的地址无关

Fls Default Mode:FLASH初始运行模式

Fls AC Callback:Access Code回调函数

Fls Job End Notification:任务执行完成回调

Fls Job Error Notification:任务执行错误回调

Fls Start Flash Access Notification:AC代码执行前回调

Fls Finished Flash Access Notification:AC代码执行后回调

在这里插入图片描述

Fls Max Read FastMode:快速模式下单次数据读取最大长度

Fls Max Read Normal Mode:普通模式下单次数据读取最大长度

读取数据,不要超过FLASH大小

Fls Max Write Fast Mode:快速模式下单次数据写入最大长度

Fls Max Write Normal Mode:普通模式下单次数据写入最大长度

数据写入,必须大于0且是8的倍数

在这里插入图片描述

3.1.2 FlsGeneral

在这里插入图片描述

Fls Load Access Code On Job Start:AC代码搬移

当未开启的时候,配置项中(擦/写)函数直接引用AC函数,存放的是函数地址,如下图所示:

在这里插入图片描述

当开启的时候,配置项中存放的是用户配置的RAM地址,在(擦/写)操作开始之前,将ROM中的AC代码搬移到这个RAM地址中去,如下图所示:

在这里插入图片描述

因此用户需要合理的指定RAM的地址,并且将AC代码固定到指定的地址,这样才能进行数据搬移。AC代码固定到指定的地址,S32DS就去改写ld文件,IAR就去改写icf文件等。

注意:开启了该选项后,在程序和擦除地址在同一分区的情况下,(擦/写)模式不能配置为异步操作,必须是同步操作。

3.2 FlsSector

在这里插入图片描述

Fls Physical Sector Unlock:在初始化的时候对扇区解锁

Fls Physical Sector:物理扇区选择

Fls Physical Sector Size:物理扇区大小

Fls Number Of Sector:仅针对于外部Flash描述相同且连续的扇区,内部FLASH只能填1

Fls Page Size:扇区页大小

Fls Sector Size:扇区大小

Fls Sector Start Address:扇区起始位置

Fls Sector Erase Asynch:擦除(异步模式)

Fls Page Write Asynch:写入(异步模式)

异步模式:擦/写动作执行完成后,不是阻塞等待结果,通过Fls_MainFunction轮询查询结果


参考资料:

S32K-RM.pdf - NXP

AUTOSAR_MCAL_FLS_UM[1].pdf - NXP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值