你好,
我使用DA14585与SDK 6.0.4,我还启用了ext-sleep模式。
g传感器通过i2c连接到DA14585。有一个中断引脚。
传感器的中断设计为初始高,一旦数据准备好,中断引脚将先低后高。
我想检测中断引脚的上升沿,我配置它如下:
在空白set_pad_functions(无效):
GPIO_ConfigurePin(I2C_INT1_PORT, I2C_INT1_PIN, INPUT_PULLUP, PID_GPIO, true);/ / G传感器INT1
GPIO_RegisterCallback (GPIO0_IRQn LIS3DH_Interrupt1_Handler);
GPIO_EnableIRQ(I2C_INT1_PORT, I2C_INT1_PIN, GPIO0_IRQn, false, true, 3);
静态内联void arch_goto_sleep (sleep_mode_t current_sleep_mode):
ext_wakeup_enable (I2C_INT1_PORT I2C_INT1_PIN 0);//0 =>活跃高
然而,我发现我的回调函数将在每次唤醒时间被调用。
原因可能是GPIO_EnableIRQ(在set_pad_functions中)被再次设置,此时中断引脚是高的。
据我所知,DA14585的GPIO中断是level触发的,对吗?
你们有什么办法解决这个问题吗?
谢谢。
设备:
嗨stanley_yeh,
当设备醒来时,如果中断是高电平触发的,并且看到GPIO被设置为高电平,中断将被触发。
关于ext_wakeup_enable(),如果您的设计是完全托管的(这意味着应用程序也运行在585上——我认为它是),那么它就不需要了。我假设你想唤醒设备如果从外部传感器发出一个中断,这意味着如果设备处于睡眠模式正常GPIO IRQ不会醒来设备(除非如果你不使用睡眠模式和你总是醒着)。为了通过中断设备从睡梦中醒来你将不得不使用计时器醒来,你可以看一下如何使用这个h / w ble_app_sleepmode项目中,你也能找到信息关于定时器的嗯醒来- b - 079 DA14585/6 Reference.pdf软件平台。
关于你问题的终端请求,我假设您使用的是睡眠模式和你保持高的中断行传感器通过585年的内部减速停车,所以在每一个醒来你本质上复位中断被触发,以来已经引发了(因为您已经配置了销拉起)ISR执行。既然你想检测高脉冲(我假设你的传感器产生一个高脉冲数据为了通知你)你可以配置销INPUT_PULLDOWN,为了检测高脉冲,如果您正在配置输入打开然后将生成中断总是停下的销。
由于MT_dialog
嗨MT_dialog,
感谢您的及时回复。
抱歉,我忘了提到我修改了ext_wakeup_enable()函数,外部中断在睡眠模式下工作得很好。
我有点糊涂了,是传感器把中断点设高了,不是DA14585。
中断线总是高的,一旦数据准备好,中断线将被设置为低,然后是高。
DA14584所能做的就是等待上升边,然后获取数据。
我已经试过了。如果我将DA14585的引脚修改为INPUT_PULLDOWN和INPUT,它似乎不能工作。
你能给我一些建议吗?
非常感谢。
嗨stanley_yeh,
如果线路默认是高电平,并且中断GPIO_IRQn被配置为在线路高电平时触发,当设备将唤醒并重新启用中断时,将在线路高电平时执行ISR。如果您使用的传感器下降线路低,一旦它有数据,那么您应该配置中断触发时,线路是低的,因此GPIO_EnableIRQ(PORT_x,PIN_x,GPIO0_IRQn,true,true,3)。如果你不想开始读取时,行是低的,但当行是高的,然后你可以尝试设置中断触发时,行是低的,一旦中断,复位中断,再次触发线时再高,一旦被中断将再次引发了然后你就可以开始阅读来自传感器的数据,一旦你重新用硬中断请求优先级别可以设置的交互触发再次回到低,为了不打击下醒来。
由于MT_dialog
嗨,斯坦利。我想问你,因为我对打断有点困惑。你用什么引脚与i2c通信,为什么你选择GPIO0_IRQn?
以下是我的配置:
#定义I2C_GPIO_SCL_PORT GPIO_PORT_0
#定义I2C_SCL_PIN GPIO_PIN_7
#定义I2C_GPIO_SDA_PORT GPIO_PORT_2
#定义I2C_SDA_PIN GPIO_PIN_1
然而,我认为你可以为i2c配置任何pin。没关系。
也可以使用GPIO0_IRQn, GPIO1_IRQn, GPIO2_IRQn, GPIO3_IRQn或GPIO4_IRQn。选一个就行了,没问题。
在这个问题中,我只想确保中断是水平触发器。
欢呼:)