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.

[参考译文] LAUNCHXL-F28P55X:有关读取 LAUNCHXL-F28P55X 上 GPIO 引脚状态的简单问题(输入和放大器;输出)

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1544497/launchxl-f28p55x-simple-question-about-reading-gpio-pin-status-on-launchxl-f28p55x-input-output

器件型号:LAUNCHXL-F28P55X
主题:C2000WARE 中讨论的其他器件

工具/软件:

大家好:

我正在 LAUNCHXL F28P55X 电路板上测试 GPIO 输入功能。 我使用了两个功能:GPIO_readPin (uint32_t pin) 和 GPIO_readPinDataRegister (uint32_t pin)。

我的英语不是很好,所以我不完全理解与 gpio.h 文件中的评论的区别。 此外、我的测试结果也不符合我的预期。

我已经将 GPIO48 设置为输入。 我还启用了上拉电阻(我使用万用表检查了它是否具有 3.3V 电压)。

我的第一个问题:
当我要读取 GPIO 引脚的当前输入状态(例如 GPIO48,它被设置为输入)时、我应该使用哪个功能? GPIO_readPin (uint32_t pin) 或 GPIO_readPinDataRegister (uint32_t pin)? 我想知道该引脚是由于外部信号而处于高电平还是低电平。

我的第二个问题:
如果 GPIO 引脚配置为输出、并想确认其当前输出状态(例如,它当前正在输出高电平还是低电平)、应该使用哪个功能来实现该目的?

