前提:
最近在用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