实验目的:
按下按键,对应LED点亮;释放按键,对应LED熄灭
实验代码:
(1)驱动
1 static uint8_t LEDS[] = LEDS_LIST; //17 18 19 20 2 static uint8_t Btns[] = BUTTONS_LIST;//13 14 15 16 3 4 5 6 void leds_init(void) 7 { 8 nrf_drv_gpiote_out_config_t out_config = GPIOTE_CONFIG_OUT_SIMPLE(true);//配置LED引脚为输出模式 9 for(uint8_t i=0;i<4;i++)//将LED管脚置位 10 { 11 nrf_drv_gpiote_out_init(LEDS[i], &out_config); 12 } 13 } 14 15 16 //传入按键号, 返回按键的索引号,其与LED一一对应 17 static uint8_t button_pin_to_idx(uint8_t pin_num) 18 { 19 uint8_t ret = 0xFF; 20 uint8_t i; 21 for (i = 0; i < 4; ++i) 22 { 23 if (Btns[i] == pin_num) 24 { 25 ret = i; 26 break; 27 } 28 } 29 return ret; 30 } 31 32 33 void button_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action) 34 { 35 switch(pin) //那个管脚产生回调 36 { 37 case BUTTON_1: 38 case BUTTON_2: 39 case BUTTON_3: 40 case BUTTON_4: 41 break; 42 default: 43 break; 44 } 45 46 uint8_t idx = button_pin_to_idx(pin);//读取pin电平状态 47 if(nrf_drv_gpiote_in_is_set(pin))//如果管脚检测是置位,则为高 48 { 49 nrf_gpio_pin_set(LEDS[idx]);//关闭LED 50 } 51 else 52 { 53 nrf_gpio_pin_clear(LEDS[idx]);//点亮LED 54 } 55 } 56 57 58 //GPIOTE功能 59 void button_init(void) 60 { 61 nrf_drv_gpiote_in_config_t btn_config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(true);//输入状态触发 62 btn_config.pull = NRF_GPIO_PIN_PULLUP;//上拉 63 //配置btn引脚为边沿敏感 64 for(uint8_t i=0; i<4; i++) 65 { 66 nrf_drv_gpiote_in_init(Btns[i], &btn_config, button_pin_handler);//引脚号 配置变量 BTN_pin_handler回调函数 67 nrf_drv_gpiote_in_event_enable(Btns[i], true);//中断使能 68 } 69 }
(2)main函数
1 int main(void) 2 { 3 nrf_drv_gpiote_init();//初始化gpioe外设 4 5 button_init(); 6 leds_init(); 7 8 while (true) 9 {} 10 }
(3)gpioe API
1 //nrf_drv_gpiote_init(void);//GPIOE初始化函数 //这个函数是必须在与之相关函数之前初始化 2 //nrf_drv_gpiote_out_init(Leds[i], &out_config);输出引脚配置 3 //nrf_drv_gpiote_in_init(Btns[i], &btn_config, BTN_pin_handler); //输入引脚配置函数 4 //nrf_drv_gpiote_in_event_enable();//使能中断函数 5 //nrf_drv_gpiote_in_is_set();//检查输入引脚电平状态
实验视频:
https://www.bilibili.com/video/BV1ja4y1s78y/