テストGPIO(EMIO)割り込み割り込みpynq

プラットフォームPYNQ-Z2

機能を実現

ここでpynqとEMIOアクセスボタンボタンIRQ割り込みを達成

ハードウェアEMIO 54ピックbtn0は、入力を介して、GICに、割込み#52をトリガ

ここに画像を挿入説明
SPIによって、割り込み操作や他のCPUレジスタは、トリガを指定したIRQ

ここに画像を挿入説明

ハードウェア設計

ここに画像を挿入説明

btn0にGPIO_0_0_tri_io規律リードのEMIO

制約

set_property -dict { PACKAGE_PIN D19   IOSTANDARD LVCMOS33 } [get_ports { GPIO_0_0_tri_io }]; #IO_L4P_T0_35 Sch=btn[0]

ソフトウェア設計



#include <stdio.h>
#include "platform.h"



#include "xgpiops.h"
#include "xgpiops_hw.h"

#include "XSCUGIC.H"
#include "XSCUGIC_HW.H"

#include "sleep.h"



#define ICCPMR   *(volatile unsigned int *) 0xf8f00104
//printf(" ICCPMR = %0X  @ line = %d \n", ICCPMR ,__LINE__  );
//(__FILE__, __LINE__);

#define GPIO_NO 54

static void GpioHandler(void *CallBackRef, int Bank, u32 Status)
{

	static int  i = 0;

	if (Status ==0 ) return ;
    XGpioPs* pGpioPs=(XGpioPs*)CallBackRef;

    XGpioPs_IntrDisablePin(pGpioPs,GPIO_NO);

    printf("Gpio Handler %d...\n\r",i++);

  //  while (1 == XGpioPs_ReadPin( pGpioPs  ,  GPIO_NO )) ;

    usleep(100*1000);
    XGpioPs_IntrClearPin(pGpioPs,GPIO_NO);
    XGpioPs_IntrEnablePin(pGpioPs,GPIO_NO);



}

int main()

{

    XGpioPs Gpio;

    XGpioPs_Config *ConfigPtr;

    printf(" ICCPMR = %0X  @ line = %d \n", ICCPMR ,__LINE__  );


    ConfigPtr = XGpioPs_LookupConfig(0);
    XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
 //初始化GPIO的输入以及中断。

    XGpioPs_SetDirectionPin(&Gpio,GPIO_NO,0x0);


     XGpioPs_SetIntrTypePin(&Gpio,GPIO_NO,XGPIOPS_IRQ_TYPE_EDGE_RISING);
     XGpioPs_SetCallbackHandler(&Gpio, (void *)&Gpio, GpioHandler);
     XGpioPs_IntrEnablePin(&Gpio,GPIO_NO);


     XScuGic ScuGic;
     XScuGic_Config* pScuGicCfg;
     pScuGicCfg=XScuGic_LookupConfig(XPAR_SCUGIC_SINGLE_DEVICE_ID);
     XScuGic_CfgInitialize(&ScuGic,pScuGicCfg,pScuGicCfg->CpuBaseAddress);

     XScuGic_Connect(&ScuGic, 52,
                    (Xil_ExceptionHandler)XGpioPs_IntrHandler,
                    (void *)&Gpio);

     XScuGic_SetPriorityTriggerType(&ScuGic,52,0xa0,0x01);//优先级阈值f0
     XScuGic_Enable(&ScuGic,52);


     Xil_ExceptionInit();
     Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&ScuGic);
     Xil_ExceptionEnable();

    printf("Intr test: \n\r");

    while(1)
    {

    }

}





結果

ボタン

ここに画像を挿入説明
ICCICR(IC CPU IC REG) - >
ICDDC R(UCディストリビュータC REG) - >

GPIO割り込み機能解析ライブラリ

void XGpioPs_SetCallbackHandler(XGpioPs *InstancePtr, void *CallBackRef,
				 XGpioPs_Handler FuncPointer)

 XGpioPs_SetCallbackHandler(&Gpio, (void *)&Gpio, GpioHandler);

XGpioPs_Handler関数ポインタ

割り込み

周辺ハードウェアデバイスの速度とプロセッサ速度は、ハードウェアにリクエストを送信するためにコアプロセッサを取り、その後、明らかにコア効率が低下し、応答するために特別な方法を待つそうならば、大きさの順に、多くの場合ではありません。

