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

ЭЛЕМЕНТЫ И КОМПОНЕНТЫ 32 WWW.CTA.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА • № 1 / 2026 /**************************************/ void Conig_Timer2(void) { // Тактирование. RCC_AHBPeriphClockCmd(RCC_ AHBPeriph_GPIOE, ENABLE); RCC_APB1PeriphClockCmd(RCC_ APB1Periph_TIM2, ENABLE); // На этом выводе у нас синий свето- диод (STM32F3Discovery). Gpio.GPIO_Mode = GPIO_Mode_OUT; gpio.GPIO_Pin = GPIO_Pin_8; gpio.GPIO_Otype = GPIO_Otype_PP; gpio.GPIO_Speed = GPIO_ Speed_50MHz; GPIO_Init(GPIOE, &gpio); // Настройка таймера TIM2. TIM_TimeBaseStructInit(&timer); timer.TIM_Prescaler = 7200; timer.TIM_Period = 20000; TIM_TimeBaseInit(TIM2, &timer); } /**************************************/ В нaстройкaх присутствуют знa­ чения 7200 и 20 000. Таймер такти- руется частотой 72 МГц. Prescaler, он же предделитель, нужен для деле- ния тактовой чaстоты. Таким обра- зом, получаем 72 МГц / 7200 = 10 КГц . Значит, один тaкт таймера соответ- ствует (1/10 000) секунд, что равня- ется 100 микросекундам. Период таймера – это величина, досчитав до которой, программа перейдёт на обработчик прерывания по перепол- нению таймера. В нашем случае тай- мер дойдёт до 20 000, что соответству- ет (100×20 000) мкс или 2 секундам. То есть светодиод (который мы зажигаем и гасим в обработчике прерывания) будет мигать с периодом 4 секунды (2 секунды горит, 2 секунды не горит). В функции main() вызываем функ- цию инициализации, а также вклю- чаем прерывания и таймер. Цикл while(1) пуст. main() { __enable_irq(); Conig_Timer2 (); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_Cmd(TIM2, ENABLE); NVIC_EnableIRQ(TIM2_IRQn); while(1) { } } /**************************************/ Теперь нужно добавить код для обработчика прерываний: /**************************************/ void TIM2_IRQHandler() { TIM_ClearITPendingBit(TIM2, TIM_ IT_Update); if (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8) == 1) { GPIO_ResetBits(GPIOE, GPIO_Pin_8); } else { GPIO_SetBits(GPIOE, GPIO_ Pin_8); } } /**************************************/ Конфигурaция и рaботa с AЦП Основные характеристики АЦП в STM32F3xx [4]. ● АЦП является 12-битным. ● Имеются регулярные (имеют об- щий буфер) и инжектировaнные (индивидуaльный буфер для кaждого кaнaлa) кaнaлы. ● Отдельный кaнaл для встроен- ного темперaтурного дaтчикa и дaтчикa нaпряжения питaния микроконтроллерa. ● Быстрое время преобразования – 0,2 мкс, причём это время не зави- сит от тактовой частоты шины AHB, на которой висят АЦП. ● Возможна генерация прерывания по окончании преобразования с инжек- тированного канала. ● Возможно прерывание от Analog Watchdog. Это нужно для того, что- бы следить, что измеренное напря- жение не выходит за определённые значения. Причём может сканиро- ваться как конкретный канал, так и группа каналов. В регистры ADC_HTR и ADC_LTR заносятся значения верх- него и нижнего порога соответствен- но, и в случае, если проверяемое на- пряжение выходит за эти пределы, генерируется прерывание. ● Возможно одиночное преобразова- ние и преобразование в непрерыв- ном режиме. ● Присутствует самокалибровка. ● Доступен запуск преобразования от внешнего события. ● Может работать в связке с DMA. ● Как и в других микроконтролле- рах, возможно выравнивание ре- зультата по правому или по лево- му краям. Структурная схема модуля АЦП представлена на рис. 9 [4]. Как и в предыдущем примере, будет использоваться библиотека STL и, соответственно, файлы: stm32f30x_adc.h stm32f30x_adc.c stm32f30x_dma.h stm32f30x_dma.c В данной библиотеке всё реализо- вано точно так же, как и для любой другой периферии: в .c-файлах функ- ции для настройки и работы с пери- ферией, в .h – объявления специаль- ных структур и переменных. Настроим модуль ADC1 так, чтобы он производил непрерывные преобразо- вания одно за другим и результат при помощи DMA записывался в специаль- но созданную переменную. Для реали- зации этого нужно выяснить, какой из каналов DMA требуется использовать. Как видно из схемы на рис. 10, это первый канал DMA. Для примера задействуем третий канал АЦП. Из даташита [3] и руковод- ства пользователя узнаём, что третий канал ADC1 – это вывод PA2 нашего микроконтроллера. Ниже пример кода. Необходимые подключаемые файлы: /**************************************/ #include "stm32f30x_adc.h" #include "stm32f30x_dma.h" #include "stm32f30x_gpio.h" #include "stm32f30x_rcc.h" #include "stm32f30x_misc.h" #include "stm32f30x.h" /**************************************/ Объявление структур: /**************************************/ GPIO_InitTypeDef GPIO_ InitStructure; NVIC_InitTypeDef NVIC_ InitStructure; ADC_InitTypeDef ADC_ InitStructure; DMA_InitTypeDef DMA_ InitStructure; ADC_CommonInitTypeDef ADC_ CommonInitStructure; uint32_t ADC_Result; /**************************************/ Инициализация всей периферии, которую будем использовать: /**************************************/ void initialization(void) { // Включаем тактирование DMA1, ADC12 и GPIOA. RCC_AHBPeriphClockCmd(RCC_ AHBPeriph_DMA1, ENABLE);

RkJQdWJsaXNoZXIy MTQ4NjUy