#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 То есть, пожалуйста, сделайте шаг назад и подумайте о своей цели.