したがって、私たちまでは、必要なときに、これは開閉機構である(カーネルのハードウェアを変更するには、アクティブイニシアチブ)信号を送る再びハードウェアのカーネルのためのメカニズムを提供します。

別の割り込みに対応した異なるデバイスは、それぞれが独自のデジタルIDによる中断します。
例えば、オペレーティング・システムは割込みを区別し、割り込みを生成したハードウェアデバイスを知ることができるように、ハードディスクからの割り込みの割り込みキーボードは異なっています。ハンドラ割り込み異なる別の割り込みを提供するために、このようにして、オペレーティングシステム。

それがプログラムを実行すると、別のイベントがある場合(ユーザーがプログラムを開いているなど)ので、時間によって、あなたがに対処するためのコンピュータシステムの割り込み機構に必要であることを起こります。

ハードウェア割り込みメカニズムを含みます中断手段そして、オペレーティングシステム割り込みサービスルーチン

必要なときに、ハードウェアのカーネルは再び合図してみましょう。

初期のコンピュータシステム割り込みがハードウェア識別コードによって生成呼び出され(割り込みソースの識別、最初の割込みサービス・ルーチンの対応する割り込みサービス・ルーチンのエントリ・アドレスまたは格納アドレスを形成するために使用することができます)割り込みベクタアドレス割り込み変数

割り込みベクタテーブル:テーブル番号と割込みハンドラを対応する割り込みソース・エントリ・アドレスのタイプとの間の接続の割り込み;

_vector_table:
	B	_boot
	B	Undefined
	B	SVCHandler
	B	PrefetchAbortHandler
	B	DataAbortHandler
	NOP	/* Placeholder for address exception vector*/
	B	IRQHandler
	B	FIQHandler

割り込みサービスルーチン:送信割り込み実行されるコードを破ります

編集

IRQHandler:					/* IRQ vector handler */

	stmdb	sp!,{r0-r3,r12,lr}		/* state save from compiled code*/
#if FPU_HARD_FLOAT_ABI_ENABLED
	vpush {d0-d7}
	vpush {d16-d31}
	vmrs r1, FPSCR
	push {r1}
	vmrs r1, FPEXC
	push {r1}
#endif

#ifdef PROFILING
	ldr	r2, =prof_pc
	subs	r3, lr, #0
	str	r3, [r2]
#endif

	bl	IRQInterrupt			/* IRQ vector */

C

/*****************************************************************************/
/**
*
* This is the C level wrapper for the IRQ interrupt called from the vectors.s
* file.
*
* @param	None.
*
* @return	None.
*
* @note		None.
*
******************************************************************************/
void IRQInterrupt(void)
{
	XExc_VectorTable[XIL_EXCEPTION_ID_IRQ_INT].Handler(XExc_VectorTable[
					XIL_EXCEPTION_ID_IRQ_INT].Data);
}

#if !defined (__aarch64__)

ここに画像を挿入説明

ここに画像を挿入説明

ここに画像を挿入説明
ここに画像を挿入説明

REF
https://blog.csdn.net/qq_18077275/article/details/89304215?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

Zynqブレーク

三つのカテゴリーSPI、PPI、96割り込みID番号のSGIの合計に分割源

ブレークは、複数の割り込みハンドラ割り込みハンドラは、次の手順を実行した後、

  • STEP 1、IRQサービス・ルーチンをオンにする割り込みベクタにジャンプする最初。これは、関数に対応します

  • STEP 2は、IRQ(ID番号96)を生成する方法の数十がありますので、我々はIRQ割り込み割り込み番号が起こった起こった、具体的かを知る必要があります。見つかった場合に対応するには、適切なハンドラを呼び出します。

  • ステップに対応する、特定の割り込みID番号を検索STEP 3は、細分化されなければならない再処理することである
    (例えば、118に、52 GPIOは、特定のいずれかを決定するために、割り込みを生成することができます)。ならびに他の適切なプロセス。

公開された452元の記事 ウォンの賞賛271 ビュー730 000 +

おすすめ

転載: blog.csdn.net/qq_35608277/article/details/105073908