SAME70 считывает полярность внешнего прерывания в ISR

#c #microchip #isr #asf

Вопрос:

В настоящее время я работаю над платой SAME70, изготовленной Atmel. Я подключил к нему плату расширения OLED1 (тоже Atmel) на порту EXT1. Моя цель-восстановить информацию о типе прерывания (падение или повышение), когда я нажимаю кнопку 3 на плате OLED1. У меня есть функция, которая позволяет мне устанавливать различные регистры, связанные с прерываниями. Но, к сожалению, регистр, указывающий полярность (FLHSR), всегда остается на 0, независимо от состояния кнопки. Ниже моего кода.

 #include <asf.h>

void set_Interupt_Pin()
{
    uint32_t mask = 1 << 19;  /*bitmasking*/
    PIOA->PIO_IER = mask;    /*enable interruptions*/
    PIOA->PIO_AIMER = mask;  /*add new interruption*/
    PIOA->PIO_ESR = mask;     /*set interrupt source on edge*/
    PIOA->PIO_REHLSR = mask; /* set interrupt to rising edge*/
    PIOA->PIO_FELLSR= mask; /* set interrupt to falling edge*/
    NVIC_DisableIRQ(ID_PIOA);
    NVIC_ClearPendingIRQ(ID_PIOA);
    NVIC_EnableIRQ(ID_PIOA);   /*set NVIC to get interruptions from PIOA*/
    NVIC_SetPriority(ID_PIOA, 4); /*priority 4*/
    
}

void PIOA_Handler(void)
{
    printf("FRLHSR: %xn",PIOA->PIO_FRLHSR); /*state of polarity event */
    printf("ISR: %xn",PIOA->PIO_ISR); 
    printf("ELSR: %xn",PIOA->PIO_ELSR); 
    printf("AIMMR: %xn",PIOA->PIO_AIMMR); 
}

int main(void)
{
    const usart_serial_options_t usart_serial_options = {
        .baudrate     = CONF_UART_BAUDRATE,
        .charlength   = CONF_UART_CHAR_LENGTH,
        .paritytype   = CONF_UART_PARITY,
        .stopbits     = CONF_UART_STOP_BITS
    };
    sysclk_init();
    board_init();
    stdio_serial_init(CONF_UART, amp;usart_serial_options);
    set_Interupt_Pin();
    while(1){}
}
 

Вы можете увидеть здесь результат печати, когда я нажимаю кнопку (первая часть) и отпускаю кнопку (вторая часть).

терминал, когда я нажимаю кнопку С уважением

Комментарии:

1. Читайте о разоблачении

2. Я дико гадаю здесь, не намереваясь обидеть. Если вы попытаетесь выяснить полярность возникшего прерывания, я чувствую, что вы сделали это наоборот. Я ожидаю настроить порты таким образом, как «Я хочу, чтобы прерывание срабатывало при превышении входного напряжения. В этом случае мне нужен триггер, когда есть восходящий/нисходящий край». Т. е. вы настраиваете то, что вам нужно. Если вы, например, настроили падающий край и произошло прерывание, то вы знаете, что он падал. Ваше описание я прочитал (и, возможно, это моя ошибка), как будто вы ожидаете ISR на любом краю, а затем пытаетесь выяснить.

3. «любое ребро» — это возможная конфигурация на многих портах, с которыми я работал, но тогда информация недоступна, вы только узнаете, что есть «любое ребро». Если вы всегда читаете 0, то это может быть не информация о времени выполнения на границе, которая произошла, а вместо этого то, что вы настроили (или по умолчанию), возможно, 0 означает падение. Если вы напишете (не прочитаете) там 1, то сработает восходящее ребро. Или, конечно, наоборот. Если я буду рядом, дай мне знать. Если мы с этим разберемся, я превращу это в ответ. В противном случае (если я отключусь) Я удаляю свои отвлекающие комментарии.

4. Спасибо за ваш ответ, вы абсолютно правы в том, что я собираюсь сделать. Я действительно пытался настроить interupt на любом краю, используя регистр ESR, и в моей таблице данных платы явно указано, что в этом режиме нельзя считывать полярность, и поэтому вместо этого я пытаюсь свести регистр REHLSR и FELLSR к одному. Если я правильно понимаю то, что вы предлагаете, FRLHSR, возможно, не является регистром времени выполнения, и я не могу действовать таким образом. Знаете ли вы, есть ли способ сначала убедиться в этом, и если это так, восстановить полярность любым другим способом ?

5. Я предполагаю, что у меня нет руководства. Попробуйте выяснить, можете ли вы настроить ДВЕ процедуры прерывания, одну для подъема, другую для падения. Тогда в каждом раунте вы всегда знаете, что произошло. Но имейте в виду, что это не означает, что после повышения края во время соответствующего ISR порт высок. Я ожидаю, что 10 быстрых чередующихся ребер (подпрыгивающих, как уже упоминалось 0) могут вызвать только гораздо меньшее количество ISR обоих видов — и даже не попарно. Пожалуйста, позвольте мне упомянуть meta.stackexchange.com/questions/66377/what-is-the-xy-problem То есть, пожалуйста, сделайте шаг назад и подумайте о своей цели.