This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMDSCNCD28388D: 运行时,即使CPU1没有置位IPC_FLAG0,但CM总会进入一次CPU1TOCMIPCINT0中断函数。

Part Number: TMDSCNCD28388D

Hi,我在打算利用28388的以太网向上位机发送字符串,但在CPU1toCM IPC中断一块遇到了一些问题。

CPU1在向MSGRAM写完字符串后会将ipcflag1置位,去触发CM的ipc中断。CM中我注册了两个ipc中断(CPU1TOCMIPCINT0INT1),分别有不同的用途。

但我发现在CPU1 中置位ipc_flag1时会同时触发CM的CPU1TOCMIPCINT0INT1两个中断(如图调试中中断次数均为1)

/**********问题如下*********/

于是我换了一个比较简单的框架,对ipc中断进行测试,发现问题在于每次启动CM核都会自动进入一次CPU1TOCMIPCINT0(如下图),不清楚为什么每次运行CPU1即使没有置位ipcflag0,但CM依然会触发一次CPU1TOCMIPCINT0中断?想请教下原因。

附上两个核心的程序代码:

CPU1:就是根据TI例程修改的一个定时器中断,每次中断置位ipcflag2

void main(void)
{

    Device_init();
    Device_bootCM(BOOTMODE_BOOT_TO_FLASH_SECTOR0);

    Device_initGPIO();

    Interrupt_initModule();
    Interrupt_initVectorTable();
    Interrupt_register(INT_TIMER0, &cpuTimer0ISR);
    initCPUTimers();
    configCPUTimer(CPUTIMER0_BASE, DEVICE_SYSCLK_FREQ,20);
    CPUTimer_enableInterrupt(CPUTIMER0_BASE);
    Interrupt_enable(INT_TIMER0);
    CPUTimer_startTimer(CPUTIMER0_BASE);

    EINT;
    ERTM;

    IPC_clearFlagLtoR(IPC_CPU1_L_CM_R,IPC_FLAG_ALL); //clear flag all
    IPC_sync(IPC_CPU1_L_CM_R, IPC_FLAG31);// sync two core

    while(1);

}

__interrupt void cpuTimer0ISR(void)
{
    CpuTimer0Count++;
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);

    IPC_setFlagLtoR(IPC_CPU1_L_CM_R, IPC_FLAG2);
}

CM代码:(注册了三个ipc中断,查看CPU1置位flag2,几个中断函数的运行次数)

#include "driverlib_cm.h"
#include "cm.h"

uint16_t Ipc0IsrCount,Ipc1IsrCount,Ipc2IsrCount=0;

__interrupt void IPC0ISR(void);
__interrupt void IPC1ISR(void);
__interrupt void IPC2ISR(void);

void main(void)
{

    CM_init();

    Interrupt_registerHandler(INT_CPU1TOCMIPC0, &IPC0ISR);
    Interrupt_registerHandler(INT_CPU1TOCMIPC1, &IPC1ISR);
    Interrupt_registerHandler(INT_CPU1TOCMIPC2, &IPC2ISR);
    Interrupt_enable(INT_CPU1TOCMIPC0);
    Interrupt_enable(INT_CPU1TOCMIPC1);
    Interrupt_enable(INT_CPU1TOCMIPC2);

    IPC_clearFlagLtoR(IPC_CM_L_CPU1_R,IPC_FLAG_ALL); //clear flag all
    IPC_sync(IPC_CM_L_CPU1_R, IPC_FLAG31);
    while(1)
    {}
}

__interrupt void IPC0ISR(void)
{
    IPC_ackFlagRtoL(IPC_CM_L_CPU1_R,IPC_FLAG0);
    Ipc0IsrCount++;
}

__interrupt void IPC1ISR(void)
{
    IPC_ackFlagRtoL(IPC_CM_L_CPU1_R,IPC_FLAG1);
    Ipc1IsrCount++;
}

__interrupt void IPC2ISR(void)
{
    IPC_ackFlagRtoL(IPC_CM_L_CPU1_R,IPC_FLAG2);
    Ipc2IsrCount++;
}