Rcc stm32 что это

от admin

STM32 тактирование.

Перед глазами вся система тактирования, что очень удобно и позволяет быстро разобраться какой коэффициент за, что отвечает.
Способ задания частоты системной шины, описанный выше, позволяет отлаживать программу только в железе потому, что при отладке в симуляторе флаг готовности того же HSE или PLL не кому установить.

Почему это я пишу про какие-то флаги?
Потому что на самом деле нет ни какой абракадабры и раскоментировав дефайн с нужной частотой тактирования, мы говорим препроцессору, что он должен включить в программу определенный участок кода. Если раскомментировать строку
#define SYSCLK_FREQ_56MHz 56000000
То препроцессор включит в программу следующий участок кода

Второе ограничение, к которому приводит такая настройка системной частоты — невозможно разогнать контроллер, потому как разгон производится с помощью настройки PLL, но в этом пока, что нужды не было.

STM32 тактирование.

  • HSI(high speed internal) oscillator clock
  • HSE(high speed external) oscillator clock
  • PLL clock
  • подключение внешнего керамического/кварцевого резонатора с частотой от 4-16 MHz
  • использование внешнего источника тактовых импульсов с коэффициентом заполнения примерно 50%

STM32 тактирование.

PLL – это банальный умножитель, с регулируемым коэффициентом умножения. То есть на его вход можно подать 8MHz, а на выходе получить частоту кратную 8, например 56MHz. Этого понимания достаточно для настройки PLL, хотя надо сказать, что само устройство PLL достаточно интересно и статью по его работе планирую опубликовать тут.
Еще, изменять коэффициенты PLL можно только при выключенном PLL, при запущенном PLL изменять коэффициенты нельзя.

Также хотелось бы отметить, что у МК есть ножка через которую можно тактировать различные устройства или просто посмотреть на какой частоте запустился МК, называется она МСО.
Еще интересной фичей является система защиты от нестабильной работы и отказа генератора HSE, называется она CSS(Clock security system).
CSS способна отслеживать отказ или нестабильную работу генератора HSE, осуществлять автоматическое переключение тактирования на встроенный генератор HSI и вызывать немаскируемые прерывания — NMI (Non-Masked Interrupts). Напомню, что NMI – это прерывания, которые невозможно сбросить, не обработав, то есть их возникновение прерывают выполнение программы независимо от каких-либо условий.

Регистр управления RCC_CR :

PLLRDY(PLL clock ready flag) — флаг готовности PLL, устанавливается аппаратно.

PLLON( PLL enable) — установка единицы в этот бит разрешает работу PLL.

CSSON(Clock security system enable) — установка единицы в этот бит разрешает работу детектора тактового сигнала от HSE.

HSEBYP(External high-speed clock bypass) — установка единицы в этот бит разрешает использование внешнего генератора и возможна лишь когда HSEON сброшен.

HSERDY(External high-speed clock ready flag) — единица в этом бите говорит о том, что внешний генератор стабилизировался.

HSEON(HSE clock enable) — установка единицы в этом бит, позволяет принудительно переключиться на внешний генератор.

HSICAL[7:0](Internal high-speed clock calibration) — эти биты инициализируются при запуске.

HSITRIM[4:0](Internal high-speed clock trimming) — значение этих битов прибавляется к значению HSICAL, таким появляется возможность корректировать частоту МК, которая может «уходить» в зависимости от напряжения питания и температуры окружающей среды. Шаг подстройки между двумя значениями примерно равен 40KHz.

HSIRDY(Internal high-speed clock ready flag) – флаг устанавливается аппаратно когда внутренний RC генератор 8 МГц стабилизировался.

HSION(Internal high-speed clock enable) — установка этого бита в единицу принудительно запускает внутренний RC генератор 8 МГц. Этот бит не может быть сброшен если с помощью HSI, формируется системная частота.

Регистр конфигурации RCC_CFGR:

MCO(Microcontroller clock output) — значение этих битов определяют работу вывода MCO.

STM32 тактирование.

USBPRE(USB prescaler) — ноль в этом бите включает предделить с коэффициентом 1.5 для usb.Предделитель должен быть настроен до включения тактирования USB шины.

PLLMUL(PLL multiplication factor) — значение этих битов определяет коэффициент умножения PLL.

STM32 тактирование.

