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.
工具/软件:Code Composer Studio
你好
我想控制 AM65x EVM IDK 上的 GPIO 输出。 我调查 RTOS 模板应用程序以了解 GPIO API。
我对 GPIO API 有一些伺服问题。
GPIO_socGetInitCfg()和 GPIO_socSetInitCfg()的用法是什么? 如果我们在调用 GPIO_write()等函数之前不调用它、会发生什么情况?
//在 main.c 中 void Board_initGPIO (void) { GPIO_V0_HwAttrs GPIO_cfg; /*获取默认的 SPI 初始化配置*/ GPIO_socGetInitCfg (GPIO_LED0_PORT_NUM、&GPIO_cfg); /*如有必要,修改默认 GPIO 配置*/ GPIO_configIntRouter (GPIO_LED0_PORT_NUM、GPIO_LED0_PIN_NUM、0、&GPIO_cfg); /*设置默认的 GPIO 初始化配置*/ GPIO_socSetInitCfg (GPIO_LED0_PORT_NUM、&GPIO_cfg); }
2、大多数 GPIO API 的参数只包含索引信息、不包含域信息。 这些功能如何帮助我们设置特定的 GPIO 引脚。
此外、在 app.c 中、它将 枚举器- USER_LED0传递给 GPIO_TOGGLE ()。 为什么它不传递目标 LED 的 GPIO 索引?
//在 GPIO_board.h 中、typedef 枚举 GPIO_LED{ USER_LED0 = 0、 USER_LED1 }GPIO_LED; //在 app.h 中#define TEST_LED_GPIO_INDEX USER_LED0 //在 app.c 中 void GPIO_TOGGLE_LED_TASK (UARG arg0、UARG arg1) { appPrint ("\n GPIO_toggle_led 任务已启动"); while (1){ /*切换连接到 LED 的测试 GPIO */ GPIO_TOGGLE (TEST_LED_GPIO_INDEX); /*设置脉冲周期的延迟*/ Task_sleep (LED_BLINK 延迟值); /*如果触发了 End Test (结束测试),则退出 *注意:可通过 UART 通过命令触发结束测试 * IF (g_endTestTrigged) 中断; }; appPrint ("\n GPIO_TOGGLE_LED 任务已结束"); Task_exit(); }
模板中有一些宏、如"GPIO_LED0_PORT_NUM"。 "端口"一词的定义是什么。
我在 AM65x 技术参考中找不到(或者我错过了)它。 "端口"是否与"组"相关?
此致。
ChingWei
您好、ChingWei、
中提供了一个 GPIO 示例 \packages/ti\drv\gpio\test\led_blink。 此示例将在 A53和 R5F 上构建并执行。
[引用 user="ChingWei Huang"] GPIO_socGetInitCfg ()和 GPIO_socSetInitCfg ()的用法是什么?[/quot]
提供这些 API 函数的目的是使应用能够更改 GPIO 硬件模块的默认驱动程序配置。 默认配置位于中 \packages/ti\drv\gpio\soc am65xx\gpio_soc.c、gpio_v0_hwAttrs。 使用这些函数、应用程序:
[引用 user="ChingWei Huang"]如果我们在调用 GPIO_write()等函数之前不调用它,会发生什么情况?
应用程序将使用 GPIO 硬件模块的默认驱动程序配置。
[引用 USER="ChingWei Huang">大多数 GPIO API 的参数只包含索引信息,不包含域信息。 [/报价]
GPIO 驱动程序不会保留域特定的信息。 要在特定域(例如 WKUP_GPIO0)中使用 GPIO、应调用 GPIO_socGetInitCfg ()和 GPIO_socSetInitCfg () API 函数来更新所需端口的基址(例如、对于 WKUP_GPIO0、为端口0更新基址)。 这可以在上面提到的 R5F 示例中看到、请参阅函数 Board_initGPIO()。
大多数 GPIO API 函数的 index 参数是应用定义表的索引、其中包含 GPIO 引脚配置。 例如、请参阅 \packages/ti\drv\gpio\test\led_blink\am65xx\gpio_board.c. index 参数用于索引到 gpioPinConfigs[]表中。 可以修改 GPIO_board.c 的内容以添加更多 GPIO、或更改现有 GPIO 的配置。
[引用用户="ChingWei Huang"]这些函数如何帮助我们设置特定的 GPIO 引脚?
特定引脚配置包含在 GPIO_board.c 中的数组 gpioPinConfigs[]和 gpioCallbackFunctions[]中、用于特定应用。
[引用 user="ChingWei Huanga">此外,在 app.c 中,它会将枚举器- USER_LED0传递给 GPIO_toggle ()。 为什么它不传递目标 LED 的 GPIO 索引?[/quot]
该索引用于 gpioPinConfigs[]。 gpioPinConfigs[]中的相应条目应包含与 LED 相关的端口和引脚编号。
[引用用户="ChingWei Huanga">模板中有一些宏、如"GPIO_LED0_PORT_NUM"。 "港口"一词的定义是什么? 我在 AM65x 技术参考中找不到(或者我错过了)它。 "端口"是否与"银行"相关?[/quot]
端口是 GPIO 硬件模块、即
每个端口有多个组、每个组有16个引脚、请参阅 TRM、12.1.2.1 GPIO 概述。
此致、
弗兰克
你(们)好、Frank
感谢你的答复。 它对我们有很大帮助!
因此、我们似乎需要构建 GPIO 配置来告知 API 我们要使用哪种 GPIO。
我们无法在运行时访问新的 GPIO (未包括在 GPIO 配置中)。
如果我们已经为应用构建了自己的 GPIO 配置,则 不再需要调用 GPIO_socGetInitCfg()和 GPIO_socSetInitCfg()。
例如、如果我要创建一个 AM65x 应用、该应用将控制 WKUP_GPIO0、GPIO0、GPIO1。
我首先在 am65xx/GPIO_SoC.c 中更改 GPIO_V0_hwAttrs 和 GPIO_config
/* GPIO 驱动程序硬件属性*/ GPIO_V0_hwAttrsList GPIO_V0_hwAttrs = { { CSL_WKUP_GPIO0_BASE、 GPIO_intCfgs[0]、 &GPIO_socConfigIntraPath、 }、 { CSL_GPIO0_BASE、 GPIO_intCfgs[1][0]、 &GPIO_socConfigIntraPath、 }、 { CSL_GPIO1_base、 GPIO_intCfgs[2][0]、 &GPIO_socConfigIntraPath 、} }; /* GPIO 配置结构*/ CSL_public_const GPIOConfigList GPIO_config = { { GPIO_FxnTable_V0、 null、 &GPIO_V0_hwAttrs[0] }、 { GPIO_FxnTable_V0、 null、 GPIO_V0_hwAttrs[1] }、 { GPIO_FxnTable_V0、 null、 &GPIO_V0_hwAttrs[2] } };
在这种情况下、端口0将引用 WKUP_GPIO0、端口1将引用 GPIO0、端口2将引用 GPIO1。
接下来、我更改 board.c 中的 gpioPinConfigs
#define WKUP_GPIO0_PORT_NUM (0 << 8) #define GPIO0_PORT_NUM (1 << 8) #define GPIO1_PORT_NUM (2 << 8) /* GPIO 驱动器板特定引脚配置结构*/ GPIO_PinConfig gpioPinConfigs[]={ WKUP_GPIO0_PORT_NUM | WKUP_GPIO15_PIN_NUM | GPIO_CFG_OUTPUT、 WKUP_GPIO0_PORT_NUM | WKUP_GPIO16_PIN_NUM | GPIO_CFG_OUTPUT、 GPIO0_PORT_NUM | GPIO0_12_PIN_NUM | GPIO_CFG_OUTPUT、 GPIO1_PORT_NUM | GPIO1_2_PIN_NUM | GPIO_CFG_OUTPUT 、}; // GPIO 驱动程序回调函数*/ GPIO_CallbackFxn gpioCallbackFunctions[]={ null、 null、 null、 空、 }; /* GPIO 驱动程序配置结构*/ GPIO_V0_Config GPIO_V0_CONFIG ={ gpioPinConfigs、 GpioCallbackFunctions、 sizeof (gpioPinConfigs)/sizeof (GPIO_PinConfig)、 sizeof (gpioCallbackFunctions)/ sizeof (GPIO_CallbackFxn)、 0、 };
因此、
GPIO_TOGGLE (0);//这将切换 WKUP_GPIO0:GPIO-15 GPIO_TOGGLE (1);//这将切换 WKUP_GPIO0:GPIO-16 GPIO_TOGGLE (2);//这将切换 GPIO0:GPIO-12 GPIO_TOGGLE (3);//这将切换 GPIO1:GPIO-2
我的想法是否正确?
此致。
ChingWei
ChingWei、
我将再次检查这个线程、这个线程看起来尚未完全关闭。 您是否能够解决您的问题?
此致、
Dave
您好、Dave
TI-RTOS GPIO API 问题仍未解决。
但是、我们现在通过直接写入 GPIO 寄存器而不是使用 RTOS API 来完成 GPIO 控制。
我认为这个问题现在可以解决、因为我们没有使用 RTOS API。
当我们需要使用 RTOS API 时、我会打开一个新问题。 没关系吗?
此致。
ChingWei
谢谢 ChingWei。 让我们这样做。
此致、
Dave