Как сделать внешнее прерывание в C ++ на Arduino из-за (sam3x8e), используя только регистры? - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь создать прерывания NVIC на Arduino из-за.Мне нужно 4 внешних прерывания от кнопок и у меня проблемы с использованием чего-либо, кроме прерываний NVIC.Во-первых, могу ли я использовать PMC_PCER0 для всех 4 прерываний?Во-вторых, могу ли я сделать несколько прерываний на одном и том же порту?Разрешить ли мне все прерывания всего одним вызовом NVIC (PIOB_IRQn)?Наконец, существуют ли лучшие методы и регистры для внешних прерываний в Arduino (sam3x8e).

void configure_ext_int_1(){
    PMC->PMC_PCER0 |= 1 << ID_PIOB;         // Enable Clock for PIOB -                                           needed for sampling falling edge
    PIOB->PIO_PER = PIO_PB27;             // Enable IO pin control
    PIOB->PIO_ODR = PIO_PB27;             
    PIOB->PIO_PUER = PIO_PB27;            // Enable pull-up
    PIOB->PIO_IFER = PIO_PB27;            /
    PIOB->PIO_DIFSR = PIO_PB27;           // Select Debouncing filter 
    PIOB->PIO_SCDR = 0x4FF;               // Set Debouncing clock divider
    PIOB->PIO_AIMER = PIO_PB27;          
    PIOB->PIO_ESR = PIO_PB27;             
    PIOB->PIO_FELLSR = PIO_PB27;          
   PIOB->PIO_IER = PIO_PB27;          
   NVIC_EnableIRQ(PIOB_IRQn);            
}

1 Ответ

0 голосов
/ 22 мая 2019

Я решил использовать функции asf, доступные для SAM3X8E. Я не уверен, будет ли это работать на всех 4 портах одновременно.

 void enable_NVIC_interrupts(){
 // PORT A NVIC
 pmc_enable_periph_clk(ID_PIOA);
 pio_set_input(PIOA, PIO_PA29, PIO_PULLUP;
 pio_handler_set(PIOA, ID_PIOC, PIO_PA29, PIO_IT_EDGE, int_RINGMODULATOR);
 pio_enable_interrupt(PIOA, PIO_PA29);
 NVIC_EnableIRQ(PIOA_IRQn);

 // PORT B NVIC
 pmc_enable_periph_clk(ID_PIOB);
 pio_set_input(PIOB, PIO_PB25, PIO_PULLUP;
 pio_handler_set(PIOB, ID_PIOB, PIO_PB25, PIO_IT_EDGE, int_TREMOLO);
 pio_enable_interrupt(PIOB, PIO_PB25);
 NVIC_EnableIRQ(PIOB_IRQn);

 // PORT C NVIC
 pmc_enable_periph_clk(ID_PIOC);
 pio_set_input(PIOC, PIO_PC22, PIO_PULLUP;
 pio_handler_set(PIOC, ID_PIOC, PIO_PC22, PIO_IT_EDGE, int_DISTORTION);
 pio_enable_interrupt(PIOC, PIO_PC22);
 NVIC_EnableIRQ(PIOC_IRQn);

 // PORT D NVIC
 pmc_enable_periph_clk(ID_PIOD);
 pio_set_input(PIOD, PIO_PD7, PIO_PULLUP;
 pio_handler_set(PIOD, ID_PIOD, PIO_PD7, PIO_IT_EDGE, int_REVERB);
 pio_enable_interrupt(PIOD, PIO_PD7);
 NVIC_EnableIRQ(PIOD_IRQn);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...