这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 汽车电子 » 【S32K3XX】核间通信MU使用

共2条 1/1 1 跳转至

【S32K3XX】核间通信MU使用

高工
2025-12-06 10:47:30     打赏

【简介】

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png


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

image.png

在S32DS 中加入HSE模块,就会将MU 的驱动接口加入工程中,计入工程后就可以使用RTD的MU的驱动来完成核间通讯。

以下为S32K3 RM手册中,对MU 通信步骤说明。

image.png


我们可以按照上述的流程来实现 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 的收发中断。

image.png

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

image.png

基于上述流程添加如下测试代码:

/** *****************************************************************************************************
 * \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 按照预期接收到数据并打印。

image.png

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

image.png


院士
2025-12-08 23:24:18     打赏
2楼

可能是太晚了。注意力没有集中,标记一下,明天白天继续学习。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]