2. Uso de M601 GPIO

1 estructura de datos y API relacionados con GPIO


La estructura de datos y la API introducidas en este artículo pueden hacer referencia al archivo zyf_gpio.h en el SDK


1.1 enumeración de pines GPIO


typedef enum { PINNAME_WAKE_IN = 0, PINNAME_AP_READY, PINNAME_W_DISABLE, PINNAME_NET_MODE, PINNAME_NET_STATUS, PINNAME_SD_INS_DET, PINNAME_PCM_IN, PINNAME_PCM_OUT, PINNAME_PCM_SYNC, PINNAME_PCM_CLK, PINNAME_SDC2_DATA3, PINNAME_SDC2_DATA2, PINNAME_SDC2_DATA1, PINNAME_SDC2_DATA0, PINNAME_SDC2_CMD, PINNAME_SPI_CS_N, PINNAME_SPI_MOSI, PINNAME_SPI_MISO, PINNAME_SPI_CLK, PINNAME_I2C_SCL, PINNAME_I2C_SDA, PINNAME_STATUS, PINNAME_RI , PINNAME_DCD, PINNAME_CTS, PINNAME_RTS, PINNAME_DTR,



























PINNAME_MAX
} Enum_PinName;
Estos pines se pueden usar como GPIO ordinario, además, también se pueden reutilizar para otras funciones. Cuando se usa como un GPIO normal, consulte la introducción de la API en este artículo para la configuración. Si se utiliza como función de reutilización, consulte el documento correspondiente para la configuración.

1.2 enumeración de la configuración GPIO


Enum_PinDirection configura si la dirección de GPIO es entrada o salida. Cuando se configura como salida, se puede usar para control, como LED, y configurada como entrada, se puede usar para detección, como detección de interrupciones.
typedef enum { PINDIRECTION_IN = 0, PINDIRECTION_OUT = 1 } Enum_PinDirection; Al configurar Enum_PinDirection a PINDIRECTION_OUT o 1, Enum_PinPullSel no necesita preocuparse, solo debemos preocuparnos por el siguiente Enum_PinLevel. Cuando se configura como bajo, GPIO genera un nivel bajo; cuando se configura como alto, GPIO genera un nivel alto. typedef enum { PINLEVEL_LOW = 0, PINLEVEL_HIGH = 1 } Enum_PinLevel; Al configurar Enum_PinDirection a PINDIRECTION_IN o 0, Enum_PinLevel no necesita preocuparse, solo debemos preocuparnos por el siguiente Enum_PinPullSel. Cuando se configura como 0, la selección pull está deshabilitada; cuando se configura como 1, es una entrada desplegable; cuando se configura como 2, es una entrada pull-up. El GPIO en este momento no tiene capacidad de control de salida porque se ingresa la dirección configurada. typedef enum { PINPULLSEL_DISABLE = 0, // Deshabilitar la selección de extracción PINPULLSEL_PULLDOWN = 1, // Pull-down PINPULLSEL_PULLUP = 2 // Pull-up













} Enum_PinPullSel;

 

1.3 API relacionada con GPIO


1.3.1 ZYF_GpioInit
  Esta función habilita la función GPIO del pin especificado e inicializa la configuración, incluyendo dirección, nivel y selección de extracción
Función prototipo
int32_t ZYF_GpioInit (Enum_PinName pinName,
  Enum_PinDirection dir,
  Enum_PinLevel nivel,
  Enum_PinPullSel pullSel
);

· Parámetro
pinName: consulte 1.1 Directorio de enumeración de pines GPIO
: consulte 1.2
Nivel de enumeración de configuración GPIO : consulte 1.2 Enumeración de configuración GPIO
pullSel: consulte 1.2 Enumeración de configuración GPIO
· Valor
devuelto ZYF_RET_OK, esta función tiene éxito
ZYF_RET_ERR_NOSUPPORTPIN, la entrada GPIO no es válida
ZYUBF_RET_ERR_CRIBALREAD, GPIO se está utilizando en otros lugares. Por ejemplo, este GPIO se ha utilizado como EINT


1.3.2 ZYF_GpioSetLevel
  Esta función se utiliza para establecer el nivel del GPIO especificado
· Prototipo de función
int32_t ZYF_GpioSetLevel (Enum_PinName pinName, Enum_PinLevel nivel);
· Parámetro
pinName: consulte 1.1
Nivel de enumeración de pines GPIO : consulte 1.2 Enumeración de configuración GPIO
· Valor de retorno
ZYF_RET_OK, esta función tiene éxito
ZYF_RET_ERR_NOSUPPORTPIN, la entrada GPIO no es válida
ZYF_RET_ERR_NORIGHTOPERATE, no se puede operar, puede ser que GPIO no esté inicializado
ZYF_RET_ERR_NOGPIOMODE, la entrada GPIO no está en modo GPIO


