Elex_MD 0 18 июня, 2014 Опубликовано 18 июня, 2014 (изменено) · Жалоба Господа, сломал всю голову, перепробывал всё. Не срабатывает прерывание от внешнего сигнала на GPIO. Код прилагаю: static void SetupInt(void) { // Initialize the DSP Interrupt Controller IntDSPINTCInit(); // Enable DSP Interrupts Globally IntGlobalEnable(); } static void ConfigureIntGPIO(void) { // Configure GPIO interrupts for ARM or DSP // Register the ISR in the Interrupt Vector Table IntRegister(C674X_MASK_INT4, GPIOIsr); // Map the system interrupt to the DSP maskable interrupt IntEventMap(C674X_MASK_INT4, SYS_INT_GPIO_B2INT); // Enable DSP maskable interrupt IntEnable(C674X_MASK_INT4); } static void GPIOIsr(void) { /* Disable the interrupts for pins of bank 2 in GPIO.*/ GPIOBankIntDisable(SOC_GPIO_0_REGS, 2); unsigned int res; res = GPIOPinRead(SOC_GPIO_0_REGS, 45); if(res == GPIO_PIN_LOW) GPIOPinWrite(SOC_GPIO_0_REGS, 45, GPIO_PIN_HIGH); else GPIOPinWrite(SOC_GPIO_0_REGS, 45, GPIO_PIN_LOW); // Clear the system interrupt status in the DSPINTC IntEventClear(SYS_INT_GPIO_B2INT); /* Clears the Interrupt Status of GP2[15] in GPIO.*/ GPIOPinIntClear(SOC_GPIO_0_REGS, 48); //GPIOBankIntEnable(SOC_GPIO_0_REGS, 2); } static void SetUpInt(void) { // Setup the ARM or DSP interrupt controller // Initialize DSP interrupt controller IntDSPINTCInit(); // Enable DSP interrupts globally IntGlobalEnable(); } void hardware_init(void) { /* The Local PSC number for GPIO is 3. GPIO belongs to PSC1 module.*/ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); /* Power up the McASP module */ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_MCASP0, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); /* Pin Multiplexing of pin (GP2-10) 10 of GPIO Bank 2.*/ GPIOBank2Pin15PinMuxSetup(); GPIOBank2Pin12PinMuxSetup(); McASPPinMuxSetup(); McASPclk_start(); /* Sets the pin 48(GP2[15]) as input for receive interrupt from external ADC.*/ GPIODirModeSet(SOC_GPIO_0_REGS, 48, GPIO_DIR_INPUT); /* Sets the pin 45(GP2[12]) as output for CLK of external ADC.*/ GPIODirModeSet(SOC_GPIO_0_REGS, 45, GPIO_DIR_OUTPUT); GPIOPinWrite(SOC_GPIO_0_REGS, 45, GPIO_PIN_LOW); /* ** Configure falling edge and falling edge triggers on pin 48 to generate ** an interrupt */ GPIOIntTypeSet(SOC_GPIO_0_REGS, 48, GPIO_INT_TYPE_FALLEDGE); /* Enable interrupts for Bank 2.*/ GPIOBankIntEnable(SOC_GPIO_0_REGS, 2); /* Configuring the AINTC to handle interrupts.*/ SetUpInt(); /* Configure GPIO interrupts */ ConfigureIntGPIO(); // spiInit(); // edmaInit(); } hardware_init вызывается в main.c Прерывание не фиксируется в INTSTAT23 P.S. Pinmux и GPIO работают нормально, так как удается считыать и записывать регистры "GPIO input data" и "GPIO output data" иными словами while(1) { unsigned int res; res = GPIOPinRead(SOC_GPIO_0_REGS, 48); GPIOPinWrite(SOC_GPIO_0_REGS, 45, res); } работает хорошо, но мне нужно через прерывания, которые никак незапускаются( буду признателен, если кто-то выложит рабочий кусок кода, реализующий прерывание от GPIO Изменено 18 июня, 2014 пользователем Elex_MD Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maxis 0 5 сентября, 2014 Опубликовано 5 сентября, 2014 · Жалоба Для дсп ядра. Инклуды из StarterWare. #include "include/gpio.h" #include "include/interrupt.h" /* Set GPIO as input */ GPIODirModeSet(SOC_GPIO_0_REGS, 1, GPIO_DIR_INPUT); GPIODirModeSet(SOC_GPIO_0_REGS, 3, GPIO_DIR_INPUT); GPIODirModeSet(SOC_GPIO_0_REGS, 4, GPIO_DIR_INPUT); GPIODirModeSet(SOC_GPIO_0_REGS, 5, GPIO_DIR_INPUT); GPIODirModeSet(SOC_GPIO_0_REGS, 6, GPIO_DIR_INPUT); /* ** Configure rising edge and falling edge triggers to generate ** an interrupt */ GPIOIntTypeSet(SOC_GPIO_0_REGS, 1, GPIO_INT_TYPE_FALLEDGE); GPIOIntTypeSet(SOC_GPIO_0_REGS, 3, GPIO_INT_TYPE_FALLEDGE); GPIOIntTypeSet(SOC_GPIO_0_REGS, 4, GPIO_INT_TYPE_FALLEDGE); GPIOIntTypeSet(SOC_GPIO_0_REGS, 5, GPIO_INT_TYPE_FALLEDGE); GPIOIntTypeSet(SOC_GPIO_0_REGS, 6, GPIO_INT_TYPE_FALLEDGE); /* Enable interrupts for Bank 0.*/ GPIOBankIntEnable(SOC_GPIO_0_REGS, 0); // Initialize the DSP Interrupt Controller IntDSPINTCInit(); // Register the ISR in the Interrupt Vector Table IntRegister(C674X_MASK_INT4, GPIOIsr); // Map the system interrupt to the DSP maskable interrupt IntEventMap(C674X_MASK_INT4, SYS_INT_GPIO_B0INT); // Enable DSP maskable interrupt IntEnable(C674X_MASK_INT4); void GPIOIsr(void) { GPIOBankIntDisable(SOC_GPIO_0_REGS, 0); IntEventClear(SYS_INT_GPIO_B0INT); GPIOBankIntEnable(SOC_GPIO_0_REGS, 0); //проверка источника прерывания и ваш код } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться