СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №7/2015

ЭЛЕМЕНТЫ И КОМПОНЕНТЫ 32 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 7 2015 Листинг // Подключение библиотечных функций #include <stm32f10x.h> #include <stm32f10x_rcc.h> #include <stm32f10x_gpio.h> // Подпрограмма инициализации кнопки void init_key() { RCC->APB2ENR |= RCC_APB2Periph_GPIOA; // Включить тактирование порта PА GPIOA->CRL &= ~GPIO_CRL_MODE0; // Обнулить разряды MODE GPIOA->CRL &= ~GPIO_CRL_CNF0; // Обнулить разряды CNF GPIOA->CRL |= GPIO_CRL_CNF0_1; // Вывод как дискретный вход GPIOA->BSRR = GPIO_BSRR_BS0; // Включить подтягивающий резистор AFIO->EXTICR[1] = AFIO_EXTICR1_EXTI0_PA; // Подключить вход EXTI EXTI->FTSR |= EXTI_FTSR_TR0; EXTI->IMR |= EXTI_IMR_MR0; NVIC_EnableIRQ (EXTI0_IRQn); // Разрешить прерывание } // Подпрограмма инициализации индикатора void init_led() { RCC->APB2ENR |= RCC_APB2Periph_GPIOC; // Включить тактирование порта PC GPIOC->CRL &= ~GPIO_CRL_MODE3; // Обнулить разряды MODE GPIOC->CRL &= ~GPIO_CRL_CNF3; // Обнулить разряды CNF GPIOC->CRL |= GPIO_CRL_MODE3_1; // Подать тактирование 2 МГц GPIOC->CRL &= ~GPIO_CRL_CNF3; // Выход общего назначения симметричный } // Обработчик прерывания void EXTI0_IRQHandler(void) { if(EXTI->PR & (1<<0)) // Проверить прерывание от EXTI0 { GPIOC->ODR = GPIOC->ODR ^ (1<<3); // Изменить состояние индикатора EXTI->PR |= EXTI_PR_PR1; // Сбросить флаг прерывания } } // Главный модуль программы int main(void) { init_key(); init_led(); GPIOC->ODR = GPIO_ODR_ODR8; __enable_irq(); while(1) // Бесконечный цикл { // Место для других операторов программы } } Табл. 2. Карта регистров AFIO_EXTICRх Сдвиг Регистр 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0x08 AFIO_EXTICR1 Резерв EXTI3[3:0] EXTI2[3:0] EXTI1[3:0] EXTI0[3:0] Исх. значение 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0x0C AFIO_EXTICR2 Резерв EXTI7[3:0] EXTI6[3:0] EXTI5[3:0] EXTI4[3:0] Исх. значение 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0x10 AFIO_EXTICR3 Резерв EXTI11[3:0] EXTI10[3:0] EXTI9[3:0] EXTI8[3:0] Исх. значение 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0x14 AFIO_EXTICR4 Резерв EXTI15[3:0] EXTI14[3:0] EXTI13[3:0] EXTI12[3:0] Исх. значение 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 AFIO_EXTICR1…AFIO_SEXTICR4. Орга- низация этих регистров представлена в таблице 2. С их помощьюможно назначить про- извольный вывод «x» любого порта, как вход прерывания от 0 до 15, путём запи- си в соответствующую группу разрядов EXTIx. Эти разряды принадлежат реги- страм AFIO_EXTICR1…AFIO_EXTICR4 и могут принимать следующие двоич- ные значения: 0000 для порта PAx, 0001 для PBx, 0010 для PCx и так далее до 0111 для PGx. Например: AFIO->EXTICR[0] |= 0x0000; // Подключить EXTI0 к PA0 AFIO->EXTICR[0] |= 0x0001; // Подключить EXTI0 к PB0 AFIO->EXTICR[4] |= 0x1000; // Подключить EXTI15 к PA0 П РИМЕР ПРОГРАММЫ В листинге приведён пример про- граммного кода, который будет обра- батывать прерывание, возникающее при нажатии на кнопку, и при этом инвертировать состояние индикатора. В программе предполагается, что кноп- ка подключена к порту PA0, а индика- тор – к порту PC3. Из этой программы видно, что опе- рации по анализу состояния кнопки и изменениюсостояния индикатора воз- ложенына прерывания. Поэтому данные процедуры будут выполняться автома- тически, как в параллельномпотоке для основного кода программы. Это нагляд- ный пример одной из реализаций так называемой многозадачности систем. Вбесконечномцикле программымож- но разместить код, предназначенный для выполнения другихнеобходимых задач. Подробнее познакомиться с системой прерыванийпоможетпервоисточник [2]. Л ИТЕРАТУРА 1. www.st.com . 2. www.st.com/web/en/resource/tech- nical/document/reference_manual/ CD00246267.pdf. будет сгенерирован запрос на пре- рывание. Регистр флагов запроса EXTI_PR позволяет определить источник фор- мирования запроса на прерывание. Биты этого регистра устанавливаются, когда на внешней линии прерывания произошло заданное условие запуска. Для настройки выводов портов, под- ключаемых к линии внешних прерыва- ний EXTI, используются регистры аль- тернативных функций ввода-вывода © СТА-ПРЕСС

RkJQdWJsaXNoZXIy MTQ4NjUy