感谢您的帮助! e2e.ti.com/.../gpio.h

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

    您好:

    “GPIO_ReadPin"返回“返回引脚的实际状态、而不是 输出锁存的状态。 此外、“GPIO_WritePin (UINT16 gpioNumber、UINT16 outVal)“设置指定引脚的 GPyDAT 寄存器位。

    总体而言、 首先确保将引脚配置为数字 GPIO 和输入模式、并启用上拉/下拉以在悬空(视情况而定)时定义状态。 您可以直接通过 GPADAT 进行读取和写入。

    写入 GPIO 状态:

    GpioDataRegs.GPASSET.bit.GPIOX = 1;
    GpioDataRegs.GPACLEar.bit.GPIOX = 1;


    读取 GPIO 状态:
    Uint16_t inputLevel = GpioDataRegs.GPADAT.bit.GPIOX;

    此致、

    Masoud

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

    感谢您的帮助。

    我有问题。 我的实验室工程在 LAUNCHXL F28P55X 电路板上出现构建错误。

    该工程在以下位置:\ti\c2000\C2000Ware_5_05_00_00\training\device\f28p55x\system_design\lab_systemdesign

    图片显示错误显示:
    “../lab_main.c",“,第、第 162 行:错误#20:标识符“GpioDataRegs"未“未定义

    这意味着编译器无法找到 GpioDataRegs。

    您能帮我定义一下吗?

    非常感谢!

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

    您好:

    这是因为您需要在示例中包含器件头文件 (f28p55x_device.h)。 此外、您还需要在编译器包含选项中包含“${C2000WARE_ROOT}/device_support/f28p55x/headers/include“。 在此示例中、正在使用库文件、因此您只需使用  “GPIO_writePin (20、1);“和“STATUS = GPIO_readPin (20);“进行写入/读取。

    此致、

    Masoud

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

    uint16_t LED_INx = 0;  

    抱歉

    显示“编译失败“。

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

     在此示例中、我建议仅使用“GPIO_writePin (20、1);“和“STATUS = GPIO_readPin (20);“进行写入/读取、而没有其他更改。

    此致、

    Masoud

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

    尊敬的 Masoud:

    感谢你的帮助。
    我知道 GPIO_writePin (20、1);并且 STATUS = GPIO_readPin (20);将会适用。

    但我想使用 GpioDataRegs.GPASSET.bit.GPIO20 = 1;
    当我使用 GpioDataRegs.GPASSET.bit.GPIO20 = 1 时、汇编代码非常小。 意味着速度更快。 如果我使用 GPIO_writePin (20、1);、汇编代码会很大。
    我的项目仍有错误。 GpioDataRegs 未定义。
    我在 include 选项中放入了 device_support/f28p55x/headers/include。
    此外、我添加了#include “f28p55x_device.h"</s>“
    您能帮我修复未定义的 GpioDataRegs 吗?

    感谢你的帮助。

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

    您好 Ming、

    您之前提到的“\ti\c2000\C2000Ware_5_05_00_00\training\devices\f28p55x\system_design\lab_systemdesign"工程“工程在您尝试添加位字段支持时使用了驱动程序库、这会导致此处出现编译器问题。

    实际上、F28P55x 器件支持两种类型的开发软件:驱动程序库 API 和位域结构。  每款产品都有各自的优势、并在同一 用户应用程序中实现在一起兼容。

    组合位域和 driverlib 支持时、请在 名为“_dual_headers"的“的工程属性中添加一个预定义符号。 这是为了避免出现冲突定义(在枚举 /结构体/宏中)、这些定义在位字段和 driverlib 头文件中共用完全相同的名称。

    当您尝试在基于驱动程序库的工程之上添加位字段支持时:

    1.将以下 include 目录路径添加到项目中:

    device_support\f28p55x\headers\include

    2.在工程主源文件中包含以下头文件:

    device_support\f28p55x\headers\include\f28p55x_device.h


    3.将 f28p55x_globalvariabledefs.c 文件添加或链接到工程。 文件位置:

    device_support\f28p55x\headers\source


    4.将 f28p55x_Headers_nonBIOS.cmd 文件添加或链接到工程。 文件位置:

    device_support\f28p55x\headers\cmd

    如果这样可以解决问题、请告诉我。

    此致、

    Masoud

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

    您好 、Masoud、

    我将 f28p55x_Headers_nonbios.cmd 和 f28p55x_globalvariabledefs.c 文件复制到工程中。

    谢谢、问题已解决。

    该解决方案是否也适用于 F280039C?

    感谢你的帮助。

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

    很高兴知道问题已经解决。 是的、同样的方法适用于 F28003x。

    此致、

    Masoud

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

    您好 Ming、

    1.哪种类型的 GPIO 访问在汇编执行中速度更快?

    最快的写入路径:使用编译时常数掩码写入设置/清零/切换寄存器(即 GpioDataRegs.GPASSET.ALL =(1UL<20);)。
    使用 MOVW DP +或@……进行拆卸、#IMM 是最精益的。 采用 MyGPIOlib.h 样式、但通常需要额外的周期数 (MOVL XAR4 + VMOV32)、并且速度较慢。

    宏路径(例如 GPA20_OUT_HI):

    MOVL XAR4,#0x00100000 ; load 32-bit mask into XAR4
    VMOV32 *(0:0x7f02),@XAR4 ; 32b write to GPASET

    这至少是 2 条指令、其中第一条指令是 32 位字面加载(比或#IMM 成本更高)、第二条指令是 32 位外设写入。 在实践中、这比直接 OR 模式要慢。

    2.我的自定义 MyGPIOlib.h 声明(基于 GPIO_writePin)是否正确且可安全使用?

    是的、大致上来说。 它会写入正确的只写寄存器并使用易失性。 修复掩码宏名称括号。 对于峰值速度、最好选择上面所示的直接结构/位掩码样式(或其周围的静态内联包装器)。

    此外、请将新问题发布为单独的 E2E 主题、以便所有人稍后都可以使用。

    谢谢。此致、

    Masoud  

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

    对于 32 位 C2000 GPIO(例如 F280039C 和 F28P55x):
    数据页指针寄存器 (DP) 的一页是否等于 64 个字?
    因为 MOVW DP、#0x1fc 和 0x1fc * 0x40 = 0x7F00 = GPIODATA_BASE。

    我想确保 GPIO 访问的汇编地址计算。
    请确认我的理解是否正确。

    谢谢!

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

    是、在 C28x 上、数据页 (DP) 指针选择一个 64 字的页、指令的 6 位直接偏移量选择该页内的一个字。 正式:

    -有效数据地址(字寻址)=(DP << 6 )|(6 位偏移)。

    -因此、MOVW DP #0x1FC 指向字地址 0x1FC * 0x40 = 0x7F00 处的 DP。 任何使用偏移 0x00…0x3F 的直接访问都会到达 0x7F00…0x7F3F。

    因此、如果器件的 TRM 在 0x7F00(字地址)处列出 GPIODATA_BASE、则计算将行向上:DP = 0x1FC 以该 GPIO 数据寄存器块为目标。

    为了在 F28003x/F28P55x 之间实现可移植性、最好仍然从器件 TRM 或 driverlib 头文件中提取基地址、让汇编器/编译器构成寻址;但上述 DP 数学运算是底层机制。

    此致、

    Masoud