STM32 Выходная конфигурация MCO

Я пытаюсь настроить вывод MCO на моем STM32f103, только с периферийной библиотекой STD.

вот мой код:

    void OutputMCO() {
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

/* Output clock on MCO pin ---------------------------------------------*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

// pick one of the clocks to spew
//RCC_MCOConfig(RCC_MCOSource_SYSCLK); // Put on MCO pin the: System clock selected
//RCC_MCOConfig(RCC_MCOSource_HSE); // Put on MCO pin the: freq. of external crystal
//RCC_MCOConfig(RCC_MCOSource_PLLCLK_Div2); // Put on MCO pin the: System clock selected
}

У меня есть проблема:

// pick one of the clocks to spew
//RCC_MCOConfig(RCC_MCOSource_SYSCLK); // Put on MCO pin the: System clock selected
//RCC_MCOConfig(RCC_MCOSource_HSE); // Put on MCO pin the: freq. of external crystal
//RCC_MCOConfig(RCC_MCOSource_PLLCLK_Div2); // Put on MCO pin the: System clock selected

Ни одна из трех возможностей не работает с моим кодом. Этот код был найден в Интернете. Вы знаете, где я могу найти правильные параметры? Определение RCC_MCOSource мне не очень помогает Спасибо.


person vib    schedule 10.09.2017    source источник


Ответы (2)


Я нашел решение в файле stm32f10x_rcc:

#define RCC_MCO_NoClock                  ((uint8_t)0x00)
#define RCC_MCO_SYSCLK                   ((uint8_t)0x04)
#define RCC_MCO_HSI                      ((uint8_t)0x05)
#define RCC_MCO_HSE                      ((uint8_t)0x06)
#define RCC_MCO_PLLCLK_Div2  
person vib    schedule 10.09.2017

Для libopencm3 это также проблема заголовочных файлов. Биты конфигурации, для которых следует брать часы для MCO, находятся в регистре конфигурации часов (RCC_CFGR) в позиции [27:24] (по крайней мере, для серии STM32f0).

Если вы сейчас попытаетесь настроить MCO на SYSCLK следующим образом, это не сработает.

RCC_CFGR = (RCC_CFGR & ~RCC_CFGR_MCO_MASK) | RCC_CFGR_MCO_SYSCLK;

Если вы посмотрите на библиотечный файл rcc.h, вы найдете строку:

#define RCC_CFGR_MCO_SYSCLK         4

поэтому вы пишете битовую позицию 2 вместо 26.

Решение:

RCC_CFGR = (RCC_CFGR & ~(RCC_CFGR_MCO_MASK << 24)) | (RCC_CFGR_MCO_SYSCLK << 24);
person clucky    schedule 21.01.2019