这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【FRDM-MCXN947评测】核间通信IRQ

共5条 1/1 1 跳转至

【FRDM-MCXN947评测】核间通信IRQ

工程师
2024-11-10 00:15:58   被打赏 50 分(兑奖)     打赏

简介:

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

image.png

image.png

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

image.png

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功能。

image.png


我们在上一篇的基础上在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

20241110-014724.gif


专家
2024-11-10 00:43:44     打赏
2楼

谢谢分享


专家
2024-11-10 01:37:27     打赏
3楼

感谢楼主分享


菜鸟
2024-11-10 20:06:59     打赏
4楼

感谢楼主分享


专家
2024-11-14 09:01:16     打赏
5楼

感谢楼主分享!核间通信,必须要掌握的知识了。


共5条 1/1 1 跳转至

回复

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