ESP8266 RTOS点亮LED与GPIO`PWM相关操作

点亮一个LED灯,因为是功能性代码,所以此文件放在项目文件夹下的Components>user_code
注意自定义目录要在其目录下新建一个component.mk的空文件,并在其目录下新建include用于存放头文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "user_gpio.h"
#include "esp_system.h"
#include "esp_event_loop.h"
#include "esp_log.h"
#include "esp_err.h"

#include "esp8266/gpio_register.h"
#include "esp8266/pin_mux_register.h"
#include "driver/pwm.h"

uint32_t duties = 1000;          //PWM占空比,一个周期内的通电时长
const uint32_t pin_num[1] = {5}; //指定PWM的输出IO口通道,
int16_t phase[1] = {0};          //当多个PWM通道时的相位
//点亮一个LED灯
void user_gpio_init(int GPIO_OUTPUT_IO, int IO_level)
{
#if 1
    gpio_config_t io_conf ;        
    io_conf.pin_bit_mask =((1ULL<<GPIO_OUTPUT_IO) | (1ULL<<GPIO_OUTPUT_IO)),
    io_conf.intr_type =GPIO_INTR_DISABLE; //进制中断
    io_conf.mode = GPIO_MODE_OUTPUT; //输出模式
    io_conf.pull_down_en=0; //禁止下拉
    io_conf.pull_up_en =0; //禁止上拉
    gpio_config(&io_conf);  //配置使能      
#else
 //gpio_pad_select_gpio(GPIO_OUTPUT_IO);//选择一个GPIO 在新的RTOS版本里已没有这个函数
 gpio_set_direction(GPIO_OUTPUT_IO, GPIO_MODE_OUTPUT);//把这个GPIO作为输出 
#endif
gpio_set_level(GPIO_OUTPUT_IO, IO_level);//把这个GPIO输出低电平
}
//这上代码用在后面的WIFI测试
void ATaskLED(void *pvParameters)
{
   
  // TickType_t lasttick = xTaskGetTickCount();
 
     gpio_set_direction(GPIO_NUM_5, GPIO_MODE_OUTPUT);//把这个GPIO作为输出 
     gpio_set_level(GPIO_NUM_5, 0);//把这个GPIO输出低电平  
     os_printf("----LED_open----\n");
      vTaskDelay(1000);
     gpio_set_level(GPIO_NUM_5, 1);//把这个GPIO输出高电平  
      os_printf("----LED_close----\n");
      vTaskDelete(NULL);



}
//pwm设置与其示例
void TaskGpio(void *p)
{
    pwm_init(1000, &duties, 1, pin_num);
    pwm_set_phases(phase);////设置相位:具体有什么用? 访问了解 https://blog.csdn.net/xh870189248/article/details/88526251#PWM_143
    pwm_set_channel_invert(1ULL<< 0);//设置反相低电平有效
    pwm_start(); 
    while (1) {
        
          for (size_t i = 0; i < duties; i++)
          {
            pwm_set_duty(0, i);             //设置PWM亮度
            pwm_start();                     //使修改占空比生效,需要再次开启
            vTaskDelay(10 / portTICK_RATE_MS);
          }
          //设置反
           for (size_t i = duties; i > 0; i--)
          {
            pwm_set_duty(0, i);             //设置PWM亮度
            pwm_start();                     //使修改占空比生效,需要再次开启
            vTaskDelay(10 / portTICK_RATE_MS);
          }
           
    }  
    vTaskDelete(NULL);
}

头文件

#ifndef _USER_GPIO_H_
#define _USER_GPIO_H_

void user_gpio_init(int GPIO_OUTPUT_IO, int IO_level);
void ATaskLED(void *pvParameters);
void TaskGpio(void *p);
#endif

主函数内直接调用
xTaskCreate(TaskGpio,"TaskGpio",4*1024,NULL,5,NULL);

猜你喜欢

转载自www.cnblogs.com/praybb/p/12792131.html