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.

[参考译文] RTOS/LAUNCHXL-CC2640R2:GPIO 驱动器-动态配置

Guru**** 2547520 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/793727/rtos-launchxl-cc2640r2-gpio-driver---dynamic-configuration

器件型号:LAUNCHXL-CC2640R2

工具/软件:TI-RTOS

您好、E2E。  

我之前问过一个有关 GPIO 静态配置的问题、我从这个问题得到的答案让我进入了另一个问题:如何以"最平滑"的方式动态配置 GPIO。  

在 CC2640R2-Launchpad 的许多示例中、即 gpiointerrupt-example 中、2个板载按钮和 LED 的 GPIO 动态设置非常简单、如下所示:

/*
=== mainThread ====
//
void * mainThread (void * arg0)
{
/*调用驱动程序初始化函数*/
GPIO_init();

/*配置 LED 和按钮引脚*/
GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_setConfig (Board_GPIO_LED1、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_setConfig (Board_GPIO_BUTTON0、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_INT_FALLING);
GPIO_setConfig (Board_GPIO_Button1、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_INT_FALLING);

/*打开用户 LED */
GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_ON);

/*安装按钮回调*/
GPIO_setCallback (Board_GPIO_BUTTON0、gpioButtonFxn0);
GPIO_setCallback (Board_GPIO_Button1、gpioButtonFxn1);

/*启用中断*/
GPIO_enableInt (Board_GPIO_BUTTON0);
GPIO_enableInt (Board_GPIO_Button1);

返回(NULL);
} 

这是唯一可行的、因为这些 GPIO 已经在 Board.h-file 和 CC2640R2_LAUNCHXL.h-文件中实现为通用、如下所示:  

// Board.h 定义:
#define Board_GPIO_BUTTON0 CC2640R2_LAUNCHXL_GPIO_S1
#define Board_GPIO_Button1 CC2640R2_LAUNCHXL_GPIO_S2
#define Board_GPIO_BTN1 CC2640R2_LAUNCHXL_GPIO_S1
#define Board_GPIO_BTN2 CC2640R2_LAUNCHXL_GPIO_S2
#define Board_GPIO_LED0 CC2640R2_LAUNCHXL_GPIO_LED_RED
#define Board_GPIO_LED1 CC2640R2_LAUNCHXL_GPIO_LED_GREEN
#define Board_GPIO_LED2 CC2640R2_LAUNCHXL_GPIO_LED_RED
#define Board_GPIO_RLED CC2640R2_LAUNCHXL_GPIO_LED_RED
#define Board_GPIO_GLED CC2640R2_LAUNCHXL_GPIO_LED_GREEN
#define Board_GPIO_LED_ON CC2640R2_LAUNCHXL_GPIO_LED_ON
#define Board_GPIO_LED_OFF CC2640R2_LAUNCHXL_GPIO_LED_OFF
#define Board_GPIO_TMP116_EN CC2640R2_LAUNCHXL_GPIO_TMP116_EN 

/*!
*@def CC2640R2_LAUNCHXL_GPIOName
*@GPIO 名称的简短枚举
*/
typedef enum CC2640R2_LAUNCHXL_GPIOName{
CC2640R2_LAUNCHXL_GPIO_S1 = 0、
CC2640R2_LAUNCHXL_GPIO_S2、
CC2640R2_LAUNCHXL_SPI_MASTER_READY、
CC2640R2_LAUNCHXL_SPI_SLAVE_READY、
CC2640R2_LAUNCHXL_GPIO_LED_GREEN、
CC2640R2_LAUNCHXL_GPIO_LED_RED、
CC2640R2_LAUNCHXL_GPIO_TMP116_EN、
CC2640R2_LAUNCHXL_GPIO_SPI_FLASH_CS、
CC2640R2_LAUNCHXL_SDSPI_CS、
CC2640R2_LAUNCHXL_GPIO_LCD_CS、
CC2640R2_LAUNCHXL_GPIO_LCD_POWER、
CC2640R2_LAUNCHXL_GPIO_LCD_ENABLE、
CC2640R2_LAUNCHXL_GPIOCOUNT
}CC2640R2_LAUNCHXL_GPIOName; 

