主题中讨论的其他器件:C2000WARE、 SysConfig
工具与软件:
你(们)好
在我的项目中、我将使用两个 CPU、其中 CPU1通过处理器间通信(IPC)向 CPU2发送命令。 接收到来自 CPU1的命令后、CPU2发送存储在其缓冲器中的 CAN 数据。 CPU2从外部源接收 CAN 数据。 但我遇到了一个问题:启动或运行代码时、CPU2在 CAN 初始化期间会卡住。 调试时、代码在can_initialization_RAM该段中暂停。
我已按照 C2000 多核开发用户指南中提供的指导原则配置 CPU1和 CPU2之间的 IPC 通信。 具体而言、我已确保 CPU1将数据写入 CPU1_TO_CPU2 MSGRAM、而 CPU2从该位置读取数据。
CPU1的以下代码
..........................................................................
/
//包含的文件
//
#include "driverlib.h"
#include "device.h"
#include "board.h"
#include "ipc.h"
#include "memcfg.h"
//
//定义
//
#define IPC_CMD_READ_CAN 0x1002
#define CPU1_TO_CPU2_FLAG IPC_FLAG0
#define CPU2_TO_CPU1_FLAG IPC_FLAG1
#define SYNC_FLAG IPC_FLAG31
#define CAN_DATA_SIZE 8.
#pragma DATA_SECTION (canData、"MSGRAM_CPU2_TO_CPU1")
易失性 uint32_t canData[CAN_DATA_SIZE];
//
//使 LED 闪烁
//
void blinkLED()
{
GPIO_togglePin (DEVICE_GPIO_PIN_LED1);
DEVICE_DELAY_US (500000);
GPIO_togglePin (DEVICE_GPIO_PIN_LED1);
}
//
// Main 函数
//
void main (void)
{
//初始化设备和外设
device_init();
// MemCfg_initSections (MEMCFG_SEC_MSGRAM_CPU2_TO_CPU1);
//MemCfg_initSections (MEMCFG_SEC_MSGRAM_CPU2_TO_CPU1);
Interrupt_initModule();
interrupt_initVectorTable();
board_init();
//配置 LED 引脚
GPIO_setPinConfig (DEVICE_GPIO_PIN_LED1);
GPIO_setDirectionMode (DEVICE_GPIO_PIN_LED1、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (DEVICE_GPIO_PIN_LED1、GPIO_PIN_TYPE_STD);
GPIO_setMasterCore (DEVICE_GPIO_PIN_LED1、GPIO_CORE_CPU1);
//初始化 IPC 并与 CPU2同步
IPC_clearFlagLtoR (IPC_CPU1_L_CPU2_R、IPC_FLAG_ALL);
IPC_SYNC (IPC_CPU1_L_CPU2_R、SYNC_FLAG);
eint;//启用全局中断
ERTM;
// while (1)
//{
//向 CPU2请求 CAN 数据
// ipc_sendCommand (IPC_CPU1_L_CPU2_R、CPU1_TO_CPU2_FLAG、IPC_ADDR_CORRECTION_ENABLE、
// IPC_CMD_READ_CAN、0、0);
//
////访问数据之前等待 CPU2响应
// ipc_waitForAck (ipc_CPU1_L_CPU2_R、CPU2_TO_CPU1_FLAG);
//
////接收到数据后立即闪烁 LED
// blinkLED ();
//
// device_delay_US (1000000);
//}
while (1)
{
//从 CPU2请求 CAN 数据
IPC_sendCommand (IPC_CPU1_L_CPU2_R、CPU1_TO_CPU2_FLAG、IPC_ADDR_CORRECTION_ENABLE、
IPC_CMD_READ_CAN、0、0);
//访问数据之前等待 CPU2响应
IPC_waitForAck (IPC_CPU1_L_CPU2_R、CPU2_TO_CPU1_FLAG);
//检查接收到的数据
uint8_t i;
bool 有效= true;
for (I = 0;I < CAN_DATA_SIZE;I++)
{
if (canData[i]== 0)
{
有效= false;
休息;
}
}
if (有效)
{
blinkLED();
}
DEVICE_DELAY_US (1000000);
}
}
CPU2的以下代码
..........................................................................
//
//包含的文件
//
#include "device.h"
#include "can.h"
#include "interrupt.h"
#include "sysctl.h"
#include "board.h"
#include "ipc.h"
//
//定义
//
#define IPC_CMD_READ_CAN 0x1002
#define IPC_CMD_RESP 0x2002
#define CPU1_TO_CPU2_FLAG IPC_FLAG0
#define CPU2_TO_CPU1_FLAG IPC_FLAG1
#define SYNC_FLAG IPC_FLAG31
#define TX_MSG_OBJ_ID 1.
#define RX_MSG_OBJ_ID 1.
#define MSG_DATA_LENGTH 8.
//#pragma DATA_SECTION (rxMsgData、"MSGRAM_CPU1_TO_CPU2")
//volatile uint16_t rxMsgData[MSG_DATA_LENGTH]={0};
#pragma DATA_SECTION (rxMsgData、"GSRAM");
volatile uint16_t rxMsgData[MSG_DATA_LENGTH]={0};
//
//函数原型
//
_interrupt void IPC_ISR0 (void);
_interrupt void canbISR (void);
//
// Main 函数
//
void main (void)
{
//初始化设备和 GPIO
device_init();
// MemCfg_initSections (MSGRAM_CPU1_TO_CPU2);
device_initGPIO();
//为 RX 配置 CANB
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANRXB);
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANTXB);
//初始化 CANB 模块
CAN_initModule (CANB_BASE);
CAN_setBitRate (CANB_BASE、DEVICE_SYSCLK_FREQ、500000、20);
//启用 CANB 中断
CAN_enableInterrupt (CANB_BASE、CAN_INT_IE0 | CAN_INT_ERROR | CAN_INT_STATUS);
//初始化中断系统
Interrupt_initModule();
INTERRUPT_REGISTER (INT_CANB0、&C);
INTERRUPT_ENABLE (INT_CANB0);
//设置 RX 消息对象
CAN_setupMessageObject (CANB_BASE、RX_MSG_OBJ_ID、0x1、CAN_MSG_FRAME_STD、
CAN_MSG_OBJ_TYPE_RX、0、CAN_MSG_OBJ_RX_INT_ENABLE、MSG_DATA_LENGTH);
can_startModule (cNB_BASE);
// IPC 初始化
IPC_clearFlagLtoR (IPC_CPU2_L_CPU1_R、IPC_FLAG_ALL);
IPC_SYNC (IPC_CPU2_L_CPU1_R、SYNC_FLAG);
//寄存器 IPC 中断
interrupt_register (INT_IPC_0、IPC_ISR0);
INTERRUPT_ENABLE (INT_IPC_0);
//启用全局中断
EINT;
ERTM;
while (1);
}
//
// CANB 中断服务例程(ISR)
//
_interrupt void canbISR (void)
{
uint32_t status = can_getInterruptCAse (CANB_BASE);
if (STATUS == RX_MSG_OBJ_ID)
{
//读取接收到的 CAN 数据
can_readMessage (CANB_BASE、RX_MSG_OBJ_ID、(uint16_t*) rxMsgData);
}
CAN_clearGlobalInterruptStatus (CANB_BASE、CAN_GLOBAL_INT_CANINT0);
interrupt_clearACKGroup (interrupt_ACK_group9);
}
//
// IPC 中断服务例程(处理 CPU1 -> CPU2命令)
//
__interrupt void IPC_ISR0 (void)
{
uint32_t 命令;
//从 CPU1读取 IPC 命令
IPC_readCommand (IPC_CPU2_L_CPU1_R、CPU1_TO_CPU2_FLAG、IPC_ADDR_CORRECTION_ENABLE、
COMMAND、NULL、NULL);
如果(命令== IPC_CMD_READ_CAN)
{
uint8_t i;
//通过 IPC 将存储的 CAN 数据发送到 CPU1
对于(I = 0;I < MSG_DATA_LENGTH;I++)
{
IPC_sendCommand (IPC_CPU2_L_CPU1_R、CPU2_TO_CPU1_FLAG、IPC_ADDR_CORRECTION_ENABLE、
IPC_CMD_RESP、rxMsgData[i]、i);
}
//等待 CPU1确认接收
IPC_waitForAck (IPC_CPU2_L_CPU1_R、CPU2_TO_CPU1_FLAG);
}
IPC_ackFlagRtoL (IPC_CPU2_L_CPU1_R、CPU1_TO_CPU2_FLAG);
interrupt_clearACKGroup (INTERRUPT_ACK_GROUP1);
}


