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