新建工程参考前面两篇帖子。
这里有两种方法使用中断,第一种较为通用,几乎每个引脚都可以做中断,但是精确到一组,在里面要做判断;第二种跟普通mcu中断相似,精确到每个引脚,并且可选择上升沿或下降沿。
第一种方式,仅需三步:一是将需要使用的GPIO设为Input;二是勾选ChangeNotify(如果想要设置默认状态,还可以设置上拉或者下拉);三是在system_interrupt中调用中断函数。 以下为示例,按键为RB12,这里是按下按键接地,低电平,包含长按以及短按处理:
文章图片
文章图片
文章图片
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即可。
文章图片
文章图片
触发函数:
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);
}
推荐阅读
- KEIL下载键变灰色,ST-link无法下载程序
- MCU|【PIC32MZ】Usart串口通讯
- 在STM32F103C8T6上移植UCOS系统
- MCU|【PIC32MZ】开发环境的搭建
- 7路PWM产生程序阅读
- 硬件|单片机mcu—time定时器详解
- stm32影子寄存器、预装载寄存器,TIM_OC1PreloadConfig和TIM_ARRPreloadConfig的作用
- Keil逻辑分析仪的使用