⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dm6430-digital-interrupt.c

📁 rt 6430 采集卡 linux下驱动源代码
💻 C
字号:
/*	FILE NAME: dm6430-digital-interrupt.c	FILE DESCRIPTION:	Example program showing how to use advanced				digital interrupts.	PROJECT NAME: Linux DM6430 Driver, Library, and Example Programs	PROJECT VERSION: (Defined in README.TXT)	Copyright 2004 RTD Embedded Technologies, Inc.  All Rights Reserved.*/#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>#include <dm6430lib.h>#define INTERRUPT_CIRCUIT DM6430HR_INT1int	descriptor;static voidverify_success(int status, const char *message_p) {    if (status == -1) {	perror(message_p);	exit(EXIT_FAILURE);    }}/*static voidprint_status(void) {    int		status;    u_int16_t	status_reg;    status = ReadStatus6430(descriptor, &status_reg);    verify_success(status, "ReadStatus6430() FAILED");    fprintf(stdout, "Status: %x\n", status_reg);}static voidprint_dio_status(void) {    int		status;    u_int8_t	dio_status;    status = DIOReadStatus6430(descriptor, &dio_status);    verify_success(status, "DIOReadStatus6430() failed");    fprintf(stdout, "DIO status: %x\n", dio_status);}*//******************************************************************************Interrupt callbackThis callback routine does the following:    - Prints a message that a digital interrupt occurred.    - Verifies that Digital Status Register indicates an interrupt occurred.    - Verifies that Status Register indicates an interrupt occurred.    - Reads the digital Compare Register to get the digital input value.    - Disables interrupts on interrupt circuit 1.    - Removes the interrupt callback function.    - Disables advanced digital interrupts.    - Exits the program. ******************************************************************************/voidinterrupt_handler(void) {    int		int_flag;    int		status;    u_int8_t	value;    fprintf(stdout, "\n");    fprintf(stdout, "interrupt_handler(): Interrupt occurred.\n");    /*     * Sanity check that both the Digital Status Register and Status Register     * indicate an advanced digital interrupt occurred     */    status = DIOIsChipIrq6430(descriptor, &int_flag);    verify_success(status, "DIOIsChipIrq6430() failed");    if (!int_flag) {	fprintf(	    stderr,	    "FAILURE: Digital Status Register says no interrupt occurred.\n"	);	exit(EXIT_FAILURE);    }    status = IsDigitalIRQ6430(descriptor, &int_flag);    verify_success(status, "IsDigitalIRQ6430() failed");    if (!int_flag) {	fprintf(	    stderr,	    "FAILURE: Status Register says no interrupt occurred.\n"	);	exit(EXIT_FAILURE);    }    /*     * The digital value which caused the interrupt is latched into the     * Compare Register, so read that value     */    status = DIOReadCompareRegister6430(descriptor, &value);    verify_success(status, "DIOReadCompareRegister6430() failed");    fprintf(stdout, "Digital data: %x\n", value);    status = DisableIRQ6430(descriptor, INTERRUPT_CIRCUIT);    verify_success(status, "DisableIRQ6430() FAILED");    status = RemoveIRQHandler6430(descriptor, INTERRUPT_CIRCUIT);    verify_success(status, "RemoveIRQHandler6430() FAILED");    status = DIOEnableIrq6430(descriptor, 0);    verify_success(status, "DIOEnableIrq6430() FAILED");    exit(EXIT_SUCCESS);}/******************************************************************************And now ... the real programThis example program does the following:    - Opens /dev/rtd-dm6430-0.    - Initializes the device.    - Sets the source of interrupts on interrupt circuit 1 to be digital      interrupts.    - Sets digital interrupt mode to "event" so that an interrupt is generated      whenever any port 0 bit changes state.    - Sets all port 0 bits to input.    - Uses the 8 MHz system clock to drive digital sampling.    - Enables advanced digital interrupts.    - Installs a callback function to be invoked whenever an interrupt occurs      on interrupt circuit 1.    - Enables interrupts on interrupt circuit 1.    - Clears the digital interrupt status flag.    - Waits for a single digital interrupt to occur. ******************************************************************************/intmain(void) {    int	status;    int	int_flag;    descriptor = OpenBoard6430(0);    verify_success(descriptor, "OpenBoard6430() FAILED");    status = InitBoard6430(descriptor);    verify_success(status, "InitBoard6430() FAILED");    status = SetIRQ0Source6430(descriptor, IRQS_DIGITAL_6430);    verify_success(status, "SetIRQ0Source6430() FAILED");    status = DIOSelectIrqMode6430(descriptor, DM6430HR_DIO_IRQ_EVENT);    verify_success(status, "DIOSelectIrqMode6430() FAILED");    /*     * Sanity check that board thinks it's in Event Mode     */    status = DIOIsChipIRQEventMode6430(descriptor, &int_flag);    verify_success(status, "DIOIsChipIRQEventMode6430() FAILED");    if (!int_flag) {	fprintf(	    stderr,	    "FAILURE: board says it is not in digital event mode.\n"	);	exit(EXIT_FAILURE);    }    status = DIOSetPort0Direction6430(descriptor, 0x0);    verify_success(status, "DIOSetPort0Direction6430() FAILED");    status = DIOSelectClock6430(descriptor, DM6430HR_CLOCK_TC);    verify_success(status, "DIOSelectClock6430() FAILED");    /*     * Sanity check that board thinks 8 MHz system clock is driving sampling     */    status = DIOIsChipSystemClock6430(descriptor, &int_flag);    verify_success(status, "DIOIsChipSystemClock6430() FAILED");    if (!int_flag) {	fprintf(	    stderr,	    "FAILURE: board says 8 MHz system clock not in use.\n"	);	exit(EXIT_FAILURE);    }    status = DIOEnableIrq6430(descriptor, 1);    verify_success(status, "DIOEnableIrq6430() FAILED");    /*     * Sanity check that board thinks advanced digital interrupts are enabled     */    status = DIOIsChipIRQEnabled6430(descriptor, &int_flag);    verify_success(status, "DIOIsChipIRQEnabled6430() FAILED");    if (!int_flag) {	fprintf(	    stderr,	    "FAILURE: board says digital interrupts are disabled.\n"	);	exit(EXIT_FAILURE);    }    status = InstallCallbackIRQHandler6430(	descriptor,	interrupt_handler,	INTERRUPT_CIRCUIT    );    verify_success(status, "InstallCallbackIRQHandler6430() FAILED");    status = EnableIRQ6430(descriptor, INTERRUPT_CIRCUIT);    verify_success(status, "EnableIRQ6430() FAILED");    status = DIOClearIrq6430(descriptor);    verify_success(status, "DIOClearIrq6430() FAILED");    fprintf(stdout, "Waiting for interrupt.  Hit return to quit ...");    (void) fgetc(stdin);    fprintf(stdout, "\n");    fprintf(stdout, "Quitting at user's request.\n");    exit(EXIT_SUCCESS);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -