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