工具/软件: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