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.
工具/软件:Code Composer Studio
大家好、
我正在尝试使用 CPU02实现 sci 回波(通过修改双 CPU 闪烁示例)。 现在、这里是我要执行的步骤。
1) 1)处理从 CPU01到 CPU02的 SCI GPIO
GPIO_SetupPinMux (43、GPIO_MUX_CPU2、0xF);
GPIO_SetupPinOptions (43、GPIO_INPUT、GPIO_PushPull);
GPIO_SetupPinMux (42、GPIO_MUX_CPU2、0xF);
GPIO_SetupPinOptions (42、GPIO_output、GPIO_Async);
2) 2)将数据从 Cpu02发送到 sci 数据寄存器。
这是 cpu01代码-
//######################################################################################################################
//
//文件:Blinky_cpu01.c
//
//标题:F2837xD 的 LED 闪烁示例。
//
//! addtogroup dual_example_list
//!
//
//包含的文件
//
#include "F28x_Project.h"
#include "F2837xD_IPC_DRIVERS.h"
//
//主函
//
void main (void)
{
uint16 i=0;
//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2837xD_SYSCTRL.c 文件中。
//
InitSysCtrl();
#ifdef _standalone
#ifdef _flash
//
//发送引导命令以允许 CPU2应用程序开始执行
//
IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH);
其他
//
//发送引导命令以允许 CPU2应用程序开始执行
//
IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _RAM);
#endif
#endif
//
//调用闪存初始化以设置闪存等待状态
//此函数必须驻留在 RAM 中
//
#ifdef _flash
InitFlash();
#endif
//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
InitGpio();//针对此示例跳过
EALLOW;
GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;
GPIO_SetupPinMux (43、GPIO_MUX_CPU2、0xF);
GPIO_SetupPinOptions (43、GPIO_INPUT、GPIO_PushPull);
GPIO_SetupPinMux (42、GPIO_MUX_CPU2、0xF);
GPIO_SetupPinOptions (42、GPIO_output、GPIO_Async);
for (i=0;i<8;i++)
{
GPIO_SetupPinMux (I、GPIO_MUX_CPU2、0);
GPIO_SetupPinOptions (I、GPIO_INPUT、GPIO_PULLUP);
}
//
// TODO 添加代码以允许使用 IPC 从 CPU02配置 GPADIR
//
EDIS;
GpioDataRegs.GPADD.bit.GPIO31 = 1;//关闭 LED
//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;
//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2837xD_PIECTRL.c 文件中。
//
InitPieCtrl();
//
//禁用 CPU 中断并清除所有 CPU 中断标志:
//
IER = 0x0000;
IFR = 0x0000;
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xD_PieVect.c 中找到
//
InitPieVectTable();
//
//启用全局中断和更高优先级的实时调试事件:
//
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
//
//步骤6. 空闲循环。 只需坐下来循环(可选):
//
for (;;)
{
//
//打开 LED
//
GpioDataRegs.GPADAT.bit.GPIO31 = 0;
//
//延迟一位。
//
DELAY_US (1000 * 500);
//
//关闭 LED
//
GpioDataRegs.GPADAT.bit.GPIO31 = 1;
//
//延迟一位。
//
DELAY_US (1000 * 500);
}
}
//
//文件结束
//
CPU02代码
//
//包含的文件
//
#include "F28x_Project.h"
#include "F2837xD_IPC_DRIVERS.h"
uint16环计数;
//
//函数原型
//
void scia_echoback_init (void);
void scia_fifo_init (void);
void scia_xmit (int a);
void scia_msg (char * msg);
void scia_xmit32 (uint32 b);
//
//主函
//
#ifdef _flash
//
//这些由链接器定义(请参阅器件链接器命令文件)
//
extern UINT16 RamfuncsLoadStart;
extern UINT16 RamfuncsLoadSize;
extern UINT16 RamfuncsRunStart;
#endif
//
//主函
//
void main (void)
{
char *msg;
//
//将时间关键代码和闪存设置代码复制到 RAM
//这包括 InitFlash()、闪存 API 函数和任何函数
//分配给 ramfuncs 段。
// RamfuncsLoadStart、RamfuncsLoadEnd 和 RamfuncsRunStart
//符号由链接器创建。 请参阅器件.cmd 文件。
//
#ifdef _flash
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
#endif
//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2837xD_SYSCTRL.c 文件中。
//
InitSysCtrl();
//
//调用闪存初始化以设置闪存等待状态
//此函数必须驻留在 RAM 中
//
#ifdef _flash
InitFlash();
#endif
//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
// InitGpio();//针对此示例跳过
EALLOW;
//
//TODO 添加代码以通过 IPC 配置 GPADIR
//
//GPIO_WritePin (34、1);
//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;
//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2837xD_PIECTRL.c 文件中。
//
InitPieCtrl();
//
//禁用 CPU 中断并清除所有 CPU 中断标志:
//
IER = 0x0000;
IFR = 0x0000;
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xD_PieVect.c 中找到
//
InitPieVectTable();
//
//启用全局中断和更高优先级的实时调试事件:
//
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
//
//步骤6. 空闲循环。 只需坐下来循环(可选):
//
scia_fifo_init();//初始化 SCI FIFO
scia_echoback_init ();//初始化用于 echoback 的 SCI
MSG ="\r\n\n\nHello World!\0";
scia_msg (msg);
MSG ="\r\n 您将输入一个字符,DSP 将回显它! \n\n";
scia_msg (msg);
for (;;)
{
MSG ="\r\n 输入字符:\0";
scia_msg (msg);
//
//等待 inc 字符
//
/* while (SciaRegs.SCIFFRX.bit.RXFFST ==0){}//等待空状态
//
//获取字符
//
ReceivedChar = SciaRegs.SCIRXBUF.ALL;
//
//回显字符
//
MSG ="您已发送:\0";
scia_msg (msg);
scia_xmit (ReceivedChar);
LoopCount++;*/
scia_xmit32 (GpioDataRegs.GPADAT.all);
DELAY_US (1000*500);
}
}
void scia_echoback_init ()
{
//
//注意:SCIA 外设的时钟被打开
//在 InitSysCtrl()函数中
//
SciaRegs.SCICCR.all = 0x0007;// 1停止位,无回路
//无奇偶校验,8个字符位,
//异步模式,空闲线协议
SciaRegs.SCICTL1.all = 0x0003;//启用 TX、RX、内部 SCICLK、
//禁用 RX ERR、睡眠、TXWAKE
SciaRegs.SCICTL2.all = 0x0003;
SciaRegs.SCICTL2.bit.TXINTENA=1;
SciaRegs.SCICTL2.bit.RXBKINTENA=1;
//
// SCIA 为9600波特
//@LSPCLK = 50MHz (200MHz SYSCLK) HBAUD = 0x02且 LBAUD = 0x8B。
//@LSPCLK = 30MHz (120MHz SYSCLK) HBAUD = 0x01且 LBAUD = 0x86。
//
SciaRegs.SCIHBAUD.ALL = 0x0002;
SciaRegs.SCILBAUD.ALL = 0x008B;
SciaRegs.SCICTL1.all = 0x0023;//从复位中撤回 SCI
}
//
// scia_xmit -从 SCI 发送一个字符
//
void scia_xmit (int a)
{
while (SciaRegs.SCIFFTX.bit.TXFFST!= 0){}
SciaRegs.SCITXBUF.ALL =A;
}
//函数用于传输32位整数、因为 SCITXBUF 的最低有效
//8位缓冲器
void scia_xmit32 (uint32 b)
{
int msg8位、j;
for (j=0;j<8;j++)
{
msg8bit=((b)>j)&1)+48;
while (SciaRegs.SCIFFTX.bit.TXFFST!= 0){}
SciaRegs.SCITXBUF.all =msg8bit;
}
}
//
// scia_msg -通过 SCIA 发送消息
//
void scia_msg (char * msg)
{
int i;
I = 0;
while (msg[i]!='\0')
{
scia_xmit (msg[i]);
i++;
}
}
//
// scia_fifo_init -初始化 SCI FIFO
//
void scia_fifo_init()
{
SciaRegs.SCIFFTX.ALL = 0xE040;
SciaRegs.SCIFFRX.ALL = 0x2044;
SciaRegs.SCIFFCT.all = 0x0;
}
//
//文件结束
//
下面是项目文件夹和添加的文件的快照-
看起来 CPU02没有访问 SCI 寄存器。
请帮助。
提前感谢。
您好!
当您说 CPU2没有访问 SCI 寄存器时,是否正在 CPU2侧启用 SCI 外设?
CPU2是否在 CPU1完成配置之前运行?
您能否查看 C2000Ware\device_support\f2837xd\examples\dual\IPC_GPIO_toggle 示例以检查 IPC 是否看起来正常?
此致。
大家好、Meghana、
感谢您的回答。 首先、我修改了此代码的 IPC_GPIO_TOGGLE 示例。 我使用 core1来初始化引脚多路复用
//核心1代码的一部分
InitGpio();//针对此示例跳过
EALLOW;
GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;
GPIO_SetupPinMux (43、GPIO_MUX_CPU2、0xF);
GPIO_SetupPinOptions (43、GPIO_INPUT、GPIO_PushPull);
GPIO_SetupPinMux (42、GPIO_MUX_CPU2、0xF);
GPIO_SetupPinOptions (42、GPIO_output、GPIO_Async);
for (i=0;i<8;i++)
{
GPIO_SetupPinMux (I、GPIO_MUX_CPU2、0);
GPIO_SetupPinOptions (I、GPIO_INPUT、GPIO_PULLUP);
}
然后、我放置来自(IPC_GPIO_TOGGLE)的 IPC 代码
#ifdef _standalone
#ifdef _flash
//
//发送引导命令以允许 CPU2应用程序开始执行
//
IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH);
其他
//
//发送引导命令以允许 CPU2应用程序开始执行
//
IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _RAM);
#endif
#endif
//
//调用闪存初始化以设置闪存等待状态
//此函数必须驻留在 RAM 中
//
#ifdef _flash
InitFlash();
#endif
我还在内核2上启动 scia_init()。
除此之外、我不明白您说通过 CPU2启用 SCI 是什么意思。
请听我说。
谢谢你。
您好 Arindam,
当然。 我的意思是,您还在 CPU2侧调用 Device init ()吗?
我还希望看到一条类似下面针对 SPI 所做的声明、以便在 CPU1完成其配置后控制 CPU2。
SYSCTL_selectCPUForPeripheral (SYSCTL_CPUSEL6_SPI、1、SYSCTL_CPUSEL_CPU2);
参考: C2000Ware\driverlib\f2837xd\examples\dual\dma
只有在这个传输控制之后、我们才能在 CPU2侧完成 sci 初始化。
此致。