PLLXTPRE(HSE divider for PLL entry) — значение этого бита определяет будет ли HSE поделен на два, перед подачей на вход PLL. Устанавливать его нужно при отключенной PLL.

PLLSRC(PLL entry clock source) — значение этого бита определяет с какого источника будет подан сигнал на вход PLL.(0 – источник HSI/2, 1 – источник HSE)

ADCPRE(ADC prescaler) — значение этих битов определяет коэффициент деления тактовой частоты для АЦП.

STM32 тактирование.

PPRE2(APB high-speed prescaler (APB2)) — значение этих битов определяет коэффициент деления тактовой частоты для APB2.

STM32 тактирование.

PPRE1(APB low-speed prescaler (APB1)) — значение этих битов определяет коэффициент деления тактовой частоты для APB1.

STM32 тактирование.

HPRE(AHB prescaler) — значение этих битов определяет коэффициент деления тактовой частоты для AHB.

STM32 тактирование.

SWS(System clock switch status) — устанавливается аппаратно, показывая какой источник используется для тактирования системы.

STM32 тактирование.

SW(System clock switch) — с помощью этих битов можно выбрать источник для тактирования SYSCLK.

STM32 тактирование.

Регистр прерываний RCC_CIR:

CSSC(Clock security system interrupt clear) — установка этого бита в единицу позволяет очистить флаг CSSF.

PLLRDYC(PLL ready interrupt clear) — установка этого бита в единицу позволяет очистить флаг PLLRDYF.

HSERDYC(HSE ready interrupt clear) — установка этого бита в единицу позволяет очистить флаг HSERDYF.

HSIRDYC(HSI ready interrupt clear) — установка этого бита в единицу позволяет очистить флаг HSIRDYF.

LSERDYC(LSE ready interrupt clear) — установка этого бита в единицу позволяет очистить флаг LSERDYF.

LSIRDYC(LSI ready interrupt clear) — установка этого бита в единицу позволяет очистить флаг LSIRDYF

PLLRDYIE(PLL ready interrupt enable) — единица в этом бите разрешает прерывания при сцеплении PLL.

HSERDYIE(HSE ready interrupt enable) — единица в этом бите разрешает прерывания при сцеплении HSE.

HSIRDYIE(HSI ready interrupt enable) — единица в этом бите разрешает прерывания при сцеплении HSI.

LSERDYIE(LSE ready interrupt enable) — единица в этом бите разрешает прерывания при сцеплении LSE.

LSIRDYIE(LSI ready interrupt enable) — единица в этом бите разрешает прерывания при сцеплении LSI.

CSSF(Clock security system interrupt flag) — этот флаг устанавливается аппаратно при отказе HSE, очищается с помощью CSSC.

PLLRDYF(PLL ready interrupt flag) — этот флаг устанавливается аппаратно если произошло сцеплении с PLL и бит PLLRDYDIE установлен..

HSERDYF(HSE ready interrupt flag) — этот флаг устанавливается аппаратно если HSE стабилизировался и бит HSERDYDIE установлен.

HSIRDYF(HSI ready interrupt flag) — этот флаг устанавливается аппаратно если HSI стабилизировался и бит HSIRDYDIE установлен..

LSERDYF(LSE ready interrupt flag) — этот флаг устанавливается аппаратно если LSE стабилизировался и бит LSERDYDIE установлен..

LSIRDYF(LSI ready interrupt flag) — этот флаг устанавливается аппаратно если LSI стабилизировался и бит LSIRDYDIE установлен.

Регистр сброса RCC_APB2RSTR

STM32 тактирование.

При записи единицы в биты этого регистра происходит сброс соответствующей периферии, которая тактируется от шины APB2. Под сбросом понимается установка в регистры блока, например USART, значения по умолчанию.

Регистр сброса RCC_APB1RSTR

STM32 тактирование.

При записи единицы в биты этого регистра происходит сброс соответствующей периферии, которая тактируется от шины APB1. Под сбросом понимается установка в регистры блока, например USART, значения по умолчанию.

Регистр управления тактированием на шине AHB RCC_AHBENR

STM32 тактирование.

При записи единицы в биты этого регистра включается тактирование соответствующей периферии подключенной к шине AHB, при записи нуля отключается.

Регистр управления тактированием на шине APB2 RCC_APB2ENR

