Очистка ожидающего прерывания EXTI в stm32f103 - PullRequest
1 голос
/ 01 мая 2020

Я пытаюсь переключить светодиод на ПК13 путем переключения ПК14, проблема в том, что обработчик прерываний продолжает вызываться без переключения ПК14, а ожидающее прерывание не очищается с помощью регистра EXTI-> PR, а также не очищается вручную с помощью отладчик. Я попытался также очистить его в NVI C -> ICPR, я не уверен, почему есть два регистра для очистки одного и того же прерывания.
вот мой код
, и вы можете найти заголовок в https://github.com/AymenSekhri/tinyHAL-STM32f103/tree/master/STM32F103-HAL/tinyHAL

/* 
* Description:
*   Toggle LED at C13 whenever C14 goes from HIGH to LOW.
*
*/
#include "tinyHAL/stm32f103_hal.h"
int main(){
    //Enable AFIO clock from RCC
    enablePeripheralClock(Peripheral_AFIO);
    //Enable and configure C13 & C14
    enablePeripheralClock(Peripheral_GPIOC);
    configureGPIO(Peripheral_GPIOC, 13, GPIO_MODE_OUT_50MHZ, GPIO_CONF_OUT_PUSHPULL);
    configureGPIO(Peripheral_GPIOC, 14, GPIO_MODE_IN, GPIO_CONF_IN_PUSHUP_PULLDOWN);

    //Link EXTI14 to C14
    AFIO->EXTICR[3] = (AFIO->EXTICR[3] & ~(0xF<<8)) | 2;
    //Configure inturrput at EXTI14 falling edge
    EXTI->FTSR      |= 1<<14;
    //Unmask interrupt 40 (EXTI10-15)
    EXTI->IMR       |= 1<<14;
    //Set Priority to interrupt 40 (EXTI10-15)
    NVIC->IP[40]    |= 0x10;

    //Enable interrupt 40 (EXTI10-15)
    NVIC->ISER[40>>5] |= (1 << (40&0x1F));
    while(1);
}

void EXTI15_10_IRQHandler(void){
    toggleGPIOBit(Peripheral_GPIOC, 13);
    if (EXTI->PR & (1 << 14)){
        EXTI->PR |= (1 << 14);
    }
    //NVIC->ICPR[40>>5] |= (1 << (40&0x1F));
    __COMPILER_BARRIER();
}

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Лучшее решение для избавления от электронного c шума на выводе, который (чрезмерно) запускает ваш EXTI, - это улучшение аппаратного обеспечения - но это программная плата, а не электронная c. .

Если к этому выводу подключен канал TIM, я бы рекомендовал использовать его для фильтрации входящего сигнала. Но я думаю, что у PC14 нет таймера.

Второе лучшее решение (и это где обходные пути уже начались!) Заключается в использовании таймера (TIM, а не его канала), либо для установки sh periodi c временной базы для выборки вывода ( через DMA или ISR и подавать образцы в программную фильтрацию ...) - или для деактивации прерывания EXTI в EXTI ISR, запустите таймер и повторно активируйте прерывание EXTI по ​​истечении таймера.

Оба эти подхода на основе µ C неуклюжи и явно уступают разработке хорошего оборудования. Это не говорит о том, что с «хорошим» оборудованием вы не должны добавлять некоторую защиту от помех или шума в свое программное обеспечение!

1 голос
/ 01 мая 2020

Поскольку @P__J__ предлагает добавить некоторые осуждающие логи c. Существует два метода устранения отскока, например, фильтр suing R C и использование программного обеспечения для восстановления отскока logi c. Из-за шума на контактах ISR выполняется постоянно. Вы можете проверить еще одну вещь. Попробуйте потянуть вверх / вниз по булавке и понаблюдайте за поведением. ISR не должен выполняться, если уровень логики c не меняется на пин.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...