【简介】
S32K3 系列 MCU 的 MU 模块用于核间通信,不同型号数量不同。S32K324 的 MU0/MU1 负责应用核与 HSE 核通信,MU2 用于应用核间通信。

MU 含 MUA 与 MUB,各提供 4 个发送和接收寄存器,依托标志位与同步机制实现核间同步消息传输,助力两侧核数据交互。以下是 MU 模块的功能框图。

上述框图中可以看出MU 模块中是分为A/B 两侧,两侧有相同的配置寄存器,以下是MU A侧的寄存器配置。

同样B侧也有相同的寄存器,只是BASE 地址存在差异。

A/B 的寄存器配置有独立的时钟控制。

同样中断信号也是分为A/B两侧的中断事件。

S32 RTD 驱动的 MU 驱动集成于 HSE 模块,驱动文件可在 RTD 驱动模块目录中查阅

在S32DS 中加入HSE模块,就会将MU 的驱动接口加入工程中,计入工程后就可以使用RTD的MU的驱动来完成核间通讯。
以下为S32K3 RM手册中,对MU 通信步骤说明。

我们可以按照上述的流程来实现 core 之间的 数据交互。
step1> MUA 将要要发送的数据内容写入TRn 寄存器,会反应到B面的RRn 寄存器中。
step2>MUA 将数据放置到TRn寄存器的同时会清除MUA端的 Tx empty状态,同时设置MUB端的Rx full 状态。
step3>MUB 端的Rx full 状态后如果使能了RIEn 中断,Procressor B 会收到中断请求。
step4> Procressor B 会收到中断请求后,读取MUB RRn寄存器读取数据。
step5>读取MUB RRn寄存器读取数据后,MU 会清除MUB端的Rx full 状态 并设置MUA端的 Tx empty状态。
step6> 设置MUA端的 Tx empty状态后,MUA 使能了TIEn 的中断后,Procressor A 会收到中断事件代表传输完成。
上述流程中涉及的 RX/TX 中断可以通过 IntCtrl 模块来配置,在CORE0 配置中开启MUA 的收发中断。

同时在CORE1 的配置中开启MUB 的TX/RX 中断配置。

基于上述流程添加如下测试代码:
/** *****************************************************************************************************
* \file dual_core_driver.c *
* \brief *
* *
* <table> *
* <tr><th>Date <th>Version *
* <tr><td>2025/12/08 <td>1.0.0 *
* </table> *
*******************************************************************************************************/
/********************************************************************************************************
* Include header files *
*******************************************************************************************************/
#include "dual_core_mu_driver.h"
#include "string.h"
#include "printf.h"
/*==================================================================================================
* LOCAL MACROS
*================================================================================================*/
/*==================================================================================================
* LOCAL CONSTANTS
*================================================================================================*/
/*==================================================================================================
* LOCAL FUNCTIONS
*================================================================================================*/
/*==================================================================================================
* LOCAL VARIABLES
*================================================================================================*/
/*==================================================================================================
* LOCAL TYPEDEFS (STRUCTURES, UNIONS, ENUMS)
*================================================================================================*/
/*==================================================================================================
* LOCAL FUNCTION PROTOTYPES
*================================================================================================*/
/*==================================================================================================
* GLOBAL VARIABLES
*================================================================================================*/
/*==================================================================================================
* GLOBAL CONSTANTS
*================================================================================================*/
/*==================================================================================================
* GLOBAL FUNCTIONS
*================================================================================================*/
#if defined (CORE0)
ISR(MUA_TX_ISR)
{
PRINTF("send mua message\r\n");
}
ISR(MUA_RX_ISR)
{
PRINTF("Received MUB message: 0x%08lx\r\n", Mu_Ip_GetRxRegister(IP_MU_2__MUA, 0));
}
#endif
#if defined (CORE1)
ISR(MUB_TX_ISR)
{
PRINTF("send mub message\r\n");
}
ISR(MUB_RX_ISR)
{
PRINTF("Received MUA message: 0x%08lx\r\n", Mu_Ip_GetRxRegister(IP_MU_2__MUB, 0));
}
#endif
/********************************************************************************************************
* Shell command define *
*******************************************************************************************************/
#if defined (CORE0)
unsigned int mu(char argc, char **argv)
{
(void)argc;
static uint32_t msg = 0xA5A5A5A5;
if(strncmp(argv[1],"init",5)==0)
{
/* Initialize MU interrupt */
Mu_Ip_SetRxIrqEnable(IP_MU_2__MUA, 0, TRUE);
Mu_Ip_SetRxIrqEnable(IP_MU_2__MUA, 0, TRUE);
}
else if(strncmp(argv[1],"send",5)==0)
{
Mu_Ip_SetTxRegister(IP_MU_2__MUA, 0, msg);
msg++;
}
return 0;
}
#endif
#if defined (CORE1)
unsigned int mu(char argc, char **argv)
{
(void)argc;
static uint32_t msg = 0xA5A5A5A5;
if(strncmp(argv[1],"init",5)==0)
{
/* Initialize MU interrupt */
Mu_Ip_SetRxIrqEnable(IP_MU_2__MUB, 0, TRUE);
Mu_Ip_SetRxIrqEnable(IP_MU_2__MUB, 0, TRUE);
}
else if(strncmp(argv[1],"send",5)==0)
{
Mu_Ip_SetTxRegister(IP_MU_2__MUB, 0, msg);
msg++;
}
return 0;
}
#endif在core0 通过 MU 发送数据给core1 core1 按照预期接收到数据并打印。

同理在core1 端发送数据 core0 同样按照预期接收到数据。

我要赚赏金