1.3.3 ZYF_GpioGetLevel
Esta función se utiliza para obtener el estado del nivel del GPIO especificado.
· Prototipo de función
int32_t ZYF_GpioGetLevel (Enum_PinName pinName);
· Parámetro
pinName: consulte 1.1 enumeración de pines GPIO

· Valor devuelto

El valor de nivel del GPIO especificado, es decir, un número entero no negativo
ZYF_RET_ERR_NOSUPPORTPIN, que indica que el GPIO de entrada no es válido

1.3.4 ZYF_GpioSetDirection
Esta función se utiliza para establecer la dirección
del GPIO especificado · Prototipo de función
int32_t ZYF_GpioSetDirection (Enum_PinName pinName, Enum_PinDirection dir);
· Parámetro
pinName: consulte 1.1 GPIO enumeración de pines
dir: consulte 1.2 Configuración GPIO ZY significa enumeraciónF_RE
· Valor de retorno
ZY significa enumeración Esta función tuvo éxito.
ZYF_RET_ERR_NOSUPPORTPIN, la entrada GPIO no es válida.
ZYF_RET_ERR_NORIGHTOPERATE, no puede operar, es posible que el GPIO no esté inicializado
ZYF_RET_ERR_NOGPIOMODE, el GPIO de entrada no esté en modo GPIO

1.3.5 ZYF_GpioGetDirection
Esta función se utiliza para obtener la dirección
del GPIO especificado · Prototipo de función
int32_t ZYF_GpioGetDirection (Enum_PinName pinName);
· Parámetro
pinName: consulte 1.1 Enumeración de pines GPIO
· Valor de retorno
Especifique la dirección del GPIO, es decir, un entero no negativo_RETP_IN
, entrada_ZYERRIO GPIO no es válido.
* ZYF_RET_ERR_NORIGHTOPERATE, no puede operar, puede ser que GPIO no esté inicializado
* ZYF_RET_ERR_NOGPIOMODE, la entrada GPIO no está en modo GPIO

1.3.6 ZYF_GpioSetPullSelection
Esta función se utiliza para establecer el GPIO selección de tracción designado
-Función prototipo
int32_t ZYF_GpioSetPullSelection (Enum_PinName pinName, Enum_PinPullSel
pullSel);
* Parámetros
pinName: 1.1 pasadores de referencia GPIO enumeran
pullSel: 1.2 Referencia GPIO configurado enumeración
· valor de retorno
ZYF_RET_OK Indica que esta función es exitosa.
ZYF_RET_ERR_NOSUPPORTPIN, la entrada GPIO no es válida.
ZYF_RET_ERR_NORIGHTOPERATE, no puede operar, es posible que el GPIO no esté inicializado
ZYF_RET_ERR_NOGPIOMODE, el GPIO de entrada no esté en modo GPIO

1.3.7 ZYF_GpioGetPullSelection
Esta función se utiliza para obtener el estado
de extracción del GPIO especificado Función prototipo
int32_t ZYF_GpioGetPullSelection (Enum_PinName pinName);
· Parámetro
pinName: consulte 1.1 Enumeración de pines GPIO
· Valor de retorno
Esta es una selección de extracción de números enteros no negativos.
Si tiene éxito, se devuelve un valor Enum_PinPullSel. De lo contrario, devuelve
ZYF_RET_ERR_NOSUPPORTPIN y la entrada de GPIO no es válida.
ZYF_RET_ERR_NORIGHTOPERATE, no puede operar, es posible que el GPIO no esté inicializado
ZYF_RET_ERR_NOGPIOMODE, el GPIO de entrada no esté en modo GPIO

1.3.8 ZYF_GpioUninit
Esta función se usa para liberar el GPIO especificado. Después del lanzamiento, el GPIO se puede usar para otros propósitos

· Prototipo de función
int32_t ZYF_GpioUninit (Enum_PinName pinName);
· Parámetro
pinName: consulte la enumeración de pin GPIO 1.1
· Valor de retorno
ZYF_RET_OK, esta función es exitosa.
ZYF_RET_ERR_NOSUPPORTPIN, la entrada GPIO no es válida.
ZYF_RET_ERR_BUSSUBBUSY, GPIO no se utiliza como GPIO, utilizado por IIC o SPI, esta función no se puede liberar

2 Introducción a las rutinas GPIO

Este capítulo presenta principalmente cómo usar example_gpio.c en el SDK para probar las funciones GPIO por separado.
Método de compilación:. \ Examples \ build \ corresponde al archivo .bat haciendo doble clic para ejecutarlo o abriéndolo para compilar.
Archivo generado:. \ Out \ directorio correspondiente \ hex \ M601_example _ **. Pac

