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/CC2640:一次性中断被触发两次

Guru**** 2589035 points
Other Parts Discussed in Thread: CC2640

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/599737/rtos-cc2640-one-shot-interrupt-getting-triggered-twice

器件型号:CC2640

工具/软件:TI-RTOS

大家好!

背景:

我有一个传感器、我需要每秒进行250次采样。 我正在使用传感器控制器来延长电池寿命。 我无法在需要时随时启动传感器控制器任务 、因为我需要确保在正确的时间开始对传感器进行采样、否则会在寄存器中的数据发生变化时冒险对传感器进行采样。 我的解决方案是、传感器有一个中断。 我将等待传感器给我一个中断、现在我知道我可以每秒开始采样250次(并关闭中断)。

问题:

由于某种原因、单次触发中断被触发两次。

我的代码:

void set_up (){

//将中断设置为在我们从传感器
System_printf 获取新数据时触发("我们正在为 DATA_RDY 信号设置中断\n");System_flush ();
PIN_registerIntCb (ledPinHandle、pinInterHandler);
PIN_setInterrupt (ledPinHandle、 PIN_ID (19)| PIN_IRQ_POedge);

}


//由于某种原因,此块会触发两次,原因是什么?
//我需要一次性中断
void pinInterruptHandler (PIN_Handle handle、PIN_ID pinId){

System_printf ("我们从传感器获得中断\n"); System_flush ();
PIN_setInterrupt (ledPinHandle、PIN_ID (19)| PIN_IRQ_DIS);
PIN_Status hello = PIN_clrPendInterrupt (ledPinHandle、PIN_ID (19));

//启动传感器控制器任务
scifStartTasksNbl (BV (SCIF_SAMPLE_SENSOR_TASK_ID));

} 

控制台输出:

[Cortex_M3_0]我们正在运行设置过程
我们正在为 DATA_RDY 信号设置中断
我们从传感器获得中断
我们从传感器获得中断

奖励问题:

我是否可以不使用中断、而只是轮询传感器的 DATA_RDY 中断、以便知道何时开始运行任务? 我想做一个 while 循环并检查引脚、但这似乎不能捕获0.25us 脉冲。 也许我可以使用阻塞中断或其他操作?

代码如下所示:

1.初始化传感器
2.等待100ms 以使数据稳定(请参阅数据表)
3.等待 DATA_RDY 变为高电平
4.启动传感器控制器任务 

我的问题:

  1. 为什么我的单次中断会被触发两次、尽管我关闭了它、然后在收到第一个中断时清除了挂起?
  2. 如何使用阻塞中断?

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

    您好!  

    您是否在  PIN_setInterrupt()调用之后立即获得第一个中断?

    是否可以尝试调用 PIN_setPortOutputValue()来设置 PIN 的初始状态?

    祝你一切顺利

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Roman Kuleshov:
    1
    被触发两次的单次中断通常出现还是只出现一次?
    如果只有一次、原因可能是 PIN 的初始状态。
    如果它通常出现、您应该检查什么会影响您的引脚。 您可以使用逻辑分析仪进行检查。
    2为什么要在收到中断后禁用引脚中断?
    PIN_setInterrupt (ledPinHandle、PIN_ID (19)| PIN_IRQ_DIS);
    PIN_Status hello = PIN_clrPendInterrupt (ledPinHandle、PIN_ID (19));
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >您是否在 PIN_setInterrupt()调用之后立即获得第一个中断?

    是的

    >是否可以尝试调用 PIN_setPortOutputValue()来设置 PIN 的初始状态?

    嗯、这对我来说毫无意义。 它是一个输入引脚。 为什么要设置已被驱动的引脚的输出端口值?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1。

    >被触发两次的单次中断通常会出现还是只出现一次?

    始终触发两次。

    >如果只有一次、原因可能是 PIN 的初始状态。

    我在输入引脚由外部 IC 驱动后启动中断、此时初始状态是否重要? 此外、该引脚已经由引脚驱动、为什么我会陈述初始状态?

    >您可以使用逻辑分析仪进行检查。

    嗯、我可以尝试一下、因为我现在没有一个、所以需要几天时间。

    2.

    >为什么要在收到中断后禁用引脚中断?

    我在"背景"部分中介绍了原因、但基本上我使用中断来确定何时启动传感器控制器代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Roman Kuleshov"]

    我在"背景"部分中介绍了原因、但基本上我使用中断来确定何时启动传感器控制器代码。

    [/报价]

    更简单的方法  是、您可以使用 flag 变量将 true 或 false 设置为 etermine 何时启动传感器控制器代码。

    [引用 user="Roman Kuleshov"]1.

    始终触发两次。

    [/报价]

    由于您的触发器是从传感器生成的、因此我们有2种情况:

    -传感器问题:您的传感器生成2个触发器。 您需要仔细检查其数据表。  
    - CC2640上的问题:您的传感器仅生成1个触发器。 但是、CC2640接收2个触发器。 您可以使用按钮来模拟传感器的触发器。

    您是在定制 PCB 还是 TI 开发套件上进行开发?