STM32 тактирование.

STM32 тактирование.

При записи единицы в биты этого регистра включается тактирование соответствующей периферии подключенной к шине APB1, при записи нуля отключается.

Регистр управления доменом BKP RCC_BDCR:

BDRST(Backup domain software reset) — установка единицы в этот бит сбрасывает значение битов регистра RCC_BDCR.

RTCEN(RTC clock enable) — установка единицы в этот бит включает тактирование RTC.

RTCSEL[1:0](RTC clock source selection) — значение этих битов определяет источник тактирования RTC.

STM32 тактирование.

LSEBYP(External low-speed oscillator bypass) — ставится и очищается программно, чтобы обойти LSE генератор в режиме отладки.

LSERDY(External low-speed oscillator ready) — единица в этом бите говорит о том, что LSE с частотой 32KHz стабилизировался.

LSEON(External low-speed oscillator enable) — установка единицы в этот бит разрешает работу LSE с частотой 32KHz.

Регистр управления/статуса RCC_CSR:

LPWRRSTF(Low-power reset flag) — этот флаг устанавливается аппаратно, когда происходит от контроллера пониженного потребления.

WWDGRSTF(Window watchdog reset flag) — этот флаг устанавливается аппаратно, когда происходит сброс от оконного WatchDog.

IWDGRSTF(Independent watchdog reset flag) — этот флаг устанавливается аппаратно, когда происходит сброс от независимого WatchDog.

SFTRSTF(Software reset flag) — этот флаг устанавливается аппаратно, когда происходит программный сброс.

PORRSTF(POR/PDR reset flag) — этот флаг устанавливается аппаратно при при включение/выключение питания.

PINRSTF(PIN reset flag) — этот флаг устанавливается аппаратно, когда происходит сброс от вывода NRST.

RMVF(Remove reset flag) — установка единицы в этот бит позволяет сбросить все, описанные выше флаги, в этот регистре.

LSIRDY(Internal low-speed oscillator ready) — единица в этом бите говорит о том, что LSI стабилизировался.

LSION(Internal low-speed oscillator enable) — установка единицы в этот бит разрешает работу внутреннего RC генератора 40 kHz.

Очередная статья: STM32 для начинающих

Это моя первая статья на Хабре, поэтому прошу не кидаться тяжелыми предметами. Заранее спасибо.

Начнем с предыстории. Когда-то мне пришлось перейти на микроконтроллеры ARM фирмы ST. Это было связано с тем, что PIC и AVR уже не хватало и хотелось новых приключений. Из доступного в хлебобулочных магазинах и большого количества статей о «быстром старте» выбор пал именно на STM32F100.

Я привык работать в IAR. Да, есть другие IDE, но мне хватает возможности IAR: относительно удобный редактор, не плохой отладчик и достаточно удобно работать с регистрами во время отладки.

Когда я попытался сделать первый проект меня ждало разочарование — CMSIS! Кому как, но для меня это было (и остается) ужасом: много буков, длинные и для меня не понятные структуры. Вникать во все это было не интересно. Попытался скомпилировать пару примеров и понял — это не наш метод.

Неужели нет других вариантов? Есть. Тот, встроенный в IAR: iostm32f10xx4.h и подобные инклудники. Вполне не плохо:

Оставалось это запихнуть в классы и пользоваться. Так и сделал. Через какое-то время потребовалось сделать код для STM32f4xx. И тут снова засада — нет инклудиков. Что делать? — писать самому. Проанализировал имеющиеся самописные библиотеки решил немного сделать по другому. Вот об этом и будет рассказ.

Начало

Про установку IAR и драйверов для отладчика рассказывать не буду, т.к. здесь ничего нового. У меня стоит IAR 8 с ограниченем кода в 32кБ. Для работы выбран контроллер STM32F103, установленный на плате plue pill.

Запускаем IAR, создаем проект c++, выбираем нужный контроллер
image
Следующий шаг — изучение документации. Нас будет интересовать Reference manual RM0008. Там главное внимательно читать.

Вообще, когда я обучал своих работников программированию контроллеров, я давал задание — включить светодиод (подключенный к ножке контроллера), использую дебагер, редактирую регистры и читая документацию.

Модуль RCC. Такирование

Про этот модуль обычно забывают. Вспоминают только тогда, когда не получается мигнуть светодиодом.

