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.

[参考译文] CCS/LAUNCHXL-CC1352R1:引脚中断

Guru**** 2551110 points
Other Parts Discussed in Thread: OPT3001

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/833831/ccs-launchxl-cc1352r1-pin-interruption

器件型号:LAUNCHXL-CC1352R1
主题中讨论的其他器件:OPT3001

工具/软件:Code Composer Studio

您好!

我有一个传感器 BoosterPack、我正在使用 opt3001传感器测量配体、我编写了此代码并将 OPT_INT 引脚连接到 DIO12。

我想配置下一次中断:当配体为低电平时、我想打开 LED1;当配体过高时、我想关闭 LED1。

我已经查看了"引脚中断"示例、但我不知道如何执行我之前所解释的操作。

以下是代码:

#define TMP007_ADDR 0x47;

静态 Display_Handle 显示;

void gpioButtonFxn0 (uint_least8_t index)
{
/*清除 GPIO 中断并切换 LED */
GPIO_TOGGLE (Board_GPIO_LED1);
display_printf (display、0、0、"INT.");
}

/*
===== mainThread ====
//
void * mainThread (void * arg0)
{
uint16_t 样本;
uint16_t LUX_RAW;
uint16_t e、m;
float 勒克斯;
uint8_t txBuffer[3];
uint8_t rxBuffer[2];
I2C_Handle I2C;
I2C_Params i2cParams;
I2C_Transaction i2cTransaction;

/*调用驱动程序初始化函数*/
display_init();
GPIO_init();
I2C_init();

/*配置 LED 以及 TMP116_EN 引脚(如果适用)*/
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_DIO12、GPIO_CFG_INPUT| GPIO_CFG_IN_INT_INT_FALLING);

/*安装引脚 DIO12回调*/
GPIO_setCallback (Board_DIO12、gpioButtonFxn0);
GPIO_enableInt (Board_DIO12);

/*打开主机显示屏以输出*/
Display = Display_open (Display_Type_UART、NULL);
if (display =NULL){
while (1);
}

/*打开用户 LED */
GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_ON);
display_printf (display、0、0、"启动 i2ctmp 示例。");

/*创建 I2C 以供使用*/
I2C_Params_init (&i2cParams);
i2cParams.bitrate = I2C_100kHz;
I2C = I2C_open (Board_I2C_TMP、&i2cParams);
if (i2c == NULL){
Display_printf (display、0、0、"Error Initializing I2C\n");
while (1);
}
否则{
display_printf (display、0、0、"I2C initialized!\n"\});
}

/*通用 I2C 事务设置*/
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 3;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.ReadCount = 2;

TxBuffer[0]= 0x0001;
TxBuffer[1]= 0xce;
TxBuffer[2]= 0x10;
i2cTransaction.slaveAddress = TMP007_ADDR;
if (!I2C_transfer (i2c、&i2cTransaction)){
Display_printf (display、0、0、"错误。 未找到 TMP 传感器!");
while (1);
}

TxBuffer[0]= 0x0002;
TxBuffer[1]= 0x02;
txBuffer[2]= 0xff;
i2cTransaction.slaveAddress = TMP007_ADDR;
if (!I2C_transfer (i2c、&i2cTransaction)){
Display_printf (display、0、0、"错误。 未找到 TMP 传感器!");
while (1);
}

TxBuffer[0]= 0x0003;
TxBuffer[1]= 0x8a;
TxBuffer[2]= 0xAA;
i2cTransaction.slaveAddress = TMP007_ADDR;
if (!I2C_transfer (i2c、&i2cTransaction)){
Display_printf (display、0、0、"错误。 未找到 TMP 传感器!");
while (1);
}

i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.ReadCount = 2;

TxBuffer[0]= 0x0000;

/*采集20个样本并将其打印到控制台*/
对于(sample = 0;sample < 50;sample++){

if (I2C_transfer (i2c、&i2cTransaction)){

Lux_RAW =(rxBuffer[0]<< 8)|(rxBuffer[1]);

M = lux_raw 和0x0FFF;
E =(lux_raw & 0xF000)>> 12;

Lux = m *(0.01 * pow (2、e));

Display_printf (display、0、0、"Sample %u:%f %x %x"、
SAMPLE+1、lux、rxBuffer[0]、rxBuffer[1]);
}
否则{
display_printf (display、0、0、"I2C 总线故障");
}

/*睡眠1秒*/
睡眠(1);
}

I2C_Close (i2c);
display_printf (display、0、0、"I2C closed!");

