Категории:

  • Программирование


  • Изобразительное искусство


  • Программирование встраиваемых систем


  • Компьютерная графика


  • WEB Разработка


  • Музыка


  • Инженерия


  • iVARIOUS


  • Mobil App


  • STM32. Прерывание на кнопке

    В этой статье обсудим пример применения прерывания по нажатию кнопки, на плате Discovery с микроконтроллером STM32f407VG.
    Как упоминалось в статье ранее, прерывание это остановка работы основной программы и выполнение некой функции в случае появления нужного нам события. В плате Discovery с микроконтроллером STM32f407VG кнопка расположена на первой ножке порта - A. На ст. 379 документации RM0090 Reference manual указано, что ножки 1-4 (0-3 в битовом эквиваленте) находятся на нулевой линии EXTI ( EXTI0 ), и в файле StartUp который создается по умолчанию вместе с проектом в редакторе Keil, находится название соответствующей функции-обработчика для этой линии ( EXTI0_IRQHandler ) в нее мы и запишем программу, которая будет выполнятся по нажатию кнопки. В инициализации МК начинаем с подачи тактирования портов на которых светодиоды, кнопка, а также контроллера SYSCFG, в котором укажем ножки, которые мы будем "слушать". Для кнопки на нулевой ножке порта - А регистр MODER оставим по умолчанию ( ножка работает на вход) , а для портов D на которых светодиоды - конфигурация на выход.
    По схеме, ножка на которой "висит" кнопка PA0, прижата к земле через сопротивление. При включении чипа, на ножке будет логический ноль, а при нажатии на кнопку - к ножке пойдет ток, но сопротивление R39 не даст создать замыкание, хоть в этот момент ножка будет и дальше прижата к нулю. Это схема подтягивания, её нужно понять , она используется всегда в электронике.
    STM32 BUTTON Дальше пойдут настройки Контроллера EXTI. В регистре EXTI_IMR снимем маскирование прерывания, а в регистре EXTI_RTSR установим условие прерывания - при переходе состояния ножки с нуля к единице. В SYSCFG_EXTICR1 установим пин порта которые хотим подключить к нужной линии EXTI.


    void EXTI0_IRQHandler (void) //название функции прерывания из файла stm32f4xx.h
    { uint32_t i;
    GPIOD_ODR=0xF000;
    for(i=0;i<=200000;i++);
    GPIOD_ODR=0;
    for(i=0;i<=200000;i++);
    if((GPIOA_IDR&0x1)==0x1)// Если кнопка будет отпущена
    EXTI_PR=0x1;//Произойдет выход из прерывания, функция завершит свою работу.

    }

    void func_two (void)
    { uint32_t i;
    GPIOD_ODR=0xF000;
    for(i=0;i<=1000000;i++);
    GPIOD_ODR=0;
    for(i=0;i<=1000000;i++);
    }

    void SystemInit(void)
    {
    }

    int main(void)
    {
    RCC_GPIO=0x9; //тактирование портов
    RCC_SYSCFG=0x4000; //тактирование SYSCFG , для выбора источника прерывания
    GPIOA_MODER=0xA8000000;
    GPIOA_PUPDR|=0x64000000;
    GPIOD_MODER=0x55000000;
    GPIOD_PUPDR=0x55000000;
    EXTI_IMR=0x1; //Для размаскирования соответствующих линий прерываний
    EXTI_RTSR=0x1; //генерация события прерывания по переходу из состояния «0» в состояние «1»
    SYSCFG_EXTICR1=0; //пин с какого порта подключается к определенной линии EXTI
    NVIC_ISER0=0x40;//из таблицы узнали номера векторов, необходимых нам прерываний. Теперь нужно записать «1» в 6 бит
    GPIOD_ODR=0xF000;

    while(1)
    {
    func_two ();
    }
    }


    В данном примере, когда кнопка не нажата, будет выполнятся func_two() с относительно медленным миганием светодиодов. В момент нажатия кнопки, сработает прерывание, и основная программа остановит свое выполнение, пока не завершит работу функция EXTI0_IRQHandler ();

    Читайте больше в категории: Программирование встраиваемых систем

    2016-03-27 19:34:54



    Другие статьи:

    Maya. Альфа канал и UV координаты

    Maya. Операция Fill Hole

    Java. Списки ArrayList и LinkedList

    WEB Разработка

    STM32. DMA USART

    HTML. Создаем меню

    Бронецький Замок. 3D реконструкція

    JavaScript. innerHTML

    Линии и пятна

    STM32. Работа с акселерометром