Читать:
Cosmo 1010 817 что это

Запомните! Что бы включить какую-либо периферию, на нее надо подать тактовые импульсы! Без этого никак.

Порты ввода-вывода сидят на шине APB2. Находим в документации регист для упрвления тактированием этой шины, это RCC_APB2ENR:

Чтобы включить тактирование порта C (светодиод как раз припаян к PC13), требуется записать в бит IOPCEN единичку.

Теперь найдем адрес регистра RCC_APB2ENR. Смещение у него 0x18, базовый адрес для регистров RCC 0x40021000.

Чтобы удобно было работать с битами, создадим структуру:

Чтобы потом не мучаться, сразу перечислим все адреса регистров:

теперь остается написать код для включения периферии:

При работе с регистрами не забываем про volatile, иначе после оптимизации компилятором долго будем искать ошибки и ругать разработчиков компилятора.

Тоже самое делаем для включения тактирвания другой периферии.

В итоге получился такой класс (не все перечислено):

Теперь можно в main.cpp присоединить файл и пользоваться:

Теперь можно и с портами поработать. GPIO

Открываем в документации раздел General-purpose and alternate-function I/Os. Находим Port bit configuration table:

Битами CNF[1:0] задается режим работы порта (аналоговый вход, цифровой вход, выход), биты MODE[1:0] отвечат за скорость работы порта в режиме выход.

Взглянем на регистры GPIOx_CRL и GPIOx_CRH (x=A, B, C. )

видно, что биты идут последовательно:

тогда создадим константы с режимами работы портов

тогда метод для конфигурации будет выглядеть так:

теперь можно сделать более удобные методы для выбора режима:

В документации находим адреса управляющих регистров для портов и перечислим:

Долго думал использовать базовый адрес и смещения или абсолютные адреса. В итоге остановился на последнем. Это добавляет некоторые издержки, но в процессе отладки удобней находить в памяти.

Возможно, у кого-то будет глаз дергаться, но красивее пока не придумал.

Чтобы перевести ножку в нужное логическое состояние, достаточно записать соответствующий бит в регистре ODRx. Например, так:

Также для управления состоянием можно воспользоваться регистрами GPIOx_BSRR.
По аналогии делаем методы для считывания состояния порта, методы для конфигурации и инициализации (не забываем включить тактирование). В итоге получился такой класс для работы с портами:

Ну что, опробуем:

Проходим дебагером и убеждаемся, что светодиод сначала загорается (после led.ModeOutput();), потом гаснет (led.On();) и снова загорается (led.Off();). Это связано с тем, что светодиод подключен к ножке через линию питания. Поэтому, когда на выводе низкий уровень, светодиод загорается.

Не большие итоги

В данной статье я попытался (надеюсь, получилось) показать как можно немного упростить себе жизнь, сделать код более читаемым. Или наоборот — как нельзя делать. Каждый решит сам.
Можно было просто написать враперы для CMSIS, но это не интересно.

Русские Блоги

[100-шаговое введение в STM32] Функция и использование RCC (включая обучающее видео)

RCC является наиболее важной и необходимой функцией в обучении STM32. Часы RCC определяют переключение и производительность всех внутренних функций.

Каждая функция в STM32 должна иметь источник синхронизации для работы. RCC — это, по сути, источник синхронизации, который определяет, какие функции следует включить или выключить, и устанавливает частоту для включенного источника синхронизации.

** Я организовал содержание этого документа и записал видео "STM32 Getting Started 100 Steps"
Два из этих эпизодов касаются принципов и использования RCC: (станция B онлайн) **

  • Шаг 7 Видео-введение в основные принципы работы часов:https://www.bilibili.com/video/av18222153/?p=7
  • Шаг 41 Видео-введение, как настроить RCC на программе:https://www.bilibili.com/video/av18222153/?p=43

Сначала узнайте несколько специальных терминов: (пожалуйста, помните)

  • RCC: настройка часов, сброс периферии и управление часами. *
  • HSE: внешний высокоскоростной кварцевый генератор, который представляет собой кварцевый генератор 4

Объяснение проблемы с часами, найденной онлайн:

