简介:
MCXN947 是个双核的MCU,内部集成的Mailbox IP可以实现核间通信的需求。对应的寄存器只有IRQ/IRQSET/IRQCLR及MUTEX四组寄存器,应用起来也很容易。其中IRQSET/IRQCLR 用于更新清除mailbox数据,core0如果要和core1通信通过IRQ(CPU1)/IRQSET(CPU1) 寄存器设置core1mailbox,对应的数据不为0,core1 就会产生mailbox中断,读取IRQ数据从而完成核间通信。MUTEX是个双核共享的寄存器可以用于核间共享资源的互斥访问。


对应mailbox IP 的clock 和 reset 信号的控制通过如下的SCONS 寄存器配置。

MAILBOX_Init 代码正是操作上述两个信号完成初始化配置。
/*!
* @name MAILBOX initialization
* @{
*/
/*!
* @brief Initializes the MAILBOX module.
*
* This function enables the MAILBOX clock only.
*
* @param base MAILBOX peripheral base address.
*/
static inline void MAILBOX_Init(MAILBOX_Type *base)
{
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
CLOCK_EnableClock(kCLOCK_Mailbox);
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
#if !(defined(FSL_FEATURE_MAILBOX_HAS_NO_RESET) && FSL_FEATURE_MAILBOX_HAS_NO_RESET)
/* Reset the MAILBOX module */
RESET_PeripheralReset(kMAILBOX_RST_SHIFT_RSTn);
#endif
}MCXN947 mailbox IRQ 使用流程说明如下,我们参照该流程编写测试代码验证mailbox 通信IRQ功能。

我们在上一篇的基础上在CORE0 发送IRQ消息给CORE1,CORE1 在收到后翻转LED 显示并给CORE0 发送ack 表示接收到CORE0消息,从而验证CORE0和CORE1之间的mailbox IRQ 通信功能。
按照上述的思路我们在core0 添加如下代码,美500 ms 给core1 发送mailbox 消息通知翻转LED,在接收到core1的应答消息后打印接收到core1的消息ID.
#include "fsl_mailbox.h"
void MAILBOX_IRQHandler()
{
rt_kprintf("recive from core1 ack mailbox value %d.\n",MAILBOX_GetValue(MAILBOX,kMAILBOX_CM33_Core0));
MAILBOX_ClearValueBits(MAILBOX,kMAILBOX_CM33_Core0,0xffffffff);
}
int main(void)
{
#if defined(__CC_ARM)
rt_kprintf("using armcc, version: %d\n", __ARMCC_VERSION);
#elif defined(__clang__)
rt_kprintf("using armclang, version: %d\n", __ARMCC_VERSION);
#elif defined(__ICCARM__)
rt_kprintf("using iccarm, version: %d\n", __VER__);
#elif defined(__GNUC__)
rt_kprintf("using gcc, version: %d.%d\n", __GNUC__, __GNUC_MINOR__);
#endif
rt_kprintf("MCXN947 HelloWorld\r\n");
MAILBOX_Init(MAILBOX);
NVIC_EnableIRQ(MAILBOX_IRQn);
while (1)
{
rt_thread_mdelay(500); /* Delay 500mS */
rt_kprintf("send to core1 req.\n");
MAILBOX_SetValue(MAILBOX,kMAILBOX_CM33_Core1,1);
}
}编写完core0 的代码我们在core1 添加代码接收到core0 的IRQ消息后翻转LED,并给core0 ack,对应代码如下
/*
* Copyright (c) 2015, Freescale Semiconductor, Inc.
* Copyright 2016-2020 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "pin_mux.h"
#include "board.h"
#include "mcmgr.h"
#include "fsl_common.h"
#include "fsl_gpio.h"
#include "fsl_mailbox.h"
void MAILBOX_IRQHandler()
{
LED_TOGGLE();
MAILBOX_ClearValueBits(MAILBOX,kMAILBOX_CM33_Core1,0xffffffff);
MAILBOX_SetValue(MAILBOX,kMAILBOX_CM33_Core0,100);
}
/*!
* @brief Main function
*/
int main(void)
{
uint32_t startupData, i;
mcmgr_status_t status;
/* Init board hardware.*/
/* enable clock for GPIO */
CLOCK_EnableClock(kCLOCK_Gpio0);
BOARD_InitBootPins();
MAILBOX_Init(MAILBOX);
NVIC_EnableIRQ(MAILBOX_IRQn);
/* Configure LED */
LED_INIT();
for (;;)
{
}
}下载运行core0 和 core1 已经按照预期的方式工作,led 已经通过core0 的mailbox 通知点亮熄灭,cor0 和 core1 的双方通信也是ok

我要赚赏金
