Вычисление тактовых частот в STM32F10x

Микроконтроллеры серии STM32F10x содержат богатую периферию, которая тактируется с разными частотами. Вычислить тактовые частоты можно с помощью функции RCC_GetClocksFreq(), которая содержится в модуле RCC библиотеки STM32F10x SPL.

Функция производит вычисления на основе данных в регистрах RCC.

Прототип функции:

void RCC_GetClocksFreq(RCC_ClocksTypeDef * RCC_Clocks)

Функция заполняет структуру типа RCC_ClocksTypeDef, указатель на которую передается в функцию в качестве аргумента. Структура содержит следующие поля:

uint32_t ADCCLK_Frequency Тактовая частота АЦП в Гц
uint32_t HCLK_Frequency Тактовая частота шины AHB в Гц
uint32_t PCLK1_Frequency Тактовая частота периферии APB1 в Гц
uint32_t PCLK2_Frequency Тактовая частота периферии APB2 в Гц
uint32_t SYSCLK_Frequency Системная тактовая частота в Гц

Если используется внешнее тактирование, то функция должна знать частоту этого тактирования. Частота задается константой HSE_VALUE.

Лучше всего, определить константу опцией -D компилятора:

-DHSE_VALUE=4000000

В этом примере задается частота 4 МГц.

Если не определить константу в опциях компилятора, то она определится в файле stm32f10x.h и ей присвоится значение по умолчанию: 8000000 (8 МГц). Это значение можно отредактировать, прописав свою частоту.

Еще один способ задать собственное значение частоты: прописать в файле stm32f10x_conf.h следующие строки:

#if defined HSE_VALUE
  #undef HSE_VALUE
#endif
#define HSE_VALUE ((uint32_t)4000000) // 4 МГц

Во всех способах частота задается целым числом Герц.

Пример вызова функции RCC_GetClocksFreq():

RCC_ClocksTypeDef clocks;
RCC_GetClocksFreq(&clocks);

Кроме того, чтобы узнать источник системного тактирования микроконтроллера, можно воспользоваться функцией RCC_GetSYSCLKSource().

Прототип функции:

uint8_t RCC_GetSYSCLKSource(void)

Функция возвращает одно из значений:

  • 0x00: внутренний тактовый генератор (HSI)
  • 0x04: внешний тактовый источник (HSE)
  • 0x08: умножитель (PLL)

К сожалению библиотека SPL не имеет функций для вычисления тактовых частот конкретных периферийных устройств.
Код вычисляющий тактовые частоты таймеров:

uint32_t APB1_TIMCLK_Frequency;
uint32_t APB2_TIMCLK_Frequency;
RCC_ClocksTypeDef clocks;

RCC_GetClocksFreq(&clocks);

if (clocks.HCLK_Frequency == clocks.PCLK1_Frequency)
  APB1_TIMCLK_Frequency = clocks.PCLK1_Frequency;
else
  APB1_TIMCLK_Frequency = 2 * clocks.PCLK1_Frequency;

if (clocks.HCLK_Frequency == clocks.PCLK2_Frequency)
  APB2_TIMCLK_Frequency = clocks.PCLK2_Frequency;
else
  APB2_TIMCLK_Frequency = 2 * clocks.PCLK2_Frequency;