Перейти к содержанию
    

прерывание на GPIO

Господа, сломал всю голову, перепробывал всё. Не срабатывает прерывание от внешнего сигнала на 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

Изменено пользователем Elex_MD

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для дсп ядра. Инклуды из 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);
    //проверка источника прерывания и ваш код
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...