主题:C2000WARE 中讨论的其他器件
工具/软件:
尊敬的 TI 专家:
我正在使用 TMS320F28P650D 双核器件并查看 CPU2 中的 GPIO。
我无法读取 CPU2 中的 GPIOdata 寄存器、但能够从 CPU2 切换 GPIO
我已将其配置为 CPU2、但仍无法读取、
同样、我遇到的 SCI 问题是从 CPU2 发送数据、但无法接收数据、但寄存器中存在数据。
是否有任何事情可以授予 CPU2 以进行读取
非常感谢任何指导、文档链接或示例项目。
提前感谢!
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.
工具/软件:
尊敬的 TI 专家:
我正在使用 TMS320F28P650D 双核器件并查看 CPU2 中的 GPIO。
我无法读取 CPU2 中的 GPIOdata 寄存器、但能够从 CPU2 切换 GPIO
我已将其配置为 CPU2、但仍无法读取、
同样、我遇到的 SCI 问题是从 CPU2 发送数据、但无法接收数据、但寄存器中存在数据。
是否有任何事情可以授予 CPU2 以进行读取
非常感谢任何指导、文档链接或示例项目。
提前感谢!
您好:
您需要 使用 GPIO_setControllerCore () 函数将 GPIO 控制从 CPU1 传输到 CPU2。
GPIO_setControllerCore(x, GPIO_CORE_CPU2); // Transfer control of GPIOx to CPU2
为了在内核之间共享 GPIO 配置、另一个选项是使用 IPC(处理器间通信)。
C2000Ware 有一个名为“C:\ti\c2000\“的示例 \driverlib\f2837xd\examples\dual\ipcipc_ex1_gpio_toggle“、说明了这一点。
此致、
Masoud
#define M2_HALL_A 30
void M2_HALL_A_init();
#define M2_HALL_B 61
void M2_HALL_B_init();
#define M2_HALL_C 64
void M2_HALL_C_init();
void M2_HALL_A_init(){
GPIO_setPadConfig(M2_HALL_A, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(M2_HALL_A, GPIO_QUAL_SYNC);
GPIO_setDirectionMode(M2_HALL_A, GPIO_DIR_MODE_IN);
GPIO_setControllerCore(M2_HALL_A, GPIO_CORE_CPU2);
}
void M2_HALL_B_init(){
GPIO_setPadConfig(M2_HALL_B, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(M2_HALL_B, GPIO_QUAL_SYNC);
GPIO_setDirectionMode(M2_HALL_B, GPIO_DIR_MODE_IN);
GPIO_setControllerCore(M2_HALL_B, GPIO_CORE_CPU2);
}
void M2_HALL_C_init(){
GPIO_setPadConfig(M2_HALL_C, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(M2_HALL_C, GPIO_QUAL_SYNC);
GPIO_setDirectionMode(M2_HALL_C, GPIO_DIR_MODE_IN);
GPIO_setControllerCore(M2_HALL_C, GPIO_CORE_CPU2);
}
这位于 CPU1 中
#define M2_HALL_A 30
#define M2_HALL_B 61
#define M2_HALL_C 64
#define GPIOA_DATA_REG_ADDR 0x00007F00U
hall_A1=GPIO_readPin(M2_HALL_A);
hall_B1=GPIO_readPin(M2_HALL_B);
hall_C1=GPIO_readPin(M2_HALL_C);
volatile uint32_t *gpadat = (volatile uint32_t *)GPIOA_DATA_REG_ADDR;
hall_A1=*gpadat;
hall_A1 = ((*gpadat) >> 30) & 0x1;
引脚 CPU2 中
尊敬的 Ranjith:
CPU2 读取的两个要点:
请勿取消 CPU1 的本地 GPADAT 地址与 CPU2 的引用。 您使用的地址 (0x00007F00) 是 CPU1 的本地视图。 那么这不会在应用程序中提供有效的读取。 改用 driverlib API:
volatile uint32_t hall_A1, hall_B1, hall_C1; hall_A1 = GPIO_readPin(M2_HALL_A); hall_B1 = GPIO_readPin(M2_HALL_B); hall_C1 = GPIO_readPin(M2_HALL_C);
2.确保 CPU2 实际拥有引脚。 在 CPU1 上配置、然后移交所有权:
// CPU1 side GPIO_setPadConfig(M2_HALL_A, GPIO_PIN_TYPE_STD); GPIO_setQualificationMode(M2_HALL_A, GPIO_QUAL_SYNC); GPIO_setDirectionMode(M2_HALL_A, GPIO_DIR_MODE_IN); GPIO_setControllerCore(M2_HALL_A, GPIO_CORE_CPU2); // repeat for B/C
“我可以看到 GPADAT 正在变化、但无法将其复制到变量中“
该症状通常来自 (a) 读取错误的地址映射(请参阅#1)或 (b) 编译器优化了读取。 使用 gpio_readPin() 并存储到易失性变量中;避免直接指针读取到 GPADAT。
如果您尝试了 GPIO_readPin ()+ volatile 方法但仍然无法将值捕获到 CPU2 上的变量中、请共享一个最小的 CPU1/CPU2 对(只能是 GPIO init/wand-off 和 CPU2 读取循环)。 我可以在 LaunchPad 上运行该精确的对、并指向阻止读取的行。
此致、
Masoud
您好:
这归结为全局变量的所在位置(RAM 块所有权/链接器放置)以及波动性/优化。 本地访问 CPU 的栈(该 CPU 拥有的 LSx 块)、因此它们“起作用“。 您的全局变量可能链接到 CPU2 不具有的 GSx RAM、或链接到您从未启用 CPU2 写入的区域 — 因此写入读回为 0。 您可以将 CPU2 全局变量放入 CPU2 拥有的 RAM 中。
假设在 CPU2 链接器 cmd 文件中:
.text : > RAMGS4 .bss : > RAMGS4 .data : > RAMGS4 .const : > RAMGS4 .sysmem: > RAMGS4
在释放 CPU2 之前将 RAMGS4 设为 CPU2(在系统初始化期间在 CPU1 上运行):
EALLOW; MemCfgRegs.GSxMSEL.bit.MSEL_GS4 = 1; EDIS;
初始化您使用的 GS4 RAM
EALLOW;
MemCfgRegs.GSxINIT.bit.INIT_GS4 = 1;
while(MemCfgRegs.GSxINITDONE.bit.INITDONE_GS4 == 0) { }
EDIS;
请注意、如果一个变量是在 ISR 或其他执行上下文 (CLA/其他 CPU/DMA) 中写入并在 main 中读取、则将其声明为 volatile、因此编译器不会对其进行缓存。
此致、
Masoud