工具/软件:
您好:
我正在为 Cortex-R5(MAIN 域)处理裸机项目。
我仅使用 IPC 驱动程序、特别是邮箱支持来自:
ti/drv/ipc/src/mailbox/csl_mailbox.h
我在这个设置中没有使用 MCAL 或 AUTOSAR。
为了配置中断、我将使用 CSL(芯片支持库)、用于 VIM(矢量中断管理器)和中断路由器 (INTRTR)。 我已验证中断路由是否正常工作(当我从接收器内核本身在本地发送消息时,中断会成功触发)。
工作原理:
-
当消息由也接收该消息的同一 R5 内核发送(环回测试)时、邮箱中断会正确触发。
-
VIM 中断设置和 NAVSS INTR 路由器配置完全通过 CSL 处理并确认有效。
问题:
当我复位 CPU(通过 CCS 中的 CPU 复位或重新启动)时、或者当我运行发送器内核 (R5FSS1-0) 以向接收器内核 (R5FSS0-0) 发送消息时、不会触发中断。
更具体地说:
-
发送方发送消息时不会触发中断。 -
我没有使用
MailboxReset()(因为它仅在 MCAL 中可用)、IPC BareMetal 邮箱驱动程序似乎不提供类似的 API。 -
相同的代码在首次引导时工作正常、但在仅 CPU 复位后会失败。
我的问题:
-
由于我不使用 MCAL、因此在 CPU 复位后、我需要对邮箱外设执行什么正确的初始化或复位序列?
-
我是否需要手动清除任何寄存器 才能重新启用中断功能?
-
在复位之间如何保留邮箱状态、是否预计会出现此行为?
-
是否有任何干净的最小设置或权变措施来可靠地重新初始化邮箱以在不使用完整 MCAL 层的情况下使用中断?
我的代码:
发送方:
#include <stdint.h>
#include <ti/csl/soc.h>
#include <stdio.h>
#include <ti/drv/ipc/src/mailbox/csl_mailbox.h>
#define MAILBOX0_BASE_ADDR (CSL_NAVSS0_MAILBOX_REGS0_BASE)
#define QUEUE_ID MAILBOX_QUEUE_0
#define USER_ID 1U
#define MENSAGEM (0xDEADBEEF)
int main(void)
{
uint32_t status;
while (1)
{
status = Mailbox_sendMessage(MAILBOX0_BASE_ADDR, QUEUE_ID, MENSAGEM);
}
return 0;
}接收器:
#include <stdint.h>
#include <stdio.h>
#include <ti/csl/soc.h>
#include <mwfal/mwfintc/interrupt_config.h>
#include <ti/drv/ipc/src/mailbox/csl_mailbox.h>
#define MAILBOX0_BASE_ADDR (CSL_NAVSS0_MAILBOX_REGS0_BASE)
#define QUEUE_ID MAILBOX_QUEUE_0
#define USER_ID 0U
#define VIM_CHANNEL_MAILBOX 224
void mailbox_isr(void *arg)
{
uint32_t mensagem = 0;
if (Mailbox_getRawNewMsgStatus(MAILBOX0_BASE_ADDR, USER_ID, QUEUE_ID))
{
Mailbox_getMessage(MAILBOX0_BASE_ADDR, QUEUE_ID, &mensagem);
printf("Received via IRQ: %u (0x%08X)\n", mensagem, mensagem);
Mailbox_clrNewMsgStatus(MAILBOX0_BASE_ADDR, USER_ID, QUEUE_ID);
HW_WR_REG32(MAILBOX0_BASE_ADDR + CSL_MAILBOX_IRQ_EOI, USER_ID);
}
}
void init_interrupts(void)
{
Mailbox_disableNewMsgInt(MAILBOX0_BASE_ADDR, USER_ID, QUEUE_ID);
Mailbox_enableNewMsgInt(MAILBOX0_BASE_ADDR, USER_ID, QUEUE_ID);
Mailbox_clrNewMsgStatus(MAILBOX0_BASE_ADDR, USER_ID, QUEUE_ID);
InterruptConfig mboxIntCfg = {
.channel = VIM_CHANNEL_MAILBOX,
.priority = 0,
.mapType = INTR_MAP_IRQ,
.triggerType = INTR_TYPE_LEVEL,
.callback = mailbox_isr,
.callbackArg = NULL
};
interrupt_init(&mboxIntCfg);
}
int main(void)
{
init_interrupts();
uint32_t msg = 0;
Mailbox_getMessage(MAILBOX0_BASE_ADDR, QUEUE_ID, &msg);
while (1)
{
// waiting for interrupt
}
return 0;
}中断路由器配置 (CSL):
#include <stdint.h>
#include <ti/csl/csl_intr_router.h>
#include <ti/csl/soc.h>
#define R5FSS0_0_OUTL_INDEX 192U
#define R5FSS1_0_OUTL_INDEX 256U
#define MAILBOX0_R5FSS0_0_IN 436U
#define MAILBOX0_R5FSS1_0_IN 437U
void configure_navss_intr_router(void)
{
CSL_IntrRouterCfg NAVSS0 = {
.pIntrRouterRegs = (CSL_intr_router_cfgRegs *)CSL_NAVSS0_INTR0_INTR_ROUTER_CFG_BASE,
.pIntdRegs = NULL,
.numInputIntrs = 447,
.numOutputIntrs = 407
};
CSL_intrRouterCfgMux(&NAVSS0, MAILBOX0_R5FSS0_0_IN, R5FSS0_0_OUTL_INDEX);
CSL_intrRouterCfgMux(&NAVSS0, MAILBOX0_R5FSS1_0_IN, R5FSS1_0_OUTL_INDEX);
}
VIM 中断配置(基于 CSL):
// interrupt_config.c
#include "interrupt_config.h"
void interrupt_init(const InterruptConfig *config)
{
Intc_Init();
Intc_IntEnable(config->channel);
Intc_IntSetSrcType(config->channel, (uint32_t)config->triggerType);
Intc_IntPrioritySet(config->channel, config->priority, (uint32_t)config->mapType);
Intc_IntRegister(config->channel, config->callback, config->callbackArg);
Intc_SystemEnable();
}
非常感谢您能深入了解如何在此设置中完全重新初始化邮箱外设。
此致、
Heverton