简介:
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