Чем заменить?

Добрый день форумчане. Прошу помощи. Требуется заменить в коде для ESP32 оператор digitalWrite(GPIO
, 0) на другой управдяющий оператор, или асемблерную вставку, без разницы.
Для Atmega делал вот так когдато:

byte l;
void setup() {  
DDRD =  B11001111;//1-OUTPUT 0-INPUT
PORTD = B11001111;//1 - HIGH  0 - LOW
l=bitRead(PIND,4);
PORTD &= ~(1<<7);  delay(500);      PORTD  |= 1<<7;
}
void loop() {}

Как такое исполнить для ESP32 ? Заранее благодарю за подсказку.

Читал?

я так полагаю ему надо в среде ардуино иде, а не Espressif-IDE.

Совсем на любой (delay, например)?

1 лайк

мне вот в лом, ставить ядро ESP32 для ардуино и смотреть как там реализован digitalWrite.

Зачем?..

ну да…

Читал. Но для Arduino IDE данный урок не работает. При этом опять всё на функциях и библиотеках.

Я с esp32 вообще не работало еще. Даже 8266 имеется, но всё как-то без надобности.

GPIOA->BSRR = GPIO_Pin_0; // 1 на portA pin0
GPIOA->BSRR = (uint32_t)GPIO_Pin_0 << 16u; // 0 на portA pin0

ESP32 а не STM32.
или там так же, шота не верится))

А как в ESP32 определены буквы у портов

Извини, протормозил, увидел 32 и…

  1. посмотреть преобразование digitalWrute() в функции IDF можно в ядре ардуино. Выше это уже сделано.
  2. У этой платформы В ПРИНЦИПЕ нет доступа к регистрам. Только через прослойку IDF.
  3. но это и не нужно ни для каких приложений с учетом частоты ESP32, Иначе стоит использовать STM32 который полностью открыт.
1 лайк

Очень жалко. Обнаружил, что ESP32 не возвращается из digitalWrite(), а зависает в ней в каком то непонятном состоянии, выходом из которого тоько выключением питания. Причем функция выполняет действие, но не возвращается из неё.

может ты пишешь в пин который только на ввод можно использовать?

Не использую 34-36,39. В данном случае использую 12 и 27 выводы.

Про доступ к регистрам ESP32 пишут в даташите: esp32_technical_reference_manual.pdf
Для установки и сброса порта попробуйте вот эти макросы:

#define set_port_bit(b) b<=31 ? REG_SET_BIT(GPIO_OUT_REG, (1<<b)) : REG_SET_BIT(GPIO_OUT1_REG, (1<<(b-32)))

#define clr_port_bit(b) b<=31 ? REG_CLR_BIT(GPIO_OUT_REG, (1<<b)) : REG_CLR_BIT(GPIO_OUT1_REG, (1<<(b-32)))

эти макросы, используют в свою очередь макросы REG_SET_BIT(_r, _b) и REG_CLR_BIT(_r, _b) из файла soc.h

использовать, например, так:

set_port_bit(GPIO_NUM_15);       // GPIO_NUM_15=1 
clr_port_bit(GPIO_NUM_15);       // GPIO_NUM_15=0 

так не бывает. Скорее всего ты пишешь несколько потоков. В потоке ОБЯЗАТЕЛЬНО нужно иметь хоть один делей или иной способ возврата управления.
В отличии от Ардуины, где делеи - зло, во ФриРТОС делей необходимость! Это самая частая ошибка при работе с ЕСП32.


я добавлю, что это не менторство, а личный опыт. Привычка писать без делеев меян подводила уже несколько раз. Особенно когда потоков много и в каком-то опросе всратого датчика ты забыл его в бесконечном цикле поставить!!!

Без делея еспшка по собаке бы ребутнулась…