您好,目前我正在尝试对 S32K314HMS 微控制器进行 A/B 交换。交换请求通过以下方式提出:
/* 重置作业状态变量 */
交换作业状态=交换作业待处理;
/* 设置 HSE 请求的服务描述符 */
swapHseSrvDescriptor.srvId = HSE_SRV_ID_ACTIVATE_PASSIVE_BLOCK;
/* 设置要发送到 HSE IP 层的请求参数 */
swapHseIpRequest.eReqType = HSE_IP_REQTYPE_ASYNC_POLL ;
swapHseIpRequest.u32Timeout = SWAP_TIMEOUT ;
swapHseIpRequest.pfCallback = SwapProcessMuChannelResponse;
/* 向 HSE IP 层发送服务请求 */
如果 (HSE_SRV_RSP_OK != Hse_Ip_ServiceRequest(SWAP_MU_INSTANCE, SWAP_MU_ADMIN_CHANNEL, &swapHseIpRequest, &swapHseSrvDescriptor))
{
结果= E_NOT_OK ;
}
然后会执行 swapHseIpRequest.pfCallback ( SwapProcessMuChannelResponse ) ,返回的 HseResponse 将是:
static void SwapProcessMuChannelResponse ( uint8 u8MuInstance , uint8 u8MuChannel ,
hseSrvResponse_t HseResponse , void * pCallbackParam )
{
如果( HseResponse == HSE_SRV_RSP_OK )
{
vFotaH_Appl_SwapJobStatus = SWAP_JOB_OK ;
}
别的
{
vFotaH_Appl_SwapJobStatus = SWAP_JOB_FAILED ;
VStdLib_ConvertUint32ToUint8ArrayBigEndian (( uint32 ) HseResponse ,调试数据);
}
}
#define HSE_SRV_RSP_NOT_SUPPORTED (( hseSrvResponse_t ) 0xAA55A11EUL ) /**< @brief 不支持此操作或功能。 */
这种情况偶尔会发生,有时交换会按预期进行。原因可能是什么?我可以在哪里找到 HSE 返回此返回代码的原因/情况?
此交换是在更新序列结束时触发的,在RESET/上电几分钟后(因此 HSE 已 100% 初始化)。
嗨@AlexI
这是一个非常简单的服务,没有任何参数。我唯一的解释就是这是数据缓存内存造成的。请确保将描述符放置在不可缓存的内存中。
通常情况下,所有用于与 HSE 通信的数据对象都必须强制存储在不可缓存的内存中,因为 HSE 无法访问缓存。
虽然这可能不是本案的原因,但是:如果使用 DTCM 内存,则必须使用后门地址。普通地址仅对拥有该内存的核心可见。其他总线主控器(其他核心、DMA、HSE 等)只能通过后门地址看到此内存。

此致,
Lukas