基于Autosar架构下Fls相关函数的使用方法(S32K146)

本文介绍了Mcal库中的Fls_Write、Fls_Erase和Fee_Write函数使用方法,重点讲解了地址对齐、长度要求以及Fee初始化时关于Cluster和DFlash的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习目标:

总结如下几个函数的使用方法:
Fls_Write(TargetAddress,* SourceAddressPtr, Length);
Fls_Erase(TargetAddress, Length);
Fee_Write( BlockNumber, *DataBufferPtr)
以及Mcal配置完Fee后反应再Flash上的特点

学习内容:

1、Fls_Write(TargetAddress,* SourceAddressPtr, Length)
TargetAddress:MCAL配置Fls时Fls Sector Star Address ,逻辑地址。比如下图,这里一定要注意填入的地址要与Sector的首地址对齐
在这里插入图片描述

  • SourceAddressPtr:没啥特殊的,你要写入数据的地址
  • Length:这里要注意,该长度一定要与Flash页大小对齐,mcal中也有页长度的配置,不同Flash的页长度不同。
  • 在这里插入图片描述
    Autosar架构中,该函数执行结束后并回来立即写入Flash,而是要通过调用 Fls_MainFunction();来开启Job
    在这里插入图片描述
    2、Fls_Erase(TargetAddress, Length)
    TargetAddress:同上,逻辑地址,且为Sector首地址
    Length:固定为一个Sector的小,S32K146中一个sector大小2048byte
    同样,调用该函数后需要通过Fls_MainFunction()来开启擦除任务。
    3、Fee_Write( BlockNumber, *DataBufferPtr)
    BlockNumber:mcal中配置的group号
    DataBufferPtr:写入数据地址
    在这里插入图片描述
    注意,该函数写入数据长度与Fee Virtual Page Size对齐,本应用中配置为32byte。且数据写入位置为当前
    在这里插入图片描述
    在这里插入图片描述
    4、Fee初始化时会生成对应的Cluster头信息,该信息是每一个Fee的Group生成一个(内部的Cluster公用这一个头信息)。比如本项目FLAG_Groupd内部有两个Cluster,每个Cluster只配置一个Sector
    在这里插入图片描述
    在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/5fbc8019843240eaa885dc882e78f01d.pn在这里插入图片描述在这里插入图片描述
5、Fee进行初始化时有如下特点:
在这里插入图片描述
①该任务会在DFlash中以ClusterGroup为单位创建Cluster头信息,且只有组内的第一页会创建该信息
②初始化时回去遍历所有的Cluster头信息
总结:在调用Fee_Init(NULL_PTR)时,程序会以GROUP为单位创建Cluster头。

下面是一个基于AUTOSAR架构的CAN网络管理函数的伪代码。在实际的开发中,需要将其转换为具体的编程语言,并进行相关的配置和适配。 ``` void CanIf_Init(const CanIf_ConfigType* ConfigPtr) { /* 初始化CAN控制器 */ Can_Init(ConfigPtr->CanControllerConfig); /* 初始化CAN控制器的物理通道 */ for (uint8 i = 0; i < ConfigPtr->CanControllerConfig->CanControllerNum; i++) { CanIf_ControllerConfigType* ControllerConfigPtr = &ConfigPtr->ControllerConfig[i]; Can_SetControllerMode(ControllerConfigPtr->ControllerId, CAN_CS_STARTED); Can_Write(ControllerConfigPtr->ControllerId, &CanPdu); } } Std_ReturnType CanIf_Transmit(PduIdType TxPduId, const PduInfoType* PduInfoPtr) { /* 通过PDU ID获取对应的CAN控制器ID */ CanIf_ControllerConfigType* ControllerConfigPtr = &CanIf_ConfigPtr->ControllerConfig[TxPduId]; /* 将PDU数据转换为CAN数据 */ Can_PduType CanPdu; CanPdu.id = ControllerConfigPtr->TxPduConfigPtr->CanId; CanPdu.length = PduInfoPtr->SduLength; memcpy(CanPdu.sdu, PduInfoPtr->SduDataPtr, PduInfoPtr->SduLength); /* 发送CAN数据 */ return Can_Write(ControllerConfigPtr->ControllerId, &CanPdu); } void CanIf_RxIndication(Can_HwHandleType Hrh, const Can_PduType* PduInfoPtr) { /* 获取PDU ID */ PduIdType RxPduId = CanIf_ConfigPtr->HrhToPduMap[Hrh]; /* 将CAN数据转换为PDU数据 */ PduInfoType PduInfo; PduInfo.SduDataPtr = PduInfoPtr->sdu; PduInfo.SduLength = PduInfoPtr->length; /* 调用上层模块的接收处理函数 */ CanIf_RxIndication(RxPduId, &PduInfo); } ``` 这段伪代码实现了CAN网络的初始化、发送和接收功能,可以作为基于AUTOSAR架构的CAN网络管理函数的参考。其中,`CanIf_Init`函数用于初始化CAN网络,`CanIf_Transmit`函数用于发送CAN数据,`CanIf_RxIndication`函数用于接收CAN数据并将其转换为PDU数据。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值