Thread 中讨论的其他器件: C2000WARE
工具与软件:
您好!
我目前使用的是 TMS320F28379D MCU 和 C2000Ware 库。
我正在尝试将一些数据发送到 CPU1到 CPU2、并且我遵循示例代码。
我修改了代码、像每一分钟队列都会更新数据一样、CPU2中的每一分钟 ISR 将触发一次、LED 将亮起。
但我遇到了一些问题。
可能是我出错了、或者缺少一些初始化。
1. ISR 仅先触发2-3次
2.无法从 Queue( IPC_readMessageFromQueue() 该 API 返回 flase )中读取数据
下面给出了相关代码、请帮助我解决此问题。
_______________ CPU1 code*****
/**
* main.c
*/
#include "device/driverlib.h"
#include "device/device.h"
#include "inc/hw_ipc.h"
//------------------
//为处理器间通信定义 IPC
//------------------
#define IPC_CMD_READ_MEM 0x1001
#define IPC_CMD_RESP 0x2001
#define TEST_PASS 0x5555
#define TEST_FAIL 0xAAAA
#pragma DATA_SECTION (ReadData、"MSGRAM_CPU1_TO_CPU2")
无符号 ReadData[10]={0};
//
// Main (主菜单)
//
void main (void)
{
INT I = 0;
IPC_MessageQueue_t MessageQueue;
IPC_Message_t TxMsg、RxMsg;
device_init();
#ifdef _standalone
#ifdef _flash
//
//发送引导命令以允许 CPU2应用程序开始执行
//
DEVICE_BOOTCPU2 (C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
#else
//
//发送引导命令以允许 CPU2应用程序开始执行
//
DEVICE_BOOTCPU2 (C1C2_BROM_BOOTMODE_BOOT_FROM_RAM);
#endif //_flash
#endif //_standalone
device_initGPIO();
GPIO_setPadConfig (DEVICE_GPIO_PIN_LED1、GPIO_PIN_TYPE_STD);
GPIO_setDirectionMode (DEVICE_GPIO_PIN_LED1、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (DEVICE_GPIO_PIN_LED2、GPIO_PIN_TYPE_STD);
GPIO_setDirectionMode (DEVICE_GPIO_PIN_LED2、GPIO_DIR_MODE_OUT);
GPIO_setMasterCore (DEVICE_GPIO_PIN_LED2、GPIO_CORE_CPU2);
Interrupt_initModule();
interrupt_initVectorTable();
//清除 IPC 中断
IPC_clearFlagLtoR (IPC_CPU1_L_CPU2_R、IPC_FLAG_ALL);
//初始化消息队列
IPC_initMessageQueue (IPC_CPU1_L_CPU2_R、&MessageQueue、IPC_INT1、IPC_INT1);
IPC_SYNC (IPC_CPU1_L_CPU2_R、IPC_FLAG31);
EINT;
ERTM;
DEVICE_DELAY_US (1000000);
for (i=0;i<10;i++)
{
ReadData[i]= i;
}
TxMsg.command = IPC_CMD_READ_MEM;
TxMsg.address =(uint32_t) ReadData;
TxMsg.dataw1 = 10;
TxMsg.dataw2 = 1;
IPC_sendMessageToQueue (IPC_CPU1_L_CPU2_R、&MessageQueue、IPC_ADDR_CORRECTION_ENABLE、&TxMsg、IPC_BLOCKING_CALL);
//
//永远循环
//
for (;;)
{
//
//打开 LED
//
GPIO_writePin (DEVICE_GPIO_PIN_LED1、0);
DEVICE_DELAY_US (1000000);
GPIO_writePin (DEVICE_GPIO_PIN_LED1、1);
for (i=0;i<10;i++)
{
ReadData[i]= i;
}
TxMsg.command = IPC_CMD_READ_MEM;
TxMsg.address =(uint32_t) ReadData;
TxMsg.dataw1 = 10;
TxMsg.dataw2 = 1;
IPC_sendMessageToQueue (IPC_CPU1_L_CPU2_R、&MessageQueue、IPC_ADDR_CORRECTION_ENABLE、&TxMsg、IPC_nonblocking_call);
DEVICE_DELAY_US (1000000);
}
}
*香港特别行政区政府在香港特别行政区政府的工作 第二阶段工作计划(续
//包含的文件
//
#include "driverlib.h"
#include "device.h"
#include "interrupt.h"
#include "inc/hw_ipc.h"
#define IPC_CMD_READ_MEM 0x1001
#define IPC_CMD_RESP 0x2001
#define TEST_PASS 0x5555
#define TEST_FAIL 0xAAAA
#define IPC_1 INT_IPC_1
IPC_MessageQueue_t messageQueue;
_bool ipcISR =0;
void Board_init ();
//
// Main (主菜单)
//
void main (void)
{
device_init();
Interrupt_initModule();
interrupt_initVectorTable();
board_init();
IPC_clearFlagLtoR (IPC_CPU2_L_CPU1_R、IPC_FLAG_ALL);
IPC_initMessageQueue (IPC_CPU2_L_CPU1_R、&messageQueue、IPC_INT1、IPC_INT1);
EINT;
ERTM;
// Interrupt_enable (IPC_INT1);
IPC_SYNC (IPC_CPU2_L_CPU1_R、IPC_FLAG31);
GPIO_writePin (DEVICE_GPIO_PIN_LED2、1);// LED 熄灭
while (1)
{
if (ipcISR == true)
{
ipcISR = false;
GPIO_writePin (DEVICE_GPIO_PIN_LED2、0);// LED 亮起
}
设计
GPIO_writePin (DEVICE_GPIO_PIN_LED2、1);// LED 熄灭
//延迟一位。
DEVICE_DELAY_US (250000);
}
}
/*
*简称 IPC 中断函数
*
*/
__interrupt void ipc_isr1()
{
IPC_Message_t RxMsg;
_Bool 状态= false;
Char i =0;
ipcISR = true;
//从 IPC 队列中读取
IPC_readMessageFromQueue (IPC_CPU2_L_CPU1_R、&messageQueue、IPC_ADDR_CORRECTION_ENABLE、
&RxMsg、IPC_nonblocking_call);
if (RxMsg.command == IPC_CMD_READ_MEM)
{
状态= true;
for (i=0;i<RxMsg.dataw1;i++)
{
if (*((uint32_t *) RxMsg.address + i)!= i)
状态= false;
}
}
//
//确认标志
//
IPC_ackFlagRtoL (IPC_CPU2_L_CPU1_R、IPC_FLAG1);
//
//确认 PIE 中断。
//
interrupt_clearACKGroup (INTERRUPT_ACK_GROUP1);
}
void IPC_SYSCFG_init ()
{
}
空 Board_init()
{
EALLOW;
IPC_SYSCFG_INIT ();
INTERRUPT_REGISTER (IPC_1、&IPC_ISR1);
INTERRUPT_ENABLE (IPC_1);
EDIS;
}
//
//结束文件
//