esp8266控制gpio2

前提:

最近在用esp8266控制42步进电机做智能窗帘,想找个gpio输出PWM信号

问题

gpio0可以直接使用GPIO_OUTPUT_SET函数控制,但是gpio2却死活不工作

原因

gpio2本来是作为TXD1来用的,
现在想用来控制作为通用gpio
需要先选择其功能为通用gpio

解决方案

添加初始化代码

 gpio_init();
 PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U,FUNC_GPIO2);

定义在eagle_soc.h中
#define PERIPHS_IO_MUX_GPIO2_U (PERIPHS_IO_MUX + 0x38)
#define FUNC_GPIO2 0
#define FUNC_U1TXD_BK 2
#define FUNC_U0TXD_BK 4
也就是需要选定gpio2为gpio功能后,方可使用此gpio
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);//拉高
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);//拉低
需要注意,此gpio默认要拉高启动,不然系统不能正常启动。
所以,接LED的话需要接LED的负极,LED的正极接VCC

代码

user_init(){
     gpio_init();//初始化GPIO
     PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U,FUNC_GPIO2);//蓝灯
     os_timer_disarm(&blue_led_timer);
     os_timer_setfn(&blue_led_timer, (os_timer_func_t *) blue_led_timer_toggle,NULL);//定时回调函数
     os_timer_arm(&blue_led_timer, 1000, true);//设置时间为1s
}

 /**
  * LED定时反转函数,1s状态反转一次
  */
 static void ICACHE_FLASH_ATTR
 blue_led_timer_toggle(void){
     os_timer_disarm(&blue_led_timer);//取消定时器
     uint32 status = GPIO_INPUT_GET(GPIO_ID_PIN(2));//获取蓝灯管脚状态
     GPIO_OUTPUT_SET(GPIO_ID_PIN(2),!status);//取反实现蓝灯管脚电平反转,从而实现亮灭操作
     os_timer_arm(&blue_led_timer, 1000, true);//使能定时器
 }
 此code引用来自:https://www.cnblogs.com/imliubo/p/10090874.html

你可能感兴趣的:(ESP8266)