nRF51822关于GPIOTE模块的外部中断问题
nRF51822的GPIO的外部中断单独做成了一个模块,叫做GPIOTE,除了产生外部中断事件外,还支持输出任务。
这里重点关注一下外部中断的功能,GPIOTE有两种外部中断模式:
一种是IN_EVENT
这种模式可以独立配置4个通道,每个通道都有专门的中断标志位,可以任意指管脚和中断触发方式:上升/下降/翻转
当检测到对应的电平跳变后,将产生中断,触发GPIOTE_IRQHandler函数,但是这种模式有一个严重的问题,那就是静态功耗有1.3mA,对于低功耗芯片来说,这个功能就相当的鸡勒了。
另一种是PORT_EVENT
这种模式所有GPIO外部中断共用一个中断标志,在GPIOTE模块中,没有多余的参数配置寄存器。
要用它实现外部中断,需要在GPIO模块中配置对应的管脚打开SENSE功能,而GPIO的这个SENSE功能呢,
它的功能是检测GPIO电平,如果满足PIN_CNF[17:16]设置的条件,则将DETECT信号拉高。
这个DETECT信号是内部信号,每个PIN都有一条独立的DETECT信号,而所有的DETECT信号又由系统以[逻辑或]的方式合并为一条通用的DETECT信号,当这条通用的DETECT信号产生上升沿跳变的时候,就会产生一次PORT_EVENT中断。
PORT_EVENT中断方式功耗极低,但是却存在多个GPIO冲突的情况,导至中断不能正确地触发。