我认为使用驱动程序是一种奇怪的方法、如果我必须修改这些.h 文件才能使用 GPIO 驱动程序、我想知道是否有另一种更直接的方法来配置 GPIO 通用、 这些.h 文件中尚未实现的代码-例如 DIO22引脚。 就像现在一样、我将按如下所示执行它、在两个.h 文件中实现了 DIO:

// Board.h 定义
#define Board_GPIO_SPI_nDRDY CC2640R2_LAUNCHXL_GPIO_DIO22 //由 PWN
#define Board_GPIO_DIO22添加 CC2640R2_LAUNCHXL_GPIO_DIO22 //由 PWN
#define Board_GPIO_BUTTON0添加 CC2640R2_LAUNCHXL_GPIO_S1
#define Board_GPIO_Button1 CC2640R2_LAUNCHXL_GPIO_S2
#define Board_GPIO_BTN1 CC2640R2_LAUNCHXL_GPIO_S1
#define Board_GPIO_BTN2 CC2640R2_LAUNCHXL_GPIO_S2
#define Board_GPIO_LED0 CC2640R2_LAUNCHXL_GPIO_LED_RED
#define Board_GPIO_LED1 CC2640R2_LAUNCHXL_GPIO_LED_GREEN
#define Board_GPIO_LED2 CC2640R2_LAUNCHXL_GPIO_LED_RED
#define Board_GPIO_RLED CC2640R2_LAUNCHXL_GPIO_LED_RED
#define Board_GPIO_GLED CC2640R2_LAUNCHXL_GPIO_LED_GREEN
#define Board_GPIO_LED_ON CC2640R2_LAUNCHXL_GPIO_LED_ON
#define Board_GPIO_LED_OFF CC2640R2_LAUNCHXL_GPIO_LED_OFF
#define Board_GPIO_TMP116_EN CC2640R2_LAUNCHXL_GPIO_TMP116_EN 

/*!
*@def CC2640R2_LAUNCHXL_GPIOName
*@GPIO 名称的简短枚举
*/
typedef enum CC2640R2_LAUNCHXL_GPIOName{
CC2640R2_LAUNCHXL_GPIO_DIO22 = 0、 //由 PWN 添加
CC2640R2_LAUNCHXL_GPIO_S1、
CC2640R2_LAUNCHXL_GPIO_S2、
CC2640R2_LAUNCHXL_SPI_MASTER_READY、
CC2640R2_LAUNCHXL_SPI_SLAVE_READY、
CC2640R2_LAUNCHXL_GPIO_LED_GREEN、
CC2640R2_LAUNCHXL_GPIO_LED_RED、
CC2640R2_LAUNCHXL_GPIO_TMP116_EN、
CC2640R2_LAUNCHXL_GPIO_SPI_FLASH_CS、
CC2640R2_LAUNCHXL_SDSPI_CS、
CC2640R2_LAUNCHXL_GPIO_LCD_CS、
CC2640R2_LAUNCHXL_GPIO_LCD_POWER、
CC2640R2_LAUNCHXL_GPIO_LCD_ENABLE、
CC2640R2_LAUNCHXL_GPIOCOUNT
}CC2640R2_LAUNCHXL_GPIOName; 

因此、可以通过将 DIO22应用于 CC2640R2_LAUNCHXL.c 文件中的 gpioPin 表和 gpioCallback 表、将 DIO22应用于 GPIO 驱动器、如下所示:  