1. HSI: высокоскоростной внутренний тактовый сигнал. Микроконтроллер STM32 имеет тактовую частоту (частота 8М) с низкой точностью.
2. HSE: высокоскоростной внешний синхросигнал с высокой точностью Источник (1) HSE внешний кристалл / керамический резонатор (кварцевый генератор) (2) HSE пользовательские внешние часы
3. LSE: низкоскоростной внешний кристалл 32,768 кГц в основном обеспечивает точный источник синхронизации, обычно используемый в качестве часов RTC
В STM32 имеется пять источников синхронизации, а именно HSI, HSE, LSI, LSE и PLL.
①, HSI — это высокоскоростные внутренние часы, RC-генератор, частота 8 МГц.
②, HSE — это высокоскоростные внешние часы, которые могут быть подключены к кварцево-керамическому резонатору или внешнему источнику синхронизации, а диапазон частот составляет 4–16 МГц.
③, LSI — это низкоскоростные внутренние часы, RC-генератор, частота 40 кГц.
④, LSE — это низкоскоростные внешние часы, подключенные к кварцевому кристаллу с частотой 32,768 кГц.
⑤, PLL — это выход умножителя частоты контура с фазовой автоподстройкой частоты, его источник тактового сигнала может быть выбран как HSI / 2, HSE или HSE / 2. Множитель частоты может быть выбран от 2 до 16 раз, но максимальная выходная частота не должна превышать 72 МГц.
Среди них LSI 40 кГц используется независимым сторожевым IWDG, и его также можно выбрать в качестве источника тактового сигнала часов реального времени RTC.
Источник часов RTC часов реального времени также может выбирать LSE или HSE, деленные на 128. Источник часов RTC выбирается с помощью RTCSEL [1: 0].
STM32 имеет высокоскоростной USB-модуль, а для его механизма последовательного интерфейса требуется тактовый источник с частотой 48 МГц. Источник тактовых импульсов может быть получен только с выхода ФАПЧ, его можно выбрать для деления на 1,5 или деления на 1. То есть, когда необходимо использовать модуль USB, ФАПЧ должен быть включен, а тактовая частота настроена на 48 МГц или 72 МГц.
STM32 также может выбрать тактовый сигнал для вывода на вывод MCO (PA8), который можно выбрать в качестве выхода PLL, деленного на 2, HSI, HSE или системные часы.
Системные часы SYSCLK, это источник синхронизации для работы большинства частей STM32. Системные часы могут быть выбраны как выход PLL, HSI или HSE. Максимальная частота системных тактовых импульсов составляет 72 МГц, которая делится на делитель частоты AHB и отправляется каждому модулю для использования. Делитель частоты AHB может выбирать 1, 2, 4, 8, 16, 64, 128, 256, 512 деление частоты. Среди них выходной тактовый сигнал делителя частоты AHB передается на 5 модулей:
①, часы HCLK для шины AHB, ядра, памяти и DMA.
②. После деления на 8 он отправляется на часы системного таймера Cortex.
③ clock Часы простоя FCLK отправлены непосредственно в Cortex.
to, к делителю частоты APB1. Делитель частоты APB1 может выбрать деление частоты на 1, 2, 4, 8, 16, его выход предназначен для периферийного использования APB1 (PCLK1, максимальная частота 36 МГц), а другой — для умножения частоты таймера (таймера) 2, 3, 4. 。 。 Используйте. Множитель частоты может выбрать 1 или 2 умножения частоты, выходной сигнал синхронизации используется для таймера 2, 3, 4.
to, к делителю частоты APB2. Делитель частоты APB2 может выбирать деление частоты 1, 2, 4, 8, 16, его выход используется для периферийных устройств APB2 (PCLK2, максимальная частота 72 МГц), а другой отправляется на множитель таймера (таймера) 1. Множитель частоты может выбрать 1 или 2 умножения частоты, а тактовый выход используется для таймера 1. Кроме того, делитель частоты APB2 также имеет выход для делителя частоты АЦП, который отправляется в модуль АЦП после деления частоты. Делитель АЦП можно выбрать для деления на 2, 4, 6 или 8.
Многие из вышеперечисленных выходов тактовой частоты имеют встроенное управление, такие как тактовая частота шины AHB, тактовая частота ядра, различные периферийные устройства APB1, периферийные устройства APB2 и т. д. Когда вам нужно использовать модуль, не забудьте сначала включить соответствующие часы.
Следует отметить, что умножитель частоты таймера, когда частота APB равна 1, его умножитель частоты равен 1, в противном случае его умножитель частоты равен 2.
Устройства, подключенные к APB1 (низкоскоростное периферийное устройство): интерфейс питания, интерфейс резервного копирования, CAN, USB, I2C1, I2C2, UART2, UART3, SPI2, сторожевой таймер окна, Timer2, Таймер3, Таймер4. Обратите внимание, что хотя для модуля USB требуется отдельный тактовый сигнал 48 МГц, он должен быть не тактовым, чтобы модуль USB работал, а только для механизма последовательного интерфейса (SIE). Часы модуля USB должны быть предоставлены APB1.
К APB2 (высокоскоростные периферийные устройства) подключены следующие устройства: UART1, SPI1, Timer1, ADC1, ADC2, все общие порты ввода-вывода (PA

PE) и порт ввода-вывода второй функции.

