NIOS II Eclipse несколько внешних прерываний - PullRequest
0 голосов
/ 04 октября 2018

Я использую Eclipse для написания c-кода для моей реализации NIOS II на MAX10.У меня есть два модуля verilog, которые генерируют импульс, один для обнаружения нарастающего фронта и один на обнаружении падающего фронта.Я просмотрел эти импульсы с помощью осциллографа, и оба генерируют только импульс на краю, который они предназначены для обнаружения.Но я посылаю эти импульсы на два входа PIO на NIOS, которые генерируют IRQ при обнаружении нарастающего фронта этих импульсов.Обнаружение нарастающего фронта генерирует прерывание только на нарастающих фронтах, но обнаружение падающего фронта генерирует прерывание на нарастающих и нарастающих фронтах, даже если они инициализируются в коде таким же образом.Мысли?

static void rise_edge_ISR( void * context)
{
adc_start(MODULAR_ADC_0_SEQUENCER_CSR_BASE);
RISES[edge_occured] = IORD_ALTERA_AVALON_PIO_DATA(RISE_EDGE_TIME_BASE);
edge_occured++;
//Acknowledge the IRQ : Clear the edgecapture register by writing to it 
(individual bit setting is disabled so any write to the edge capture reg 
clears it)
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(RISE_EDGE_DETECTION_BASE, 
RISE_EDGE_DETECTION_BIT_CLEARING_EDGE_REGISTER);
}

static void fall_edge_ISR( void * context)
{
adc_start(MODULAR_ADC_0_SEQUENCER_CSR_BASE);
FALLS[fall_edge_occured] = IORD_ALTERA_AVALON_PIO_DATA(FALL_EDGE_TIME_BASE);
fall_edge_occured++;
//Acknowledge the IRQ : Clear the edgecapture register by writing to it 
(individual bit setting is disabled so any write to the edge capture reg 
clears it)
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(FALL_EDGE_DETECTION_BASE, 
FALL_EDGE_DETECTION_BIT_CLEARING_EDGE_REGISTER);
}

в main ()

alt_ic_isr_register(RISE_EDGE_DETECTION_IRQ_INTERRUPT_CONTROLLER_ID, //alt_u32 ic_id
                    RISE_EDGE_DETECTION_IRQ, //alt_u32 irq
                    rise_edge_ISR, //alt_isr_func isr
                    NULL,
                    NULL);


alt_ic_isr_register(FALL_EDGE_DETECTION_IRQ_INTERRUPT_CONTROLLER_ID, //alt_u32 ic_id
                    FALL_EDGE_DETECTION_IRQ, //alt_u32 irq
                    fall_edge_ISR, //alt_isr_func isr
                    NULL,
                    NULL);

//Setting interrupt mask register to 1 enables interrupts
        IOWR_ALTERA_AVALON_PIO_IRQ_MASK(RISE_EDGE_DETECTION_BASE, 
                                        RISE_EDGE_DETECTION_CAPTURE);

//Setting interrupt mask register to 1 enables interrupts
        IOWR_ALTERA_AVALON_PIO_IRQ_MASK(FALL_EDGE_DETECTION_BASE, 
                                        FALL_EDGE_DETECTION_CAPTURE);
...