微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > + 用户定义按键的使用

+ 用户定义按键的使用

时间:10-02 整理:3721RD 点击:
在调试开发板程序时,发现自己的知识不足,没有办法直接去调试自己的项目,无意中发现开发板上有一个用户定义的按键,就在这里测试一下程序。
首先是原理图:


这里的AIR KISS是错误的,实际上下面的按键的功能为BOOT/AIR KISS,和开发板上印刷的是相符合的。
上面的按键在开发板上印刷的是USER DEFINED。
其次是程序:
1.  按键处理函数

  1. <div>void ICACHE_FLASH_ATTR </div><div>user_key_poll_down_task(void *pvParameters)
  2. {
  3.         et_uint32 value;
  4.         et_uint32 time = 0;
  5.         et_uint32 user_key_up_flag = 1;
  6.         et_uint32 user_key_down_flag = 1;       
  7.         os_printf("run start!\n");
  8.         while((user_key_up_flag || user_key_down_flag) && time<200)
  9.         {
  10.                 value = gpio16_input_get();
  11.                 os_printf("value = %d\n", value);
  12.                 if(!value)
  13.                 {
  14.                         delay_ms(100);
  15.                         value = gpio16_input_get();
  16.                         if(!value)
  17.                         {
  18.                                 os_printf("key down\n");
  19.                                 OLED_clear();
  20.                                 OLED_show_chn(16, 2, 24);   
  21.                                 OLED_show_chn(32, 2, 25);  
  22.                                 OLED_show_chn(48, 2, 26);   
  23.                                 OLED_show_chn(64, 2, 27);
  24.                                 user_key_up_flag = 0;
  25.                         }
  26.                         delay_ms(500);
  27.                
  28.                         value = gpio16_input_get();
  29.                         if(value)
  30.                         {
  31.                                 delay_ms(100);
  32.                                 value = gpio16_input_get();
  33.                                 if(value)
  34.                                 {
  35.                                         os_printf("key up\n");
  36.                                         OLED_clear();
  37.                                         OLED_show_chn(16, 2, 24);   
  38.                                         OLED_show_chn(32, 2, 25);  
  39.                                         OLED_show_chn(48, 2, 28);   
  40.                                         OLED_show_chn(64, 2, 29);
  41.                                         user_key_down_flag = 0;
  42.                                 }
  43.                         }
  44.                        
  45.                 }
  46.                
  47.                 time++;
  48.         }
  49.         os_printf("run over!\n");
  50.         vTaskDelete(NULL);
  51. }
  52. </div>

复制代码

2.主函数中添加的部分(添加在et_user_app.c : et_user_main中)

  1. gpio16_input_conf();
  2.         xTaskCreate(user_key_poll_down_task, "user defined", 256, NULL, 3, NULL);

复制代码

3.有关GPIO16的配置
关于GPIO16,我本来以为在GPIO.h中没有它的定义是工程师忘记了,后来自己定义上之后发现没用。
在请教了小e的技术支持后发现GPIO16有自己独特的函数。


  1. void ICACHE_FLASH_ATTR
  2. gpio16_output_conf(void)
  3. {
  4.     WRITE_PERI_REG(PAD_XPD_DCDC_CONF,
  5.                    (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | (uint32)0x1);         // mux configuration for XPD_DCDC to output rtc_gpio0

  6.     WRITE_PERI_REG(RTC_GPIO_CONF,
  7.                    (READ_PERI_REG(RTC_GPIO_CONF) & (uint32)0xfffffffe) | (uint32)0x0);        //mux configuration for out enable

  8.     WRITE_PERI_REG(RTC_GPIO_ENABLE,
  9.                    (READ_PERI_REG(RTC_GPIO_ENABLE) & (uint32)0xfffffffe) | (uint32)0x1);        //out enable
  10. }

  11. void ICACHE_FLASH_ATTR
  12. gpio16_output_set(uint8 value)
  13. {
  14.     WRITE_PERI_REG(RTC_GPIO_OUT,
  15.                    (READ_PERI_REG(RTC_GPIO_OUT) & (uint32)0xfffffffe) | (uint32)(value & 1));
  16. }

  17. void ICACHE_FLASH_ATTR
  18. gpio16_input_conf(void)
  19. {
  20.     WRITE_PERI_REG(PAD_XPD_DCDC_CONF,
  21.                    (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | (uint32)0x1);         // mux configuration for XPD_DCDC and rtc_gpio0 connection

  22.     WRITE_PERI_REG(RTC_GPIO_CONF,
  23.                    (READ_PERI_REG(RTC_GPIO_CONF) & (uint32)0xfffffffe) | (uint32)0x0);        //mux configuration for out enable

  24.     WRITE_PERI_REG(RTC_GPIO_ENABLE,
  25.                    READ_PERI_REG(RTC_GPIO_ENABLE) & (uint32)0xfffffffe);        //out disable
  26. }

  27. uint8 ICACHE_FLASH_ATTR
  28. gpio16_input_get(void)
  29. {
  30.     return (uint8)(READ_PERI_REG(RTC_GPIO_IN_DATA) & 1);
  31. }

复制代码


最后是演示


下面是串口输出相关的数据:


这里由于我技术有限,实在是没有找到程序最终是在哪个循环中运行的,所以没有办法把按键检测的程序放在主循环中,智能在上电后出现串口的标志后的哪一段时间才有效。

小编,不错哦,已经开始尝试接口分析了,期待小编的新帖。

已经不错了, 万里长城第一步

不错,不错,做到这里很强了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top