Весьма интересная функция имеется в камешках STM32, вывод на один из пинов сигнала MCO (и не только в STM32, в MSP430 такая возможность тоже имеется).
Иногда для вразумления процессов отладки, иногда при настройке RCC для определения того что творится там, а иногда и в самом устройстве нужно сигнал высокочастотный. В общем пользы очень много…
Рассмотрим пример для STM32F030, на рисунке 1 приведен принтскрин с CubeMX схемы тактирования.
Рисунок 1 — Схема тактирования
Без каких либо вмешательств система тактируется от внутреннего генератора с частотой 8 МГц, Соответственно и вся перефирия также работает на такой частоте.
В STM32F030 выход MCO находится на 18 ноге контроллера (PA8). Первое что нужно — включить тактирование порта А:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
Далее настроить нужный пин:
GPIO_InitTypeDef GPIO_InitStructure;//Создаем структуру с настройками GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//Выбираем нужный нам пин GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//альтернативная функция пина GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//Частота GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//тип выхода GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//без подтяжек
Проведем инициализацию:
GPIO_Init(GPIOA, &GPIO_InitStructure);//инициализируем пин
Непосредственно настройка того, какой именно сигнал выводить на пин:
RCC_MCOConfig(RCC_MCOSource_*, RCC_MCOPrescaler_*);
Первым идет: RCC_MCOSource_* — выбор одного из 6 сигналов (рисунок 2).
Вторым идет: RCC_MCOPrescaler_* — предделитель частоты (рисунок 3).
Рисунок 3 — Предделитель
Ну и сам код в куче:
void OutputMCO() { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); RCC_MCOConfig(RCC_MCOSource_HSE,RCC_MCOPrescaler_32); }