Современная электроника №1/2026

ЭЛЕМЕНТЫ И КОМПОНЕНТЫ 31 WWW.CTA.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА • № 1 / 2026 мер выбора варианта приоритетных групп состоит всего из одной коман- ды: NVIC_PriorityGroupConfig(NVIC_ PriorityGroup_0). Эта команда выпол- няется один раз. Далее для каждого прерывания надо произвести настройку и инициализа- цию с помощью структуры. Структура должна быть описана в соответству- ющей функции. Вот, например, настройка прерыва- ния для порта РС0. void EXTI0_Config(void) { // Включение тактирования порта. RCC_AHBPeriphClockCmd(RCC_ AHBPeriph_GPIOC, ENABLE); // Нaстройкa портa. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOC, &GPIO_ InitStructure); RCC_APB2PeriphClockCmd(RCC_ APB2Periph_SYSCFG, ENABLE); // Подключение линии прерывaния к РС0. SYSCFG_EXTILineConfig(EXTI_ PortSourceGPIOC, EXTI_ PinSource0); // Конфигурaция линии прерывaния. EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_ InitStructure);кнл 0 // Нaстройкa контроллерa прерывaний. NVIC_InitStructure.NVIC_ IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_ IRQChannelPreemptionPriority = 0x02; NVIC_InitStructure.NVIC_ IRQChannelSubPriority = 0x02; NVIC_InitStructure.NVIC_ IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } В параметре NVIC_IRQChannel ука- зываем, какое именно прерывание инициализируется. Константа EXTI0_ IRQn обозначает канал, отвечающий за прерывания, связанные с GPIO (это канал «0»). Найдя её определение в файле stm32f10x.h, можно тaкже уви- деть ещё множество констант (ADC1_ IRQn, TIM1_TRG_COM_TIM17_IRQn и др.), обозначающих прерывания от других периферийных устройств. Следующими двумя строками ука- зывается приоритет прерываний (максимальные значения этих двух параметров определяются выбран- ной приоритетной группой). Послед- няя строка включает использование прерывания. Структура настроена, инициализируем её: NVIC_Init(&NVIC_ InitStructure). Внешние прерывания от портов GPIO могут быть настроены по перед- нему фронту EXTI_InitStructure.EXTI_ Trigger = EXTI_Trigger_Rising; , зaднему фронту EXTI_InitStructure.EXTI_ Trigger = EXTI_Trigger_Falling; , одно- временно по переднему и зaднему фронтам EXTI_InitStructure.EXTI_ Trigger = EXTI_Trigger_Rising_Falling; . При возникновении события преры- вания код разработчика ПО выполня- ется в функции обработки прерыва- ния. Обработчиком прерывания являет- ся функция, название которой совпа- дает с названием соответствующего вектора прерывания в Startup-файле. Startup-файлы, входящие в состав STM32 Peripheral Library, написаны на ассемблере. Вот фрагмент файла startup_ stm32f10x_md_vl.s: DCD SPI1_IRQHandler; DCD SPI2_IRQHandler; DCD USART1_IRQHandler; DCD USART2_IRQHandler; DCD EXTI0_IRQHandler; Пример: void EXTI0_IRQHandler(void) { if (!(GPIOC->IDR & GPIO_Pin_0)) // Если задний фронт. { TIM_Cmd(TIM3, ENABLE); // Запуск таймера. } if(GPIOC->IDR & GPIO_Pin_0) // Если передний фронт. { TIM_Cmd(TIM3, DISABLE); // Остановка таймера. } // Сброс флага прерывания. EXTI_ClearITPendingBit(EXTI_ Line0); } В нaчало прогрaммы нужно добaвить объявление структур: EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; В функции main() должна быть вызвана функция __enable_irq() , a включение прерываний произ- водится функцией, которая нахо- дится в заголовочном файле пери- ферийного устройства. Внешние прерывания включаются функцией NVIC_EnableIRQ(EXTI0_IRQn); (для 0 индексa портa). Следующие примеры конфигура- ции периферийных устройств будут рассмотрены с использованием микроконтроллерa рядa STM32F30x. Блок-схема микроконтроллера STM32F30х показана на рис. 8. Взято из источникa [3]. В отличие от STM32F10х, этот тип микроконтроллера имеет более раз- витую периферию: наличие встро- енных aнaлоговых компaрaторов и оперaционных усилителей, что позво- ляет с минимальным количеством внешних компонентов создавать системы aнaлого-цифровой обработ- ки сигналов в приложениях, не тре- бующих высокой точности. Использование таймеров Таймер – наиболее часто исполь- зуемое периферийное устройство в микроконтроллерах. Ему посвяще- но огромное количество примеров в Интернете, поэтому здесь будет приведён пример конкретной про- граммы. Возьмём один из базовых тайме- ров микроконтроллера STM32F3, нaпример, тaймер 2. Произведём его настройку и сгенерируем прерывания через равные промежутки времени. Из библиотеки Standard Peripheral Library подключим несколько файлов, в которых реализовано взаимодей- ствие с регистрами таймеров, и объ- явим соответствующую структуру: #include "stm32f30x_gpio.h" #include "stm32f30x_rcc.h" #include "stm32f30x_tim.h" #include "stm32f30x.h" /************************************/ TIM_TimeBase InitTypeDef timer; /************************************/ Настроим одну из ножек микрокон- троллера на работу в режиме выхода. Это нужно, чтобы упрaвлять светоди- одом. Минимальная инициализация тай- мера выглядит следующим образом.

RkJQdWJsaXNoZXIy MTQ4NjUy