ESP8266 PWM&GPIO

    这是一个关于ESP8266 PWM一路输出的例子,输出引脚为GPIO2,这个管脚与UART1有冲突,可以到art_config(uint8 uart_no)这个函数里关掉PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK);也可以换个脚位。

#include "gpio.h"
#include "pwm.h"

这是定义的全局变量

ETSTimer pwmTimer;//定时器 pwm
uint32 pwm_duty_init[1]={0};//对应管脚的输出占空比
uint32 pwm_info[1][3]={{PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO2,2}};//设置pwm输出管脚
这是PWM输出函数,使用定时器回调的方式调用这个函数
void ICACHE_FLASH_ATTR
pwm_put(void *arg)//pwm输出
{
	static int32 duty = 0;//pwm占空比
	static bool fla = 0;

	if(fla){
		duty-=50;
		pwm_set_duty(duty,0);
		pwm_start();

	}else{
		duty+=50;
		pwm_set_duty(duty,0);
		pwm_start();
	}
	if(duty>=5000) fla = 1;
	if(duty<=0) fla = 0;
}
这是ESP8266系统初始化完成后的回调函数
void ICACHE_FLASH_ATTR
sys_init_cb(void)//系统初始化完成后回调函数
{
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U,FUNC_GPIO0);//设置输出模式
	gpio_output_set(0,BIT0,BIT0,0);//gpio0输出低电平
//	gpio_output_set(BIT0,0,BIT0,0);//gpio0输出高电平
	//开启pwm功能
	pwm_init(1000,pwm_duty_init,1,pwm_info);
	os_timer_disarm(&pwmTimer);
	os_timer_setfn(&pwmTimer,pwm_put,NULL);
	os_timer_arm(&pwmTimer,50,TRUE);
}
这里是主函数部分
void ICACHE_FLASH_ATTR
user_init(void)
{
	system_init_done_cb(sys_init_cb);//创建初始化完成后回调函数
}
有一点要是注意,需要在APP目录下的Makefile的LINKFLAGS_eagle.app.v6 =  里添加PWM的源文件

ESP8266 PWM&GPIO_第1张图片

源码下载

你可能感兴趣的:(ESP8266)