101-SLM130(NB-IOT)C-SDK(OpenCPU)学习开发-GPIO输入检测,中断
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnEC616_SLM130" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
注意带*号的, 开发板标识有误,按照最外围标识为准
说明(一定要看完上一节)
1,BOOT按键连接了GPIO1, 咱就用这个引脚做测试
配置GPIO1为输入模式
#include <stdio.h> #include "app.h" #include "bsp.h" #include "bsp_custom.h" #include "pad_ec616.h" #include "gpio_ec616.h" #define GPIO_PIN_NUMBER (1) //GPIO编号 #define GPIO_PORT (GPIO_PIN_NUMBER/16) //在哪个端口上(P0 / P1 / P2) #define GPIO_PIN (GPIO_PIN_NUMBER%16) //在端口上的编号 #define GPIO_PAD_INDEX (12) //引脚对应的PAD地址, 这个看手册哈 #define GPIO_PAD_ALT_FUNC (PAD_MuxAlt0) //使用其第几功能 void gpio_init(void) { /*配置GPIO的功能*/ pad_config_t padConfig; PAD_GetDefaultConfig(&padConfig); padConfig.mux = GPIO_PAD_ALT_FUNC;//设置使用其第几功能 PAD_SetPinConfig(GPIO_PAD_INDEX, &padConfig);//配置PAD PAD_SetPinPullConfig(GPIO_PAD_INDEX, PAD_InternalPullUp);//设置内部上下拉 /*配置GPIO的输入输出初始化*/ gpio_pin_config_t config; config.pinDirection = GPIO_DirectionInput;//输入模式 GPIO_PinConfig(GPIO_PORT, GPIO_PIN, &config);//配置 } uint32_t value=0; void main_entry(void) { BSP_CommonInit();//官方底层初始化函数,默认写上就可以 BSP_CustomInit();//配置串口打印 gpio_init(); while (1) { value = value+1; if (value>1000000)//延时一会,避免疯狂打印 { value=0; printf("leven=%d\r\n",GPIO_PinRead(GPIO_PORT,GPIO_PIN));//打印引脚电平 } } }
配置GPIO1为中断模式(下降沿触发)
#include <stdio.h> #include "app.h" #include "bsp.h" #include "bsp_custom.h" #include "pad_ec616.h" #include "gpio_ec616.h" #define GPIO_PIN_NUMBER (1) //GPIO编号 #define GPIO_PORT (GPIO_PIN_NUMBER/16) //在哪个端口上(P0 / P1 / P2) #define GPIO_PIN (GPIO_PIN_NUMBER%16) //在端口上的编号 #define GPIO_PAD_INDEX (12) //引脚对应的PAD地址, 这个看手册哈 #define GPIO_PAD_ALT_FUNC (PAD_MuxAlt0) //使用其第几功能 void gpio_init_interrupt(void) { /*配置GPIO的功能*/ pad_config_t padConfig; PAD_GetDefaultConfig(&padConfig); padConfig.mux = GPIO_PAD_ALT_FUNC;//设置使用其第几功能 PAD_SetPinConfig(GPIO_PAD_INDEX, &padConfig);//配置PAD PAD_SetPinPullConfig(GPIO_PAD_INDEX, PAD_InternalPullUp);//设置内部上下拉 /*配置GPIO的输入输出初始化*/ gpio_pin_config_t config; config.pinDirection = GPIO_DirectionInput;//输入模式 config.misc.interruptConfig = GPIO_InterruptFallingEdge;//设置为下降沿中断 GPIO_PinConfig(GPIO_PORT, GPIO_PIN, &config);//配置 } uint8_t gpio_interrupt_flag =0; void gpio_interrupt_fun() { uint16_t portIrqMask = GPIO_SaveAndSetIRQMask(GPIO_PORT);//禁止端口中断防止中断溢出 if (GPIO_GetInterruptFlags(GPIO_PORT) & (1 << GPIO_PIN))//引脚产生中断 { gpio_interrupt_flag=1; GPIO_ClearInterruptFlags(GPIO_PORT, 1 << GPIO_PIN);//清除引脚中断标志 } GPIO_RestoreIRQMask(GPIO_PORT, portIrqMask);//恢复端口中断 } void main_entry(void) { BSP_CommonInit();//官方底层初始化函数,默认写上就可以 BSP_CustomInit();//配置串口打印 gpio_init_interrupt(); //使能GPIO中断(所有的引脚共用一个中断函数) XIC_SetVector(PXIC_Gpio_IRQn, gpio_interrupt_fun);//配置GPIO中断函数 XIC_EnableIRQ(PXIC_Gpio_IRQn);//使能 while (1) { if (gpio_interrupt_flag==1)//检测到中断 { gpio_interrupt_flag=0; printf("gpio_interrupt_flag\r\n"); } } }
每次按下按键就会打印下
程序说明
1,初始引脚的时候设置为下降沿中断
2,设置GPIO中断函数, 检测到中断,打印