Как-то исторически сложилось, что с PIO я познакомился раньше и, ввиду отсутствия большой разницы между PIO и расширением ESP-IDF, продолжил работать в PIO. К тому же хотелось в этом цикле статей использовать что-то новое — большинство всё-таки работает в расширении ESP-IDF.
Проблема в том, что задача Blink_Taskзаваливает процессор и никак не отпускает его. Можно попробовать добавить задержку void Blink_Task(void *arg) { while (1) { gpio_set_level(LED_GPIO, state); vTaskDelay(pdMS_TO_TICKS(10)); // пусть таска будет опрашивать state каждые 10 мс } }
Также еще может быть проблема с дребезгом контактов Можно прописать простой алгоритм дебаунса
static TickType_t last_toggle = 0;
static void IRAM_ATTR gpio_isr_handler(void *arg) { TickType_t now = xTaskGetTickCountFromISR(); if (now - last_toggle > pdMS_TO_TICKS(50)) { state = !state; last_toggle = now; } }
Тогда можно попробовать прерывания. Настройте оба пина на GPIO_INTR_ANYEDGE и в одном ISR читайте оба уровня. Что-то вроде:
static void IRAM_ATTR gpio_isr_handler(void* arg) { bool bit1 = gpio_get_level(PIN_ONE); bool bit0 = gpio_get_level(PIN_ZERO); if (bit1 && !bit0) { // поймали «1» } else if (!bit1 && bit0) { // поймали «0» } else if (!bit1 && !bit0) { // пауза → конец сообщения } }
Но я все равно не до конца уверен в этой затее с ISR, так как 100кбайт на ядро довольно много. Но если вы не будете задействовать ядро с ISR (Core 0), а все остальные задачи выполнять на Core 1, то может что-то выйдет...
Я хотел в этой статье разобрать очереди, но получилось довольно много информации на прерывании. Я решил, что первую часть следующей статьи я уделю очереди.
Я не сталкивался с таким, но могу предположить несколько вариантов: 1) Проблема действительно в правах доступа
2) Можно попробовать обновится, в терминале VSCode: pio upgrade (либо platformio upgrade) pio update (либо platformio update) Также можно посмотреть список плат в ручную: pio boards ---------------------------------------------------------------------------------- Если жалуется на pio, то можно попробовать установить в ручную Установите pytho, а затем попробуйте: pip install -U platformio Проверьте версию: platformio --version. Если все ок то обновляемся (upgrade и update) и смотрим список плат pio boards (либо platformio boards). Если все ок можно перезапустить VSCode и попробовать снова.
Может проблема не только в программаторе, но и в версиях самой OS и CubeIDE. Я не первый кто сталкивался с такой проблемой из моего круга общения, но и также были люди говорящие, что все сразу прошивается без проблем. У разных людей разные проблемы) В любом случае дискавери и нуклео у меня также шьются без проблем
У меня с STM32CubeProgrammer были проблемы связанные с тем, что он не мог подтянуть обновления из сети, насколько я помню (или что-то подобное). Это, вроде, связанно с санкциями. Репозитории Cube у меня также не устанавливает из сети и приходится под каждую серию камней их качать в ручную.
Поправил!
Спасибо за внимательность!
Хах, прошу прощения) Вика уже уволена
Изначально в этой сценке было больше актеров
Как-то исторически сложилось, что с PIO я познакомился раньше и, ввиду отсутствия большой разницы между PIO и расширением ESP-IDF, продолжил работать в PIO. К тому же хотелось в этом цикле статей использовать что-то новое — большинство всё-таки работает в расширении ESP-IDF.
Добрый день! Спасибо!
Уже есть вторая часть с GPIO и ISR. Также на подходе 3-я статья про очереди.
попробуйте еще дребезг кнопки исправить
Проблема в том, что задача
Blink_Taskзаваливает процессор и никак не отпускает его.Можно попробовать добавить задержку
void Blink_Task(void *arg) {
while (1) {
gpio_set_level(LED_GPIO, state);
vTaskDelay(pdMS_TO_TICKS(10)); // пусть таска будет опрашивать state каждые 10 мс
}
}
Также еще может быть проблема с дребезгом контактов
Можно прописать простой алгоритм дебаунса
static TickType_t last_toggle = 0;
static void IRAM_ATTR gpio_isr_handler(void *arg) {
TickType_t now = xTaskGetTickCountFromISR();
if (now - last_toggle > pdMS_TO_TICKS(50)) {
state = !state;
last_toggle = now;
}
}
Сделаем!
Тогда можно попробовать прерывания. Настройте оба пина на
GPIO_INTR_ANYEDGEи в одном ISR читайте оба уровня. Что-то вроде:static void IRAM_ATTR gpio_isr_handler(void* arg) {
bool bit1 = gpio_get_level(PIN_ONE);
bool bit0 = gpio_get_level(PIN_ZERO);
if (bit1 && !bit0) {
// поймали «1»
} else if (!bit1 && bit0) {
// поймали «0»
} else if (!bit1 && !bit0) {
// пауза → конец сообщения
}
}
Но я все равно не до конца уверен в этой затее с ISR, так как 100кбайт на ядро довольно много. Но если вы не будете задействовать ядро с ISR (Core 0), а все остальные задачи выполнять на Core 1, то может что-то выйдет...
Я хотел в этой статье разобрать очереди, но получилось довольно много информации на прерывании. Я решил, что первую часть следующей статьи я уделю очереди.
Вы правы, что очереди тут будут лучшим вариантом
Окей, посмотрю
Спасибо
Обязательно будет!
Я не сталкивался с таким, но могу предположить несколько вариантов:
1) Проблема действительно в правах доступа
2) Можно попробовать обновится, в терминале VSCode:
pio upgrade (либо platformio upgrade)
pio update (либо platformio update)
Также можно посмотреть список плат в ручную: pio boards
----------------------------------------------------------------------------------
Если жалуется на pio, то можно попробовать установить в ручную
Установите pytho, а затем попробуйте:
pip install -U platformio
Проверьте версию:
platformio --version. Если все ок то обновляемся (upgrade и update) и смотрим список плат pio boards (либо platformio boards). Если все ок можно перезапустить VSCode и попробовать снова.
Если ошибки все еще летят то смотреть логи
Добрый день! После Ваших слов теперь точно буду продолжать)
Добрый день! Спасибо, проверю и исправлю!
Может проблема не только в программаторе, но и в версиях самой OS и CubeIDE. Я не первый кто сталкивался с такой проблемой из моего круга общения, но и также были люди говорящие, что все сразу прошивается без проблем. У разных людей разные проблемы)
В любом случае дискавери и нуклео у меня также шьются без проблем
Попробую также с включенным Outline, спасибо!
У меня с STM32CubeProgrammer были проблемы связанные с тем, что он не мог подтянуть обновления из сети, насколько я помню (или что-то подобное). Это, вроде, связанно с санкциями. Репозитории Cube у меня также не устанавливает из сети и приходится под каждую серию камней их качать в ручную.
Спасибо большое!
Пока не знаком, обязательно изучу
Я согласен, что винда самый лояльный и практичный вариант, но ради обучения и экспериментов это офигенский опыт)
Но я обожаю macOS и Linux и стремлюсь сделать так, чтобы моя разработка не зависела от OS 😊