這是一個關於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的源文件