MCU|【PIC32MZ】按键中断

新建工程参考前面两篇帖子。
这里有两种方法使用中断,第一种较为通用,几乎每个引脚都可以做中断,但是精确到一组,在里面要做判断;第二种跟普通mcu中断相似,精确到每个引脚,并且可选择上升沿或下降沿。
第一种方式,仅需三步:一是将需要使用的GPIO设为Input;二是勾选ChangeNotify(如果想要设置默认状态,还可以设置上拉或者下拉);三是在system_interrupt中调用中断函数。 以下为示例,按键为RB12,这里是按下按键接地,低电平,包含长按以及短按处理:
MCU|【PIC32MZ】按键中断
文章图片


MCU|【PIC32MZ】按键中断
文章图片

MCU|【PIC32MZ】按键中断
文章图片


void GPIO_B_Interrupt(void) { //press is low bool sw3State = SYS_PORTS_PinRead(PORTS_ID_0,PORT_CHANNEL_B,12); Sys_Delay_ms(20); //avoid shake if(sw3State!=SYS_PORTS_PinRead(PORTS_ID_0,PORT_CHANNEL_B,12)) return; if(!sw3State)//just get press ,low { uint8_t j=0; for(j=0; j<30; j++) { if(sw3State!=SYS_PORTS_PinRead(PORTS_ID_0,PORT_CHANNEL_B,12))//short press { PowerSwitchStateChange(false); //short press return; } Sys_Delay_ms(300); }PowerSwitchStateChange(true); //long press } }


可以在短按函数和长按函数里面添加输出LED显示,输出方法参考前一篇,这里就不赘述了,比较简单。完成后烧入PIC即可。


第二种方式,使用System Service中的Interrupts,选择中断源还有触发方式,然后配置映射引脚,再在system_interrupt.c的对应函数中调用你的Function即可。
MCU|【PIC32MZ】按键中断
文章图片


MCU|【PIC32MZ】按键中断
文章图片


触发函数:
void __ISR(_EXTERNAL_1_VECTOR, IPL1AUTO) _IntHandlerExternalInterruptInstance0(void) { POWER_BUTTON_Interrupt(); PLIB_INT_SourceFlagClear(INT_ID_0, INT_SOURCE_EXTERNAL_1); } void __ISR(_EXTERNAL_2_VECTOR, IPL1AUTO) _IntHandlerExternalInterruptInstance1(void) { UP_LIMIT_Interrupt(); PLIB_INT_SourceFlagClear(INT_ID_0, INT_SOURCE_EXTERNAL_2); }





    推荐阅读