Такого вопроса бы не возникло, если бы Вы пользовались, всеми здесь нелюбимым, инициализационным кодогенератором STM32CubeMX.
Даже если этот инструмент вызывает у Вас чувство стойкого отторжения, но, справедливости ради, является неисчерпаемым источником примеров/информации.
К примеру, Ваш вопрос:
- запускаем STM32CubeMX, создаем проект с Вашим MCU.
- очищаем все назначенные функции, мы же не собираемся использовать код, а лишь исследуем что и как нужно сделать для получения необходимого нам результата (pic_02)
- устанавливаем нужные нам HSE и MCO2 (pic_03)
- задаем нужные частоты/делители (pic_04)
- задаем параметры проекта, в частности генерацию кода средствами LL-драйверов - проще разбираться будет, т.к. код упрощен до уровня регистров/бит (pic_05)
- генерируем код
В результате, мы видим следующие строчки в коде (main.c):
Код:
|
...
LL_RCC_ConfigMCO(LL_RCC_MCO2SOURCE_SYSCLK, LL_RCC_MCO2_DIV_4);
... |
Смотрим, а что же делает данная функция (stm32f4xx_ll_rcc.h):
Код:
|
...
__STATIC_INLINE void LL_RCC_ConfigMCO(uint32_t MCOxSource, uint32_t MCOxPrescaler)
{
MODIFY_REG(RCC-›CFGR, (MCOxSource & 0xFFFF0000U) | (MCOxPrescaler & 0xFFFF0000U), (MCOxSource ‹‹ 16U) | (MCOxPrescaler ‹‹ 16U));
}
... |
Уже этого достаточно, чтобы понять, что для вывода сигналов на контакт MCO2, необходимо изменить биты в регистре RCC-›CFGR, не забывая, естественно, провести GPIO_Init соответствующих контактов.
А далее, смотрим либо в Reference Manual, либо откапываем в коде уже конкретные биты.
А далее, программируйте хоть в HAL/LL/SPL, хоть на Assembler'е.
Ведь совершенно не сложно, правда ведь?
Я дольше описывал что и как нужно сделать.
Очевидно, что это не универсальный метод исследования конкретного MCU - и документацию нужно читать.
Но, согласитесь (обращаюсь ко всем противникам кодогенераторов), это очевидное подспорье в изучении/совершенствовании знаний/..., особенно если новичок или программируешь лишь время от времени.