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.

[参考译文] TMS320F28P650DK:读取 CPU2 中的 GPIO

Guru**** 2526700 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1546963/tms320f28p650dk-reading-gpio-in-cpu2

器件型号:TMS320F28P650DK
主题:C2000WARE 中讨论的其他器件

工具/软件:

尊敬的 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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经用你提到的相同的过程完成了,但问题仍然存在

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您通过 CPU1 初始化 GPIO、然后将控制权转移到 CPU2、则通常应该可以访问数据寄存器。 您可以共享基本代码、然后就可以在那里进行调试。

    此致、

    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 中

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    我已经对 P65 LaunchPad 进行了采样以运行和调试问题。 我很快就会让你发帖。

    感谢您的耐心!

    Masoud

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复!
    我已经尝试过上述方法、但仍然无法解决。

    是否需要配置 MemCfg_setGSRAMControllerSel (MEMCFG_sect_GS4、MEMCFG_SRAMCONTROLLER_CPU2);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能否确认如何读取数据? 在我的测试中、我向观察窗口添加了“HALL_A1",“,"HALL_B1"、"HALL_B1"和“和"HALL_C1"“"HALL_C1",“,并“并跳、跳过将 GPIO 0、1 和 2(选择任何 GPIO)连接到 GND、然后连接到 3.3V、并在观察窗口上观察到读数。

    此致、

    Masoud

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复!  
    我已经向它们提供了霍尔传感器输入、并像您那样在监视窗口中看到了这些输入

    此致、

    Ranjith。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很高兴听到该问题已解决!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    否问题未解决

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在共享代码中、我将测试 GPIO 定义为:

    #define M2_HALL_A 0
    #define M2_HALL_B 1
    #define M2_HALL_C 2

    如果将这些引脚连接到 0V 或 3.3V、则可以在观察窗口中读取它们的逻辑。 以下是位置:

    这已经过测试和确认。

    此致、

    Masoud

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复!  

    我可以在 gpodat 寄存器中看到 GPIO 的状态变化  
    但我无法从该寄存器进行复制并存储在另一个变量中
    此致、

    Ranjith。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 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);

    还将目标变量标记为 volatile、以使编译器不会优化以消除加载。 我在 F28P65 LaunchPad 上测试了此结果、同时将 GPIO 连接到 0V/3.3V、并观察了观察窗口中的值变化。

    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

    这样、CPU2 就可以通过 GPIO_readPin () 进行读取、如上所述。 这与我之前分享并在硬件上验证的流程相同。

    “我可以看到 GPADAT 正在变化、但无法将其复制到变量中“

    该症状通常来自 (a) 读取错误的地址映射(请参阅#1)或 (b) 编译器优化了读取。 使用 gpio_readPin() 并存储到易失性变量中;避免直接指针读取到 GPADAT。

    如果您尝试了 GPIO_readPin ()+ volatile 方法但仍然无法将值捕获到 CPU2 上的变量中、请共享一个最小的 CPU1/CPU2 对(只能是 GPIO init/wand-off 和 CPU2 读取循环)。 我可以在 LaunchPad 上运行该精确的对、并指向阻止读取的行。

    此致、
    Masoud

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复!  

    我发现了阅读方面的问题  
    如果我在局部变量中声明变量、则可以看到 变量中的数据
    但是、如果我在全局变量中声明、其中只有 0。


    此致、

    Ranjith。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    这归结为全局变量的所在位置(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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复!  

    通过添加此 MemCfg_setGSRAMControllerSel (MEMCFG_sect_GS4、MEMCFG_SRAMCONTROLLER_CPU2);
    我的代码中解决了该问题

    此致、

    Ranjith。