Попробовал дергать пином при помощи функции gpio SDK, код ниже
Скетч компилируется, но смотрю осциллографом и не вижу импульсов. При этом если использую функции управления пинами Arduino IDE, то импульсы есть, но при указании импульса 50 мкс - по факту выходит импульс 1,16 мс.
Может неправильно инициализирую вывод в формате SDK?
Если управление выводом в формате Arduino, то все работает, типа, код ниже
Код:
#include "gpio.h"
#include "user_interface.h"
#include "hw_timer.h"
#define TIME_PULSE 50
#define MAX_DIMMING_VALUE 255
#define MIN_DIMMING_VALUE 0
#define PWM_PIN 2 //GPIO2
byte tickOccured;
int state = 0;
int period = 10000;
int dimDelay = 0;
int timePause;
volatile byte tarBrightness = 20; //Желаемая яркость 1-100
volatile byte curBrightness = 20; //Текущая яркость
unsigned long lastMillis = 0;
void ICACHE_RAM_ATTR hw_test_timer_cb() {
hw_timer_init(NMI_SOURCE, 0);
curBrightness = tarBrightness;
if (state == 0) {
gpio_output_set(0, (1 << PWM_PIN), 0, 0);
state = 1;
hw_timer_arm(TIME_PULSE);
tickOccured = 0;
}
else if (state == 1) {
// set gpio high
gpio_output_set((1 << PWM_PIN), 0, 0, 0);
state = 2;
hw_timer_arm(timePause);
tickOccured = 1;
}
else if (state == 2) {
gpio_output_set(0, (1 << PWM_PIN), 0, 0);
state = 0;
hw_timer_arm(dimDelay);
tickOccured = 2;
}
}
void ICACHE_FLASH_ATTR user_init(void) {
// init gpio subsytem
gpio_init();
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
// set gpio low
gpio_output_set(0, (1 << PWM_PIN), 0, 0);
hw_timer_init(NMI_SOURCE, 0);
//hw_timer_init(FRC1_SOURCE, 0);
hw_timer_set_func(hw_test_timer_cb);
hw_timer_arm(dimDelay);
} // End of user_init
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println();
Serial.println("");
Serial.println("--------------------------");
Serial.println("ESP8266 Timer Test");
Serial.println("--------------------------");
dimDelay = 39.1 * (MAX_DIMMING_VALUE - curBrightness);
timePause = period - (dimDelay + TIME_PULSE);
user_init();
}
void loop() {
/*
if (tickOccured == true)
{
Serial.println("Tick Occurred = ");
Serial.println(tickOccured);
}*/
dimDelay = 39.1 * (MAX_DIMMING_VALUE - curBrightness);
timePause = period - (dimDelay + TIME_PULSE);
if (millis() - lastMillis > 5000) {
lastMillis = millis();
Serial.print("dimDelay = ");
Serial.println(dimDelay);
Serial.print("timePause = ");
Serial.println(timePause);
}
yield(); // or delay(0);
system_soft_wdt_feed();
} //end loop
Может неправильно инициализирую вывод в формате SDK?
Если управление выводом в формате Arduino, то все работает, типа, код ниже
Код:
#include "user_interface.h"
#include "hw_timer.h"
#define TIME_PULSE 50
#define MAX_DIMMING_VALUE 255
#define MIN_DIMMING_VALUE 0
#define PWM_PIN 2 //GPIO2
byte tickOccured;
int state = 0;
int period = 10000;
int dimDelay = 0;
int timePause;
volatile byte tarBrightness = 30; //Желаемая яркость 1-100
volatile byte curBrightness = 30; //Текущая яркость
unsigned long lastMillis = 0;
void ICACHE_RAM_ATTR hw_test_timer_cb() {
hw_timer_init(NMI_SOURCE, 0);
curBrightness = tarBrightness;
if (state == 0) {
digitalWrite(PWM_PIN, LOW);
state = 1;
hw_timer_arm(TIME_PULSE);
tickOccured = 0;
}
else if (state == 1) {
digitalWrite(PWM_PIN, HIGH);
state = 2;
hw_timer_arm(timePause);
tickOccured = 1;
}
else if (state == 2) {
digitalWrite(PWM_PIN, LOW);
state = 0;
hw_timer_arm(dimDelay);
tickOccured = 2;
}
}
void ICACHE_FLASH_ATTR user_init(void) {
hw_timer_init(NMI_SOURCE, 0);
//hw_timer_init(FRC1_SOURCE, 1);
hw_timer_set_func(hw_test_timer_cb);
hw_timer_arm(dimDelay);
} // End of user_init
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println();
Serial.println("");
Serial.println("--------------------------");
Serial.println("ESP8266 Timer Test");
Serial.println("--------------------------");
pinMode(PWM_PIN, OUTPUT);
digitalWrite(PWM_PIN, LOW);
dimDelay = 39.1 * (MAX_DIMMING_VALUE - curBrightness);
timePause = period - (dimDelay + TIME_PULSE);
user_init();
}
void loop() {
/*
if (tickOccured == true)
{
Serial.println("Tick Occurred = ");
Serial.println(tickOccured);
}*/
dimDelay = 39.1 * (MAX_DIMMING_VALUE - curBrightness);
timePause = period - (dimDelay + TIME_PULSE);
if (millis() - lastMillis > 5000) {
lastMillis = millis();
Serial.print("dimDelay = ");
Serial.println(dimDelay);
Serial.print("timePause = ");
Serial.println(timePause);
}
yield(); // or delay(0);
system_soft_wdt_feed();
} //end loop