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 配置-静态/动态- TI-RTOS

Guru**** 2551110 points


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

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

器件型号:LAUNCHXL-CC2640R2

工具/软件:TI-RTOS

当输入从高电平变为低电平时、我将尝试配置 GPIO 以引起中断。 我正在使用 GPIO 驱动程序、但无论我是尝试使用配置数组将其配置为静态、还是在运行时配置为动态、我都无法正确配置。  


在下面、您可以看到静态配置的代码、按以下顺序:1. BoardGpioInitTable、2. GpioCallbackFunctions、3. gpioPinConfigs

1. BoardGpioInitTable:

const PIN_Config BoardGpioInitTable[]={

CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、 /* LED 最初关闭*/
CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、 /* LED 最初关闭*/
CC2640R2_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_迟滞、 /*按钮为低电平有效*/
CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_迟滞、 /*按钮为低电平有效*/
CC2640R2_LAUNCHXL_DIO22 | PIN_INPUT_EN | PIN_IRQ_NEGEDGE | PIN_迟滞、/*!!! 我的配置!!! *
CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MIN、/*外部闪存芯片选择*
CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN、 /*通过调试器反向通道的 UART RX */
CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull、 /*通过调试器反向通道的 UART TX */
CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 主器件输出-从器件输入*/
CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 主器件输入-从器件输出*/
CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 时钟*/

PIN_TERMINATE
}; 

gpioCallbackFunctions:  

GPIO_CallbackFxn gpioCallbackFunctions[]={
空,/*!!! 我的配置!!! *
空,/*按钮1 */
空,/*按钮2 */
空、// CC2640R2_LAUNCHXL_SPI_MASTER_READY */
空、// CC2640R2_LAUNCHXL_SPI_SLAVE_READY */
};  

3. gpioPinConfigs:  

GPIO_PinConfig gpioPinConfigs[]={
/*输入引脚*/
GPIOCC26XX_DIO_22 | GPIO_DO_NOT _CONFIG、/*!!! 我的配置!!! *
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 使能*/

}; 

据我所知、Board_init 会为所有 IO 设置配置表、并且任何未在 BoardGpioInitTable 中声明的 IO 都将设置为默认值。 之后、当调用 GPIO_init 时、会将之前的 IO 表复制到 configArray、如果引脚未与 gpioPinConfigs-table 中的"GPIO_DO_NOT CONFIG"宏进行"ORed"、则会重新配置这些引脚。 中断引脚的回调函数在 gpioCallbackFuncions 中分别按照 BaordGpioInitTable 的引脚顺序进行声明。 我用以下行动态完成了它:  

GPIO_setCallback (Board_DIO22、DIO22_intFxn);

当我这样做时、程序会在我尝试配置动态回调函数后进入异常模式。  


2. 在下面,当我尝试配置 IOS 动态时,您可以看到默认静态表。  

BoardGpioInitTable:

const PIN_Config BoardGpioInitTable[]={

CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、 /* LED 最初关闭*/
CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、 /* LED 最初关闭*/
CC2640R2_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_迟滞、 /*按钮为低电平有效*/
CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_迟滞、 /*按钮为低电平有效*/
CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MIN、/*外部闪存芯片选择*
CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN、 /*通过调试器反向通道的 UART RX */
CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull、 /*通过调试器反向通道的 UART TX */
CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 主器件输出-从器件输入*/
CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 主器件输入-从器件输出*/
CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 时钟*/

PIN_TERMINATE
};

gpioCallbackFunctions:
GPIO_CallbackFxn gpioCallbackFunctions []={
空,/*按钮1 */
空,/*按钮2 */
空、// CC2640R2_LAUNCHXL_SPI_MASTER_READY */
空、// CC2640R2_LAUNCHXL_SPI_SLAVE_READY */
};

gpioPinConfigs:
GPIO_PinConfig gpioPinConfigs[]={
/*输入引脚*/
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 使能*/

}; 

在下面、您可以看到动态配置、这是在我调用 Board_init 和 GPIO_init 之后完成的:  

/*配置 Button 引脚*/
GPIO_setConfig (Board_DIO22、GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_INT_FALLING);

/*安装按钮回调*/
GPIO_setCallback (Board_DIO22、DIO22_intFxn);

//启用中断*
/ GPIO_enableInt (Board_DIO22); 

当我这样做时、代码会运行、但不会在下降沿或上升沿中断。  

我已经尝试调试代码,并使用 GPIO_getconfig()-Fxn 查看 DIO22-configuration-register 如何通过配置进行更改,如下所示:  

GPIO_getconfig (Board_DIO22、&testDIO22);// testDIO22 = 00100001000000110010111101011000b
GPIO_setConfig (Board_DIO22、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_INT_FALLING);
GPIO_getconfig (Board_DIO22、&testDS1000001100022;/testIO1010000000b) 

我看到5个低位不是"10110 = 22"、这是我所期望的。 不过、根据我的动态配置设置、上部的16个引脚是正确的。 不过、我不明白为什么位29 ="1"。  


我尝试查找其他帖子、但运气不好。 我在驱动程序手册中也找不到答案。 我的问题是:
如何配置 GPIO 静态
2.如何配置 GPIO 动态模式  

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

    我认为您的问题在于您使用"Board_DIO22"。 此定义应是器件上的 DIO 编号(22)、与 GPIO 驱动程序期望的 GPIO 索引不同。 在 CC2640R2_LAUNCHXL.h 文件中、您应该会找到一个 CC2640R2_LAUNCHXL_GPIONNames 枚举、该枚举使用 gpioPinConfigs 结构将1映射到1。

    例如、在您的情况下、如果您要对"my config" GPIO 进行寻址、则会对索引0进行寻址、因为它是数组中的第一个、而不是 Board_DIO22 (它将是数组中的第22个元素)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、M-W -感谢您的响应、现在这更有意义了、并解决了我的动态配置和动态配置问题。

    但现在我想知道、这是不是设置 GPIO 的正确方法、因为在 LAUNCHXL.h 文件中编辑 GPIO 似乎有点复杂、以便成功配置 GPIO 是可能的吗?
    如果应配置到目前为止尚未配置的新 GPIO、应如何实现?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Peter:

    不支持在运行时向驱动程序中添加新的 GPIO (我的意思是说结构中未定义 GPIO)。 您需要在此表中使用任何预期使用的 GPIO。

    我通常建议的替代方案是引脚驱动器。 它不依赖于板级配置文件中的任何预定义结构、而是将配置结构作为"打开"参数。 通常、如果您可以在 PIN 和 GPIO 之间自由选择、则应该使用 CC13xx/CC26xx 的 PIN 驱动程序。 使用 PIN 的一个优点是、由于 GPIO 是引脚驱动程序周围的包装程序、您的闪存占用空间很可能会减小。