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

ЭЛЕМЕНТЫ И КОМПОНЕНТЫ 33 WWW.CTA.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА • № 1 / 2026 RCC_AHBPeriphClockCmd(RCC_ AHBPeriph_ADC12, ENABLE); RCC_AHBPeriphClockCmd(RCC_ AHBPeriph_GPIOA, ENABLE); // Настраиваем пин на работу в режиме аналогового входа. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_Init(GPIOA, &GPIO_ InitStructure); // Настройки DMA. DMA_DeInit(DMA1_Channel1); // Данные будем брать из регистра данных ADC1. DMA_InitStructure.DMA_ PeripheralBaseAddr = (uint32_t)&(ADC1->DR); // Переправлять данные будем в переменную ADC_Result. DMA_InitStructure.DMA_ MemoryBaseAddr = (uint32_t)&ADC_ Result; // Передача данных из периферии в память. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // Размер буфера. DMA_InitStructure.DMA_ BufferSize = 1; // Адрес источника данных не инкрементируем – он всегда один и тот же. DMA_InitStructure.DMA_ PeripheralInc = DMA_PeripheralInc_ Disable; // Аналогично и с памятью. DMA_InitStructure.DMA_ MemoryInc = DMA_MemoryInc_ Disable; // Настройки размера данных. DMA_InitStructure.DMA_ PeripheralDataSize = DMA_ PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_ MemoryDataSize = DMA_ MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_ InitStructure); // Включаем первый канал DMA1. DMA_Cmd(DMA1_Channel1, ENABLE); // Настраиваем тактирование АЦП. RCC_ADCCLKConfig(RCC_ ADC12PLLCLK_Div2); ADC_StructInit(&ADC_ InitStructure); // Калибровка АЦП. ADC_VoltageRegulatorCmd(ADC1, ENABLE); ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single); ADC_StartCalibration(ADC1); // Настраиваем непрерывные преоб- разования. ADC_CommonInitStructure.ADC_ Mode = ADC_Mode_Independent; ADC_CommonInitStructure.ADC_ Clock = ADC_Clock_AsynClkMode; ADC_CommonInitStructure. ADC_DMAAccessMode = ADC_ DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_ DMAMode = ADC_DMAMode_ OneShot; ADC_CommonInitStructure.ADC_ TwoSamplingDelay = 0; ADC_CommonInit(ADC1, &ADC_ CommonInitStructure); // Включаем работу ДМА через АЦП. ADC_DMACmd(ADC1, ENABLE); ADC_DMAConfig(ADC1, ADC_ DMAMode_Circular); while(ADC_ GetCalibrationStatus(ADC1) != RESET ); // Продолжается настройка АЦП. ADC_InitStructure.ADC_ ContinuousConvMode = ADC_ ContinuousConvMode_Enable; ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ ExternalTrigConvEvent = ADC_ ExternalTrigConvEvent_0; ADC_InitStructure.ADC_ ExternalTrigEventEdge = ADC_ ExternalTrigEventEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_ OverrunMode = ADC_OverrunMode_ Disable; ADC_InitStructure.ADC_ AutoInjMode = ADC_AutoInjec_ Disable; ADC_InitStructure.ADC_ NbrOfRegChannel = 1; ADC_Init(ADC1, &ADC_ InitStructure); // Включаем третий канал первого модуля АЦП. ADC_RegularChannelConfig(ADC1, 3, 1, ADC_SampleTime_7Cycles5); // Включаем АЦП. ADC_Cmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY)); ADC_StartConversion(ADC1); ADC_Result = ADC_ GetConversionValue(ADC1); } /**************************************/ Осталось написать функцию main(): /**************************************/ int main(void) { initialization(); while(1) { } } /**************************************/ В теле главной функции вызываем создaнную функцию инициализации, а в цикле while(1) пусто – то есть процес- сор свободен, всю работу взял на себя модуль DMA. Если прошить этот код в микроконтроллер, то в отладчике мож- но увидеть, что значение переменной ADC_Result меняется в соответствии с уровнем сигнала на выводе PA2. Выводы В приведённой статье были рассмо- трены основные практические приё- мы работы с микроконтроллерами рядa STM32F10x и STM32F30x. К сожалению, объём статьи не позволяет сделать полный обзор алго- ритмов работы со всей периферией, входящей в состав данных типов МК. Более подробную информaцию по модели программировaния и интер- фейсам STM32F можно получить в источнике [5]. В последующей статье будет сделан обзор телекоммуникационных воз- можностей STM32F с иллюстрацией программного кодa. Литература 1. Datasheet STM32F103xC STM32F103xD STM32F103x. P. 12–13, 16, 17. 2. RM0008 Reference manual STM32F101xxx … STM32F107xxx. P. 90–98, 159–174. 3. Datasheet STM32F303xB STM32F303xC. P. 12, 19, 22–24. 4. RM0316 Reference manual STM32F303xB/C, STM32F303x6/8, STM32F328x8 and STM32F358xC advanced ARM®-based 32-bit MCUs. P. 174–188, 216–232, 413–440. 5.  Мартин М. Инсайдерское руководство по STM32. URL: https://istarik.ru/file/STM32.pdf.

RkJQdWJsaXNoZXIy MTQ4NjUy