📄 dm6430-digital-interrupt.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 + -