打印
[G32A]

G32R501-双核MCU调试经验分享2-双核数据交互方式

[复制链接]
36|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyz0926|  楼主 | 2025-2-24 16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zyz0926 于 2025-2-24 17:01 编辑

#申请原创# 双核数据交互方式包括两种:
1.通过IPC外设的固定寄存器来实现基础数据交互
2.通过固定内存地址存放,来实现基础数据交互

方案1的实现形式,各官方手册SDK有完整的例程可以参考,这里不做介绍,其弊端主要为寄存器数量较少,无法实现大型工程下的数据交互问题。

通过固定内存地址的存放,具体实现方法如下(以双核伺服方案的编码器数据交互为案例说明):

步骤为:
1.在CPU1的工程内定义一块独立的RAM内存区域,具体在SCT文件里定义
SCT文件的打开路径为:keil5界面下的options for target->Linker->Edit

在SCT文件内,如图定义RW6的内存区域,
#define __RW6_BASE         0x20000000
#define __RW6_SIZE         0x00000100

在该区域内,不要添加.ANY (+RW +ZI),只定义一个内存块dtcm.instruction  RW_DTCM1 __RW6_BASE __RW6_SIZE  {                     ; DTCM data 双核数据交互
   .ANY (dtcm.instruction)
  }


2.定义一个结构体,起始地址从RW6的起始地址开始
// 声明固定地址
__attribute__((section("dtcm.instruction")))
volatile struct IPCDATA_REGS* const ipcdataregs = (struct IPCDATA_REGS*)0x20000000;

3.定义结构体内部的数据说明
// 定义结构体,并使用 __attribute__ 指定地址

struct IPCDATA_REGS{
                int32  encoder_pos_abs;
                int32 posifdbenc_abs;
                int32 posifdbenc;
                int32 EncBrkLineCnt;
                int32 encerrcnt;        
} ;               

#define IPCDATA_REGS_DEFAULTS { 0, 0, 0,0 , 0\
                      }
extern         volatile struct IPCDATA_REGS* const ipcdataregs;

4.在CPU1的PWM中断内完成编码器的数据通讯后,就可以把数据传给该结构体变量

5.在CPU0的PWM中断内读取该地址数据,就可以实现把编码器数据传给CPU0核
p->encoder pos abs=(*(uint32 t *)0xA1100000);
posifdbenc abs=(*(uint32 t*)0xA1100004); //absolute posi
posifdbenc=(*(uint32 t*)0xA1100008);//incremental  posi

这里说明一下,该芯片的特殊机制导致,CPU1的0x20000000,CPU0要从0xA1100000去读取,实际是一一对应的。

6.实际仿真数据
这样,我们仿真整个工程时,通过CPU0的工程,就可以在MEMORY的界面下,观测到实际的编码器角度数据,此时电机的编码器数据为0x458905,编码器的位数为23位,对应就可以计算出角度。

注意:双核芯片的RAM不可共享,数据不可直接调用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

11

帖子

0

粉丝