Разница в производительности каждого тактового входа:

Схема древовидной структуры RCC и подробный увеличенный вид:



Примечание:

Регистры участвуют:
Структура регистра RCC, RCC_TypeDeff, определяется в файле "stm32f10x_map.h" следующим образом:
typedef struct
<
vu32 CR; // Включить HSI, HSE, CSS, PLL и т. д.
vu32 CFGR; // Выбор источника синхронизации и установка коэффициента деления частоты PLL и т. д.
vu32 CIR; // Очистить / включить прерывание готовности часов
vu32 APB2RSTR; // Регистр сброса периферийного устройства APB2 онлайн
vu32 APB1RSTR; // Регистр сброса периферийного устройства APB1 онлайн
vu32 AHBENR; // Разрешение синхронизации для DMA, SDIO и т. д.
vu32 APB2ENR; // Активация часов периферийного устройства APB2 онлайн
vu32 APB1ENR; // Включение линии синхронизации периферийных часов линии APB1
vu32 BDCR; // Резервный регистр управления доменом
vu32 CSR;
> RCC_TypeDef;

Часть о библиотеке функций RCC в стандартной документации библиотеки:

Описание стандартной библиотеки Baidu облако скачать полную документацию:https://pan.baidu.com/s/1i57UGLn

Процедура установки RCC окончательно разобралась в соответствии с приведенной выше информацией:

STM32L– Система тактирования (обзор)

image Стоит обратить внимание на ограничение максимальных частот в зависимости от режима работы (напряжения питания ядра): image Пример 1 Как мы уже знаем после сброса в качестве системной тактовой частоты используется внутренний MSI генератор, с частотой по умолчанию 2,097 МГц. Воспользуемся выходом MCO для контроля частоты. Объявим вывод:

Выбор источников сигнала производится установкой соответствующих битов в регистре RCC_CFGR.

image

image

К сожалению в заголовочном файле stm32l1xx.h не описаны источники, поэтому опишем их сами (так как пока не используем стандартную библиотеку):

И выберем в качестве источника MSI генератор:

После компиляции и прошивки, на выводе PA8 получил частоту 2,102 МГц.

Попробуем изменить частоту MSI генератора.

Выбор частоты производится установкой соответствующих битов в регистре RCC_ICSCR

image

image

Повышаем частоту до 4,194 Мгц:

Компилируем, прошиваем и получаем 4,206 МГц.

Внимание! Так как сейчас после сброса мы “сразу” изменяем частоту генератора MSI, а он по умолчанию используется для системной тактовой частоты, то выбор диапазона 0 или 1 приведет к невозможности программирования мк. Если вы все таки попали в данное положение, то для восстановления работоспособности достаточно вывод Boot0 подключить к Vcc и выполнить сброс мк.

Пример 2

После сброса выключены все генераторы кроме MSI.

Попробуем включить HSI генератор.

Общая процедура такова:

  • разрешить работу генератора (установка соотв. битов)
  • дождаться стабилизации работы (ожидание установки соотв. битов)
  • использовать по задумке

Ожидаем окончания стабилизации работы (ожидание установки бита HSIRDY):

Выводим сигнал на вывод MCO:

После компиляции и прошивки, на выводе PA8 получил частоту 15,91 МГц.

На этом обзорная часть заканчивается.

Ещё раз обращаю внимание, что после сброса в качестве системной тактовой частоты используется внутренний MSI генератор (2,097 МГц).

Похожие публикации