AXI GPIO は PS 側の AXI 4-Lite インターフェースを GPIO インターフェースに変換でき、単一ポートまたは双ポートに構成でき、各チャネルのビット幅を独立して設定できます。
三態ゲートを有効にすることで、ポートを動的に入力または出力に設定できます。
AXIGPIO は ZYNQ PL 側の IP コアで、AXI-Lite マスターを GPIO に変換でき、1 つの AXI-Lite インターフェースは AXI インターコネクト モジュールを介して複数の AXI-GPIO を制御できます。
AXI-GPIO IP 設定#
最大クロック周波数#
$Zynq 7020$ の最大周波数は $Artix 7-2$ の速度と同じで、$140 MHz$ です。
AXI GPIO 設定#
デフォルトでは単一チャネルです。GPIO の方向はここで設定された後、vitis で GPIO の方向を再設定することはできません。
割り込みは PL から PS への割り込みであり、ZYNQ 7 プロセッシング システムでチェックを入れる必要があります。
生成された vitis のコードでは、xparameters.h
の id はデフォルトで ID 0 から始まり、vivado 側の AXI-GPIO の番号が 0 から始まるか 1 から始まるかに関係なくなります。
[!note]
- GPIO はチャネル全体の割り込みを有効にすることしかできず、チャネル内の特定のピンの割り込みを個別に有効にすることはできません。
割り込みタイプは立ち上がりエッジまたは高電平にのみ設定できます。
AXI-GPIO 関連コード#
初期化#
/****************************************************************************/
/**
* 呼び出し元から提供された XGpio インスタンスを
* 指定された構成データに基づいて初期化します。
*
* InstancePtr を初期化する以外は何も行いません。
*
* @param InstancePtr は XGpio インスタンスへのポインタです。このポインタが参照するメモリは
* 呼び出し元によって事前に割り当てられている必要があります。XGpio API を介してドライバを操作するためのさらなる
* 呼び出しはこのポインタを使用して行う必要があります。
* @param Config は特定の GPIO デバイスに関する情報を含む構造体への参照です。この関数は
* Config の内容によって指定された特定のデバイスのために InstancePtr オブジェクトを初期化します。この関数は
* 各呼び出しで異なる Config 情報を与えることによって複数のインスタンスオブジェクトを初期化できます。
* @param EffectiveAddr は仮想メモリアドレス空間内のデバイスベースアドレスです。呼び出し元はこの関数が呼び出された後、EffectiveAddr からデバイス物理ベースアドレスへのアドレスマッピングを
* 変更しない責任があります。この関数が呼び出された後にアドレスマッピングが変更されると、予期しないエラーが発生する可能性があります。アドレス変換が使用されない場合は、
* このパラメータに Config->BaseAddress を使用し、物理アドレスを渡します。
*
* @return
* - XST_SUCCESS 初期化が成功した場合。
*
* @note なし。
*
*****************************************************************************/
int XGpio_CfgInitialize(XGpio * InstancePtr, XGpio_Config * Config,
UINTPTR EffectiveAddr)
入出力方向の設定#
/****************************************************************************/
/**
* 指定された GPIO チャネルのすべてのディスクリート信号の入出力方向を設定します。
*
* @param InstancePtr は操作対象の XGpio インスタンスへのポインタです。
* @param Channel は操作対象の GPIO のチャネル (1 または 2) を含みます。
* @param DirectionMask はどのディスクリートが入力でどれが出力であるかを指定するビットマスクです。0 に設定されたビットは出力で、1 に設定されたビットは入力です。
*
* @return なし。
*
* @note この関数が 1 以外のチャネルで使用される場合、ハードウェアはデュアルチャネル用に構築されている必要があります。そうでない場合、この
* 関数はアサートします。
*
*****************************************************************************/
void XGpio_SetDataDirection(XGpio *InstancePtr, unsigned Channel, u32 DirectionMask)
GPIO 読み書き#
/****************************************************************************/
/**
* 指定された GPIO チャネルのディスクリートの状態を読み取ります。
* @param InstancePtr は操作対象の XGpio インスタンスへのポインタです。
* @param Channel は操作対象の GPIO のチャネル (1 または 2) を含みます。
* @return ディスクリートレジスタの現在のコピー。
* @note この関数が 1 以外のチャネルで使用される場合、ハードウェアはデュアルチャネル用に構築されている必要があります。そうでない場合、この
* 関数はアサートします。
*****************************************************************************/
u32 XGpio_DiscreteRead(XGpio * InstancePtr, unsigned Channel)
/****************************************************************************/
/**
* 指定された GPIO チャネルのディスクリートレジスタに書き込みます。
*
* @param InstancePtr は操作対象の XGpio インスタンスへのポインタです。
* @param Channel は操作対象の GPIO のチャネル (1 または 2) を含みます。
* @param Mask はディスクリートレジスタに書き込む値です。
*
* @return なし。
*
* @note この関数が 1 以外のチャネルで使用される場合、ハードウェアはデュアルチャネル用に構築されている必要があります。そうでない場合、この
* 関数はアサートします。XGpio_DiscreteSet() および
* XGpio_DiscreteClear() も参照してください。
*
*****************************************************************************/
void XGpio_DiscreteWrite(XGpio * InstancePtr, unsigned Channel, u32 Mask)