#include <stdio.h>
#include "driver/ledc.h"
#include "esp_err.h"
#include "esp_rom_gpio.h"
// ------------------------------------------------------------------------
// ISSUE: When output_invert is enabled, the output will go low for 12.5 us
// after running ledc_timer_config_t
// -----------------------------------------------------------------------
#define LEDC_FREQUENCY (1000) // Frequency in Hertz
#define LEDC_MODE LEDC_LOW_SPEED_MODE
//#define LEDC_MODE LEDC_HIGH_SPEED_MODE
#define LEDC_TIMER LEDC_TIMER_0
#define LEDC_OUTPUT_IO (19) // Define the output GPIO
#define LEDC_CHANNEL LEDC_CHANNEL_0
#define LEDC_DUTY (255) // Set duty to 25%
static void example_ledc_init(void) {
// Prepare and then apply the LEDC PWM timer configuration
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.duty_resolution = LEDC_TIMER_10_BIT,
.timer_num = LEDC_TIMER,
.freq_hz = LEDC_FREQUENCY,
.clk_cfg = LEDC_AUTO_CLK
};
ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));
ESP_ERROR_CHECK(ledc_timer_pause(LEDC_MODE, LEDC_TIMER)); // pause
// Prepare and then apply the LEDC PWM channel configuration
ledc_channel_config_t ledc_channel = {
.gpio_num = LEDC_OUTPUT_IO,
.speed_mode = LEDC_MODE,
.channel = LEDC_CHANNEL,
.intr_type = LEDC_INTR_DISABLE,
.timer_sel = LEDC_TIMER,
.duty = LEDC_DUTY,
.hpoint = 0, // 0xfffff max
.flags = {
.output_invert = 0
}
};
ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
// Set duty to 25% and update
ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, LEDC_DUTY));
ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
}
void setup() {
Serial.begin(115200);
//Serial.println(0x3FF44530 + 19 * 4, HEX);
pinMode(LEDC_OUTPUT_IO, INPUT_PULLUP);
delay(100);
example_ledc_init();
//LEDC_HS_SIG_OUT0_IDX
//void esp_rom_gpio_connect_out_signal(uint32_t gpio_num, uint32_t signal_idx, bool out_inv, bool oen_inv);
//esp_rom_gpio_connect_out_signal(LEDC_OUTPUT_IO, LEDC_HS_SIG_OUT0_IDX, true, false);
//WRITE_PERI_REG(GPIO_FUNCnn_OUT_SEL_CFG_REG, READ_PERI_REG(GPIO_FUNCnn_OUT_SEL_CFG_REG) | GPIO_FUNCnn_OUT_INV_SEL);
// nn=gpio number
uint8_t pin = 19;
REG_WRITE(0x3FF44530 + pin * 4, READ_PERI_REG(0x3FF44530 + pin * 4) | GPIO_FUNC0_OUT_INV_SEL);
//REG_WRITE(0x3FF44530 + pin * 4, READ_PERI_REG(0x3FF44530 + pin * 4) & ~GPIO_FUNC0_OUT_INV_SEL);
//REG_WRITE(GPIO_FUNC19_OUT_SEL_CFG_REG, READ_PERI_REG(GPIO_FUNC19_OUT_SEL_CFG_REG) | GPIO_FUNC19_OUT_INV_SEL);
//WRITE_PERI_REG(GPIO_FUNC19_OUT_SEL_CFG_REG, READ_PERI_REG(GPIO_FUNC19_OUT_SEL_CFG_REG) | GPIO_FUNC19_OUT_INV_SEL);
//WRITE_PERI_REG(I2S_TIMING_REG(0), 0);
ESP_ERROR_CHECK(ledc_timer_resume(LEDC_MODE, LEDC_TIMER)); // resume
}
void loop() {
}