TMS320F28388D使用sysconfig配置IPC
第1章 配置IPC底层代码
使用IPC的动机:
我计划我的项目中要使用RS485,CANFD通信和EtherCAT通信,由于通信种类较多,而对于电机控制来说大部分数据都是重复的,并且有些数据可以很久才改变一次,所以我计划使用CPU2做FOC算法控制电机,使用CPU1与上位机进行通信,使用IPC做电机参数之间的通信。
实现目的:
CPU1与CPU2之间可以相互发送数据,数据支持浮点数。通信速度尽可能快和稳定。
下面的代码只有几百行,但是网上资料较少,问了TI工程师也没有答复,整了两三天才整出来,制作不易,希望点赞收藏加个关注,后期会不定时更新单片机的学习笔记。
1.1 CPU1的sysconfig配置
我的CPU1主要是用来做通信的,其实做通信最好是使用CM核,因为他是cortex-M内核,对信息的接收比较好,但是由于网上对这个核的资料很少,并且不能使用sysconfig进行配置,开发速度比较慢,综合起来就使用了CPU1做通信,CPU2做其他外设的控制代码,去跑算法。我的想法是使用CPU1能够主动发送和读取CPU2的数据,CPU2是跑算法和其他外设控制的,所以CPU1的IPC不需要被CPU2的中断,CPU2的数据应能够被CPU1中断。但是看很多解释以及芯片手册,貌似必须要有IPC中断才能接收数据,这点现在依然有疑问。知道的伙伴还望解答。
CPU1的sysconfig配置为:
第一行配置为选择CPU2的boot Mode即启动模式,Sysconfig对其的解释为在FLASH启动,配置完成后仍然需要在CPU1主函数中调用
Device_bootCPU2(BOOT_MODE_CPU2);函数来使能CPU2.
第二行配置为选择IPC的FLAG,CPU的IPC一共有32个标志,这里使用了IPC_FLAG0用作通信触发CPU2的中断,使用IPC_FLAG31来作为标志来同步两个CPU时钟。
第三行配置为选择能使CPU1的IPC_FLAG0,必须要勾选下面的对号,用来触发CPU2的接收中断。
第四行配置为使能IPC_FLAG31来作为标志来同步两个CPU时钟。可以选测0~31任一。
第五行配置为CPU1接收CPU2的IPC触发中断,IPC的中断有IPC0-3四个,这里选择了IPC1,也可使用IPC0,IPC1,IPC2,IPC3。
第六行配置为使能PIE里对应的中断。
1.2 CPU2的sysconfig配置
CPU2的sysconfig配置为
第一行配置为使用了IPC_FLAG1,IPC_FLAG31。
第二行配置为使能IPC_FLAG1,用于配置触发CPU1接收IPC中断的FLAG。
第三行配置为使能IPC_FLAG31,用于同步CPU核的时钟,可用其他FLAG,但要与CPU1的对应。
第四行配置为打开CPU2的IPC0中断,用于触发接收CPU1通过IPC_FLAG0发送的数据的中断
第五行为开启IPC0中断函数
第2章 IPC的应用层代码
2.1 CPU1的主函数IPC代码
第一步:根据1.1的介绍,需要先执行开启CPU2的代码,即:
Device_bootCPU2(BOOT_MODE_CPU2);
第二步:清除IPC标志位,通过IPC_FLAG31同步两个CPU时钟,代码如下
IPC_clearFlagLtoR(IPC_CPU1_L_CPU2_R, IPC_FLAG_ALL);//清除IPC的所有标志位 IPC_sync(IPC_CPU1_L_CPU2_R, IPC_FLAG31);//通过IPC_FLAG31同步两个CPU时钟
第一行解释为:清除CPU1与CPU2通信的IPC的所有FLAG。
第二行解释为:同步CPU时钟代码。
第三步:设置要发送的信息,代码为下:
#pragma DATA_SECTION(readData,"MSGRAM_CPU1_TO_CPU2") float readData[10]; int i,j; for(i=0; i CPU1TOCPU2RAM, type=NOINIT MSGRAM_CPU2_TO_CPU1 : > CPU2TOCPU1RAM, type=NOINIT }
第二行解释位:定义数据类型,定义为了一个数组。
第三,四,五行解释为:对数据进行初始化。
第四步:发送数据
while(1) { DEVICE_DELAY_US(5000000); IPC_sendCommand(IPC_CPU1_L_CPU2_R, IPC_FLAG0, IPC_ADDR_CORRECTION_ENABLE, IPC_CMD_READ_MEM, (uint32_t)readData, 10); for(i=0; i