2. M601 GPIOの使用

1 GPIO関連のデータ構造とAPI


この記事で紹介するデータ構造とAPIは、SDKのzyf_gpio.hファイルを参照できます


1.1 GPIOピンの列挙


typedefを列挙{ 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;
これらのピンは通常のGPIOとして使用できるほか、他の機能に再利用することもできます。通常のGPIOとして使用する場合、構成については、この記事のAPIの概要を参照してください。再利用機能として使用する場合は、対応するドキュメントの構成を参照してください

1.2 GPIO構成の列挙


Enum_PinDirectionは、GPIOの方向が入力か出力かを構成します。出力として構成すると、LEDなどの制御に使用でき、入力として構成すると、割り込み検出などの検出に使用できます。
typedef enum { PINDIRECTION_IN = 0、PINDIRECTION_OUT = 1 } Enum_PinDirection; Enum_PinDirectionをPINDIRECTION_OUTまたは1に構成する場合、Enum_PinPullSelを考慮する必要はなく、次のEnum_PinLevelのみを考慮する必要があります。ローに設定すると、GPIOはローレベルを出力し、ハイに設定すると、GPIOはハイレベルを出力します。typedef enum { PINLEVEL_LOW = 0、PINLEVEL_HIGH = 1 } Enum_PinLevel; Enum_PinDirectionをPINDIRECTION_INまたは0に構成する場合、Enum_PinLevelを考慮する必要はなく、次のEnum_PinPullSelのみを考慮する必要があります。0として構成するとプル選択が無効になり、1として構成するとプルダウン入力になり、2として構成するとプルアップ入力になります。構成された方向が入力であるため、この時点のGPIOには出力制御機能がありません。typedef enum { PINPULLSEL_DISABLE = 0、//プル選択を無効にするPINPULLSEL_PULLDOWN = 1、//プルダウンPINPULLSEL_PULLUP = 2 //プルアップ













} Enum_PinPullSel;

 

1.3 GPIO関連のAPI


1.3.1 ZYF_GpioInit
  この関数は、指定されたピンのGPIO機能を有効にし、方向、レベル、プル選択を含む構成を初期化します
。関数プロトタイプ
int32_t ZYF_GpioInit(Enum_PinName pinName、
  Enum_PinDirection dir、
  Enum_PinLevel level、
  Enum_PinPullSel pullSel
);

・パラメータ
pinName:1.1を参照GPIOピン列挙
dir:1.2を参照GPIO構成列挙
レベル:1.2を参照GPIO構成列挙
pullSel:1.2を参照GPIO構成列挙
・戻り値
ZYF_RET_OK、この関数は成功
ZYF_RET_ERR_NOSUPPORTPIN、入力GPIOが無効
ZYF_RET_ERRCRIREADYPINALREADY GPIOは他の場所で使用されています。たとえば、このGPIOはEINTとして使用されています


1.3.2 ZYF_GpioSetLevel
  この関数は、指定されたGPIOのレベルを設定するために使用されます
・関数プロトタイプ
int32_t ZYF_GpioSetLevel(Enum_PinName pinName、Enum_PinLevel level);
・パラメータ
pinName:1.1を参照GPIOピン列挙
レベル:1.2 GPIO構成列挙を参照
・戻り値
ZYF_RET_OK、この関数は
ZYF_RET_ERR_NOSUPPORTPINに成功します。入力GPIOは無効です
。ZYF_RET_ERR_NORIGHTOPERATEは操作できません
。GPIO が初期化されていない可能性があります。ZYF_RET_ERR_NOGPIOMODE、入力GPIOはGPIOモードではありません


1.3.3 ZYF_GpioGetLevel
この関数は、指定されたGPIOのレベルステータスを取得するために使用されます。
・関数プロトタイプ
int32_t ZYF_GpioGetLevel(Enum_PinName pinName);
・パラメータ
pinName:1.1 GPIOピン列挙を参照

・戻り値

指定されたGPIOのレベル値、つまり非負の整数
ZYF_RET_ERR_NOSUPPORTPINで、入力GPIOが無効であることを示します

1.3.4 ZYF_GpioSetDirection
この関数は
指定されたGPIOの方向を設定するために使用されます・関数プロトタイプ
int32_t ZYF_GpioSetDirection(Enum_PinName pinName、Enum_PinDirection dir);
・パラメータ
pinName:1.1を参照GPIOピン列挙
dir:1.2 GPIO構成列挙を参照
・戻り値
ZYF_RETを意味しますこの関数は成功しました。
ZYF_RET_ERR_NOSUPPORTPIN、入力GPIOが無効です。
ZYF_RET_ERR_NORIGHTOPERATE、操作できない、GPIOが初期化されていない可能性があります
ZYF_RET_ERR_NOGPIOMODE、入力GPIOがGPIOモードではありません

1.3.5 ZYF_GpioGetDirection
この関数は
指定されたGPIOの方向を取得するために使用されます・関数プロトタイプ
int32_t ZYF_GpioGetDirection(Enum_PinName pinName);
・パラメータ
pinName:1.1 GPIOピン列挙を参照してください
・戻り値
GPIOの方向、つまり非負の整数を指定してください
* ZYF_PORTP_ERR_ERR_ERR_ERR_ERR_ERR_ERR_ERR_ERR_ERR_ERR GPIOが無効です。
* ZYF_RET_ERR_NORIGHTOPERATE、操作できない、GPIOが初期化されていない可能性があります
* ZYF_RET_ERR_NOGPIOMODE、入力GPIOがGPIOモードではありません

1.3.6 ZYF_GpioSetPullSelection
この関数は、指定されたGPIO選択プル
関数プロトタイプ
int32_t ZYF_GpioSetPullSelection(Enum_PinName pinName、Enum_PinPullSel
pullSel); を設定するために使用されます
*パラメータ
pinName:1.1参照GPIOピンenumerated
pullSel:1.2参照GPIO構成列挙

YRET_ Z_FOK 値を設定します。この関数が成功したことを示します。
ZYF_RET_ERR_NOSUPPORTPIN、入力GPIOが無効です。
ZYF_RET_ERR_NORIGHTOPERATE、操作できない、GPIOが初期化されていない可能性があります
ZYF_RET_ERR_NOGPIOMODE、入力GPIOがGPIOモードではありません

1.3.7 ZYF_GpioGetPullSelection
この関数は
指定されたGPIOのプル状態を取得するために使用されます。関数プロトタイプ
int32_t ZYF_GpioGetPullSelection(Enum_PinName pinName);
・パラメータ
pinName:1.1 GPIOピン列挙を参照してください
・戻り値
これは、負でない整数のプル選択です。
成功すると、Enum_PinPullSel値が返されます。それ以外の場合は、
ZYF_RET_ERR_NOSUPPORTPINを返し、GPIOの入力は無効です。
ZYF_RET_ERR_NORIGHTOPERATE、操作できない、GPIOが初期化されていない可能性があります
ZYF_RET_ERR_NOGPIOMODE、入力GPIOがGPIOモードではありません

1.3.8 ZYF_GpioUninit
この関数は、指定されたGPIOを解放するために使用されます。解放後、GPIOは他の目的に使用できます

・関数プロトタイプ
int32_t ZYF_GpioUninit(Enum_PinName pinName);
・パラメータ
pinName:1.1 GPIOピン列挙を参照してください
・戻り値
ZYF_RET_OK、この関数は成功しました。
ZYF_RET_ERR_NOSUPPORTPIN、入力GPIOが無効です。
ZYF_RET_ERR_BUSSUBBUSY、GPIOとして使用されないGPIO、IICまたはSPIによって使用、この関数は解放できません

2 GPIOルーチンの概要

この章では、主にSDKでexample_gpio.cを使用してGPIO関数を個別にテストする方法を紹介します。
コンパイル方法:。\ examples \ build \は、ダブルクリックして実行するか、ファイルを開いてコンパイルすると、.batファイルに対応します。
生成されたファイル:。\ out \ corresponding directory \ hex \ M601_example _ **。pac

ZYF_GpioInit()を使用して、使用する必要があるGPIOを初期化します。出力として構成した後、ZYF_GpioGetLevel()を使用して現在のレベルのステータスを取得し、ZYF_GpioSetLevel()を使用してレベルを設定できます。


#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");
}



 

おすすめ

転載: blog.csdn.net/w_hizyf_m/article/details/107082544