• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Непонятки с настройкой функции пинов.

Johnes

New member
Привет Всем.

Не пинайте сильно, ажели что. Но уже пару дней убил на то, чтобы запустить управление GPIO. У меня имеется esp-12 модуль и SDK 0.9.5. Решил я в нем подергать ножками и столкнулся с проблемой: когда я выбрал для своих игрищь GPIO4, то обнаружил что он у меня просто молчит и не меняет свое состояние.

Код настройки GPIO и сами дрыгалки выглядят так:

PIN_FUNC_SELECT( PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4 );
GPIO_OUTPUT_SET( 4, 0 );

os_intr_lock();
uint16_t count = 100;
while( --count )
{
GPIO_OUTPUT_SET( 4, 1 );
ets_delay_us( 400 );

GPIO_OUTPUT_SET( 4, 0 );
ets_delay_us( 200 );
}
os_intr_unlock();

Попробовал скомпилировать и прошить из примеров blinky - и тоже получил облом: там дергают pin2 раз в секунду, но у меня на пине2 наблюдается сигнал очень похожий на UART, из чего я делаю вывод что пин2 не переключился на работу как GPIO.
Может это у меня модуль какой то не такой? ...... Промучившись так пару дней, мне только лишь удалось подергать pin12.

Может кто-то знает тайное кун-фу? почему не работает как нужно макрос PIN_FUNC_SELECT ?
 

nikolz

Well-known member
Могу лишь посоветовать залить nodeMCU.
На луа все дергается.
 

Andy Korg

Moderator
Команда форума
Посмотрите пожалуйста приведенный ниже код. Он как раз дергает ножками GPIO 4,5, 13.
Код:
/*
* Start project for clock matrix
*/

#include <ets_sys.h>
#include <osapi.h>
#include <os_type.h>
#include <gpio.h>
#include "driver/uart.h"
#include "c_types.h"
#include "eagle_soc.h"

#define DISP_SPI_MOSI         4                        //Display SPI MOSI
#define DISP_SPI_MOSI_MUX    PERIPHS_IO_MUX_GPIO4_U
#define DISP_SPI_MOSI_FUNC    FUNC_GPIO4

#define DISP_SPI_CLK        5                        //Display SPI CLK
#define DISP_SPI_CLK_MUX    PERIPHS_IO_MUX_GPIO5_U
#define DISP_SPI_CLK_FUNC    FUNC_GPIO5

#define DISP_SPI_UPD        13                        //Display SPI update output pins
#define DISP_SPI_UPD_MUX    PERIPHS_IO_MUX_MTCK_U
#define DISP_SPI_UPD_FUNC    FUNC_GPIO13

#define DispClckLow()        GPIO_OUTPUT_SET(DISP_SPI_CLK, 0)
#define DispClckHight()        GPIO_OUTPUT_SET(DISP_SPI_CLK, 1)

#define DispUpdLow()        GPIO_OUTPUT_SET(DISP_SPI_UPD, 0)
#define DispUpdHight()        GPIO_OUTPUT_SET(DISP_SPI_UPD, 1)

#define DELAY 10 /* milliseconds */

LOCAL os_timer_t refreshDisp_timer;
extern int ets_uart_printf(const char *fmt, ...);

LOCAL void out_byte_disp(u8 Value){
    u8 i;

    for (i=0; i<8; i++){
        GPIO_OUTPUT_SET(DISP_SPI_MOSI, Value &1);
        Value >>= 1;
        DispClckLow();
        DispClckHight();
        DispClckLow();
    }
}

LOCAL void ICACHE_FLASH_ATTR refreshDisplay(void *arg)
{
    static i=0;

    DispUpdLow();
    if (i & 1)
        out_byte_disp(0x55);
    else
        out_byte_disp(0xaa);
    i++;
    DispUpdHight();
}

void user_init(void)
{
    PIN_FUNC_SELECT(DISP_SPI_MOSI_MUX, DISP_SPI_MOSI_FUNC);
    PIN_FUNC_SELECT(DISP_SPI_CLK_MUX, DISP_SPI_CLK_FUNC);
    PIN_FUNC_SELECT(DISP_SPI_UPD_MUX, DISP_SPI_UPD_FUNC);
    DispClckLow();
    DispUpdLow();

    // Configure the UART
    uart_init(BIT_RATE_9600,BIT_RATE_9600);
    // Set up a timer to send the message
    // os_timer_disarm(ETSTimer *ptimer)
    os_timer_disarm(&refreshDisp_timer);
    // os_timer_setfn(ETSTimer *ptimer, ETSTimerFunc *pfunction, void *parg)
    os_timer_setfn(&refreshDisp_timer, (os_timer_func_t *)refreshDisplay, (void *)0);
    // void os_timer_arm(ETSTimer *ptimer,uint32_t milliseconds, bool repeat_flag)
    os_timer_arm(&refreshDisp_timer, DELAY, 1);
}
 

nikolz

Well-known member
попробую объяснить еще раз.
Так как у Вас непонятки с железом и софтом, то использование nodeMCU исключает второе.
При этом не надо собирать прошивки и их заливать для отладки теста.
Сам тест управления ногами до безобразия простой
Т е ставите nodeMCU и издеваетесь над железом.
потом начинаете писать свои прошивки.
 

Johnes

New member
Ну т.е. как я понял, из предложеного кода: вроде как тайного кунфу не существует и я делаю также как и все.
Остались теперь только сомнения по поводу железки ...... ок, попробую прошить nodeMCU и в ней уже проверить функциональность.
Еще попробую прошить пример кода предложенный Andy Korg
 

Johnes

New member
Прошил код предложенный Andy Korg, ..... и получается, что в моей плате перепутан пин4 и пин5, а все остальные как положено разведены.

Спасибо всем за помощь и наставления.
 
Сверху Снизу