返回(NULL);
} 

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

    不要在中断中使用 printf()。 设置标志并从主循环打印。

    记住 Hubert Hawkins 的第一条中断规则:

    "我想进去、继续、把它用完、然后出去。 明白了吗?"

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

    您好!

    好的、我不会在中断中写入任何内容、我会设置一个标志、但它不会回答以下问题:如何执行中断?

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

    您必须使用比较器。 使用 SensorController 可能更容易:

    www.ti.com/.../swat014.pdf

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

    您好!

    我们的问题是、当我们将输入引脚中断、例如 Board_GPIO_BUTTON0更改为 Board_DIO21时、不会发生任何情况。 微控制器不会恢复中断、因此不执行回调代码。

    我们测试了添加 上拉/下拉电阻器的方法、但结果相同。  

    我们可以在示波器中看到脉冲是 oKey、因此我的问题是配置问题:

    如您所见、引脚和中断配置如下:

    GPIO_setConfig(Board_DIO12, GPIO_CFG_INPUT | GPIO_CFG_IN_INT_FALLING); // Configure the INT pin
         GPIO_setCallback(Board_DIO12, gpioButtonFxn0);                         // install Pin DIO12 callback
         GPIO_enableInt(Board_DIO12);                                           // enable INT
    我们缺少什么?
    提前感谢您!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    为什么您的中断使用的引脚配置与按钮使用的引脚配置不同? 您可以在 CC1352R1_LAUNCHXL.c 中找到此配置:

    const PIN_Config BoardGpioInitTable[]={
    (笑声)
    CC1352R1_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_迟滞、
    (笑声)
    PIN_TERMINATE
    } 

    一个注释:在调试时、您可以直接修改文件 Board.h 的内容、以更改定义为 Board_GPIO_BUTTON0的引脚。 在 Board.h 中、我基本上执行了以下操作、并且可以将引脚 DIO12用作中断引脚(无需在项目中进行任何其他代码修改):

    #define Board_PIN_BUTTON0 CC1352R1_LAUNCHXL_DIO12 //CC1352R1_LAUNCHXL_PIN_BTN1 

    这样、您就可以完全按照按钮引脚的配置来配置一个引脚(这里是 DIO12)(并消除一些错误可能性[例如编码错误])。

    (很明显、但在本例中、要测试代码、您必须使用一根导线并将 Launchpad 的引脚 DIO12连接到 GND 以生成边沿[并切换 LED]。)

    我希望这将有所帮助、

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

    您好!

    我刚刚更改了引脚、而不是 DIO12、我使用了 DIO23 (类比)、并将 pinInterrupt 示例与我的代码进行了混合

    I 已擦除:

    void gpioButtonFxn0 (uint_least8_t index)
    {
    /*清除 GPIO 中断并切换 LED */
    GPIO_TOGGLE (Board_GPIO_LED1);
    display_printf (display、0、0、"INT.");
    }
    
    ...
    (笑声)
    
    GPIO_setConfig (Board_DIO12、GPIO_CFG_INPUT| GPIO_CFG_IN_INT_INT_FALLING);
    
    /*安装引脚 DIO12回调*/
    GPIO_setCallback (Board_DIO12、gpioButtonFxn0);
    GPIO_enableInt (Board_DIO12);
    

    接下来的几行内容是:

    int x=0;//标记以了解何时发生中断
    // 0 =否
    // 1 =是、为了接受其他中断、我们将读取传感器的配置
    
    
    static PIN_State buttonPinState;
    static PIN_State ledPinState;
    
    static PIN_Handle buttonPinHandle;
    static PIN_Handle ledPinHandle;
    
    PIN_Config ledPinTable[]={
    BOARD_PIN_LED1 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、
    PIN_TERMINATE
    };
    
    
    PIN_Config 按钮 PinTable[]={
    Board_DIO23_ANALOG | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE、
    PIN_TERMINATE
    };
    
    
    void buttonCallbackFxn (PIN_Handle handle、PIN_ID pinId){
    uint32_t currVal = 0;
    
    if (!PIN_getInputValue (pinId)){
    /*切换 LED */
    开关(pinId){
    案例 Board_DIO23_ANALOG:
    currVal = PIN_getOutputValue (Board_PIN_LED1);
    PIN_setOutputValue (ledPinHandle、Board_PIN_LED1、!currVal);
    
    X=1;
    
    中断;
    默认值:
    /*不执行任何操作*/
    中断;
    }
    }
    
    
    
    void *mainThread (void *arg0){...
    
    (笑声)
    i2cTransaction.writeCount = 1;
    
    
    /*采集20个样本并将其打印到控制台*/
    对于(sample = 0;sample < 20;sample++){
    
    TxBuffer[0]= 0x0000;
    
    (笑声)
    (笑声)
    
    if (x){
    TxBuffer[0]= 0x0001;
    if (!I2C_transfer (i2c、&i2cTransaction)){
    Display_printf (display、0、0、"错误。 "Conf 未读");
    while (1);
    }
    X=0;
    }
    (笑声)
    
    。} 

    我阅读此帖子:
    https://e2e.ti.com/support/sensors/f/1023/t/581764?OPT3001-OPT3001-in-latch-mode-interrupt

    然后我知道、当出现中断时、我必须清除标志、我该怎么做? 读取传感器的配置。

    问:为什么不在中断回调中读取传感器配置?
    答:因为在使用 i2c 通信获取样本的同时、无法使用 i2c 访问传感器。