Use ZYF_GpioInit () para inicializar el GPIO que necesita ser usado. Después de configurarlo como una salida, puede usar ZYF_GpioGetLevel () para obtener el estado del nivel actual y usar ZYF_GpioSetLevel () para establecer el nivel.


#include "zyf_trace.h"
#include "zyf_gpio.h"
#include "zyf_app.h"
#include "zyf_uart.h"
#include "zyf_thread.h"


//fixme:
//rw err: PINNAME_41_I2C_SCL

static Enum_PinName gpiopin[PINNAME_MAX];

static Uart_Param_t g_uart1param;

void UartWriteCallBack(void* Param) // general com
{
    Uart_Param_t *uartparam = (Uart_Param_t *)Param; 
    if(Param == NULL)
    {
        return;
    }    

    ZYF_UartWrite(uartparam->port,(uint8_t *)"UartWrite succeed\r\n",strlen("UartWrite succeed\r\n"));
    ZYF_UartWriteCallbackSwitch(uartparam->port,false);

}

void UartReadCallBack(void* Param) // 
{
    uint32_t recvlen = 0;
    Uart_Param_t *uartparam = (Uart_Param_t *)Param; 

    ZYF_LOG("Uart%d recv",uartparam->port);

    while(ZYF_UartRead(uartparam->port, &(uartparam->uartbuf[recvlen]), 1))
    {
        ZYF_LOG("recv :%02x",uartparam->uartbuf[recvlen]);
        recvlen++;
    }
    ZYF_UartWrite(uartparam->port,uartparam->uartbuf,recvlen);
    ZYF_UartWriteCallbackSwitch(uartparam->port,true);
}


static void AppUartInit(void)
{
    int32_t ret;
    g_uart1param.port = DEBUG_PORT;
    ZYF_UartRegister(g_uart1param.port, UartReadCallBack,&g_uart1param);
    ZYF_UartWriteCbRegister(g_uart1param.port,UartWriteCallBack,&g_uart1param);
    ZYF_UartOpen(g_uart1param.port, 115200, ZYF_FC_NONE);

    ZYF_LOG("AppUartInit");
    return;
}

void ZYF_GpioTest(void)
{
    int i;

    for (i = 0; i < PINNAME_MAX; i ++) {
        ZYF_GpioInit((Enum_PinName)i, PINDIRECTION_OUT, PINLEVEL_LOW, PINPULLSEL_PULLUP);
        ZYF_ThreadSleep(10);
    }

    uint8_t level;
    for (i = 0; i < PINNAME_MAX; i ++) {
        level = ZYF_GpioGetLevel(i);
        ZYF_LOG("read before GPIO:%d => %d", i, level);
        ZYF_ThreadSleep(200);
        ZYF_GpioSetLevel(i, !level);
        ZYF_LOG("write GPIO:%d => %d", i, !level);
        ZYF_ThreadSleep(200);
        level = ZYF_GpioGetLevel(i);
        ZYF_LOG("read after GPIO:%d => %d", i, level);
        ZYF_ThreadSleep(200);
    }

    ZYF_ThreadSleep(1000);
    for (i = 0; i < PINNAME_MAX; i ++) {
        ZYF_GpioUninit(i);
    }
}


void TimeThread_Example(void * Param)
{
    ZYF_MsgQ_t *ptMsg;
    ZYF_AppMsg_t tMsg;
    int iRet = -1;
    ptMsg = ZYF_MsgQCreate(10, sizeof(ZYF_AppMsg_t));
    ZYF_LOG("thread enter!");

    ZYF_GpioTest();
    
    while (1) {
        ZYF_LOG("in while.");
        iRet = ZYF_MsgQGet(ptMsg, (void *)&tMsg);
        if (iRet < 0) {
            ZYF_LOG("Failed to get msg");
            ZYF_ThreadSleep(1000);
        }
    }

}

static void prvInvokeGlobalCtors(void)
{
    extern void (*__init_array_start[])();
    extern void (*__init_array_end[])();

    size_t count = __init_array_end - __init_array_start;
    for (size_t i = 0; i < count; ++i)
        __init_array_start[i]();
}


int appimg_enter(void *param)
{
    AppUartInit();
    ZYF_LOG("application image enter, param 0x%x", param);

    prvInvokeGlobalCtors();

    ZYF_ThreadCreate("UartThread_Example", TimeThread_Example, NULL, ZYF_PRIORITY_HIGH, 10*1024);
    return 0;
}

void appimg_exit(void)
{
    OSI_LOGI(0, "application image exit");
}



 

Supongo que te gusta

Origin blog.csdn.net/w_hizyf_m/article/details/107082544
Recomendado
Clasificación