在调试 开发板程序时,发现自己的知识不足,没有办法直接去调试自己的项目,无意中发现开发板上有一个用户定义的按键,就在这里测试一下程序。
首先是原理图:
这里的AIR KISS是错误的,实际上下面的按键的功能为BOOT/AIR KISS,和开发板上印刷的是相符合的。
上面的按键在开发板上印刷的是USER DEFINED。
其次是程序:
1. 按键处理函数
void ICACHE_FLASH_ATTR user_key_poll_down_task(void *pvParameters)
- {
- et_uint32 value;
- et_uint32 time = 0;
- et_uint32 user_key_up_flag = 1;
- et_uint32 user_key_down_flag = 1;
- os_printf("run start!!!!!!!!!n");
- while((user_key_up_flag || user_key_down_flag) && time<200)
- {
- value = gpio16_input_get();
- os_printf("value = %dn", value);
- if(!value)
- {
- delay_ms(100);
- value = gpio16_input_get();
- if(!value)
- {
- os_printf("key downn");
- OLED_clear();
- OLED_show_chn(16, 2, 24);
- OLED_show_chn(32, 2, 25);
- OLED_show_chn(48, 2, 26);
- OLED_show_chn(64, 2, 27);
- user_key_up_flag = 0;
- }
- delay_ms(500);
-
- value = gpio16_input_get();
- if(value)
- {
- delay_ms(100);
- value = gpio16_input_get();
- if(value)
- {
- os_printf("key upn");
- OLED_clear();
- OLED_show_chn(16, 2, 24);
- OLED_show_chn(32, 2, 25);
- OLED_show_chn(48, 2, 28);
- OLED_show_chn(64, 2, 29);
- user_key_down_flag = 0;
- }
- }
-
- }
-
- time++;
- }
- os_printf("run over!!!!!!!!!n");
- vTaskDelete(NULL);
- }
复制代码
2.主函数中添加的部分(添加在 et_user_app.c : et_user_main中)
- gpio16_input_conf();
- xTaskCreate(user_key_poll_down_task, "user defined", 256, NULL, 3, NULL);
复制代码
3.有关GPIO16的配置
关于GPIO16,我本来以为在GPIO.h中没有它的定义是工程师忘记了,后来自己定义上之后发现没用。
在请教了小e的技术支持后发现GPIO16有自己独特的函数。
- void ICACHE_FLASH_ATTR
- gpio16_output_conf(void)
- {
- WRITE_PERI_REG(PAD_XPD_DCDC_CONF,
- (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | (uint32)0x1); // mux configuration for XPD_DCDC to output rtc_gpio0
- WRITE_PERI_REG(RTC_GPIO_CONF,
- (READ_PERI_REG(RTC_GPIO_CONF) & (uint32)0xfffffffe) | (uint32)0x0); //mux configuration for out enable
- WRITE_PERI_REG(RTC_GPIO_ENABLE,
- (READ_PERI_REG(RTC_GPIO_ENABLE) & (uint32)0xfffffffe) | (uint32)0x1); //out enable
- }
- void ICACHE_FLASH_ATTR
- gpio16_output_set(uint8 value)
- {
- WRITE_PERI_REG(RTC_GPIO_OUT,
- (READ_PERI_REG(RTC_GPIO_OUT) & (uint32)0xfffffffe) | (uint32)(value & 1));
- }
- void ICACHE_FLASH_ATTR
- gpio16_input_conf(void)
- {
- WRITE_PERI_REG(PAD_XPD_DCDC_CONF,
- (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | (uint32)0x1); // mux configuration for XPD_DCDC and rtc_gpio0 connection
- WRITE_PERI_REG(RTC_GPIO_CONF,
- (READ_PERI_REG(RTC_GPIO_CONF) & (uint32)0xfffffffe) | (uint32)0x0); //mux configuration for out enable
- WRITE_PERI_REG(RTC_GPIO_ENABLE,
- READ_PERI_REG(RTC_GPIO_ENABLE) & (uint32)0xfffffffe); //out disable
- }
- uint8 ICACHE_FLASH_ATTR
- gpio16_input_get(void)
- {
- return (uint8)(READ_PERI_REG(RTC_GPIO_IN_DATA) & 1);
- }
复制代码
最后是演示
下面是串口输出相关的数据:
这里由于我技术有限,实在是没有找到程序最终是在哪个循环中运行的,所以没有办法把按键检测的程序放在主循环中,智能在上电后出现串口的标志后的哪一段时间才有效。
0
|
|
|
|