/*
引脚配置数组
*注意:引脚配置的顺序必须与之前
的顺序一致* 在 CC2640R2_LAUNCHXL.h 中定义
*注意:不用于中断的引脚应放置在
*的末尾 数组。 回调数组到
*的回调条目可以省略 减少内存使用。
*/
GPIO_PinConfig gpioPinConfigs[]={
/*输入引脚*/
GPIOCC26XX_DIO_22 | GPIO_DO_NOT_CONFIG、// SPI - nDRDY (由 PWN 添加)*/
GPIOCC26XX_DIO_13 | GPIO_DO_NOT _CONFIG、/*按钮1 */
GPIOCC26XX_DIO_14 | GPIO_DO_NOT _CONFIG、/*按钮2 */

GPIOCC26XX_DIO_15 | GPIO_DO_NOT _CONFIG、// CC2640R2_LAUNCHXL_SPI_MASTER_READY *
GPIOCC26XX_DIO_21 | GPIO_DO_NOT _CONFIG、// CC2640R2_LAUNCHXL_SPI_SLAVE_READY *

/*输出引脚*/
GPIOCC26XX_DIO_07 | GPIO_DO_NOT _CONFIG、/*绿色 LED *
GPIOCC26XX_DIO_06 | GPIO_DO_NOT _CONFIG、/*红色 LED *
GPIOCC26XX_DIO_30 | GPIO_DO_NOT _CONFIG、// TMP116_EN *

/* SPI 闪存 CSn *
GPIOCC26XX_DIO_20 | GPIO_DO_NOT _CONFIG、

/* SD CS */
GPIOCC26XX_DIO_21 | GPIO_DO_NOT _CONFIG、

/* Sharp Display - GPIO 配置将在 Display 文件中完成*/
GPIOCC26XX_DIO_24 | GPIO_DO_NOT _CONFIG、/* SPI 芯片选择*
GPIOCC26XX_DIO_22 | GPIO_DO_NOT _CONFIG、/* LCD 电源控制*
GPIOCC26XX_DIO_23 | GPIO_DO_NOT_CONFIG、/* LCD enable */

};

//
*回调函数指针数组
*注意:引脚配置的顺序必须与之前
的顺序一致* 在 CC2640R2_LAUNCH.h 中定义
*注意:不用于中断的引脚可从回调数组中省略至
* 减少内存使用(如果放置在 gpioPinConfigs 数组的末尾)。
*/
GPIO_CallbackFxn gpioCallbackFunctions[]={
空、/* SPI - nDRDY (由 PWN 添加) */
空,/*按钮1 */
空,/*按钮2 */
空、// CC2640R2_LAUNCHXL_SPI_MASTER_READY */
空、// CC2640R2_LAUNCHXL_SPI_SLAVE_READY */
}; 

通过这些修改、可以配置 DIO22通用、如下所示:  

/*配置 L_Button 引脚和 SPI_nDRDY 引脚*
GPIO_setConfig (Board_GPIO_BUTTON0、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_INT_FALLING);
GPIO_setConfig (Board_GPIO_SPI_nDRDY、GPIO_CFG_IN_INT_INT_INT_FALLING);

/*安装 L_Button 回调和 SPI_nDRDY 回调*/
GPIO_setCallback (Board_GPIO_BUTTON0、btnL_intFxn);
GPIO_setCallback (Board_GPIO_SPI_nDRDY、btnR_intFxn);

/*启用中断*/
GPIO_enableInt (Board_GPIO_BUTTON0);
GPIO_enableInt (Board_GPIO_SPI_nDRDY); 

但正如您看到的、我必须修改通用代码4位置、我觉得很奇怪、需要将 GPIO 驱动程序用于非实现 GPIO。  

我曾尝试在这个论坛和其他论坛以及 GPIO 驱动程序手册中对此进行查找、但我运气不好。  


此致、
Peter  

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

    这就是 GPIO 驱动程序的工作方式、您需要更新三种结构以添加要使用的每个引脚。 GPIO 驱动程序的替代方法是使用引脚驱动程序、该驱动程序使您能够完全灵活地在运行时使用哪个引脚、而无需在编译时使用这些引脚进行预定义。