сайт для палких паяльників

Тактирование – это сердце микроконтроллера. Для работы микроконтроллера сердце должно биться. Чем выше частота, тем быстрее работает микроконтроллер, но и больше потребляет энергии. И наоборот, чем меньше частота тактирования, тем меньше потребление энергии и меньше скорость работы контроллера. То же касается периферии. Тактирование следует настраивать в зависимости от текущих задач. В предыдущих примерах мы не трогали настройки тактирования и микроконтроллер работал с неизвестной нам частотой. Но в дальнейшем, при работе с периферией нам придется настраивать сам микроконтроллер и определенные модули на работу на конкретной частоте. Поэтому мы должны разобраться с этим вопросом.

STM32 имет 2 источника тактирования:

  1. HSI — Внутренний RC-генератор частотой 8 Мгц (для STM32F103). Не требует никаких дополнительных элементов. Частота может изменяться (плавать) в зависимости от температуры.
  2. HSE — Внешний кварцевый резонатор от 4 до 16 МГц. Обеспечивает высокую стабильность частоты.

Микроконтроллер имеет модуль PLL, который может умножать частоту. То есть, Вы сначала выбираете источник тактирования HSI или HSE а затем, настраиваете модуль PLL на выходе которого появляется нужна системная частота (SYSCLK). Если нам нужна максимальная стабильная частота работы ядра 72 МГц, мы выбираем внешний кварц HSE (8 МГц) и включаем PLL с множителем 9 (8 * 9 = 72). Далее эта частота (SYSCLK) через AHB Prescaler подается для тактирования периферии. На пути к конкретной периферии есть дополнительные делители частоты APB1, APB2, ADC Prescaler. С помощью которых настраивается частота тактирования конкретной периферии. Такая гибкость необходима потому, что некоторая периферия требует или конкретной частоты (например, USB должен тактироваться только определенной частотой 48МГц), или имеет лимит частоты (например АЦП должен тактироваться частотой не более 12МГц).

Микроконтроллер всегда стартует от внутреннего RC-генератора (8МГц), а все изменения тактирования выполняются программно. STM32 может вернуться к тактированию с HSI в случае, если выбранный ранее HSE по каким-то причинам “отвалился”. Также можно программно изменять режимы тактирования по ходу выполнения программы. Например, для перехода в режим энергосбережения, и тому подобное. Рассмотрим схему тактирования из документации к микроконтроллеру.

STM32_Clock_01

Пример настройки тактирования на 72МГц. Пример взят с файла RCC_Exp.c

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_flash.h"


void SetSysClockTo72(void)
{
    ErrorStatus HSEStartUpStatus;

    /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
    /* Системный RESET RCC (делать не обязательно, но полезно на этапе отладки) */
    RCC_DeInit();

    /* Включаем HSE (внешний кварц) */
    RCC_HSEConfig( RCC_HSE_ON);

    /* Ждем пока HSE будет готов */
    HSEStartUpStatus = RCC_WaitForHSEStartUp();

    /* Если с HSE все в порядке */
    if (HSEStartUpStatus == SUCCESS)
    {
	/* Следующие две команды касаются исключительно работы с FLASH.
	Если вы не собираетесь использовать в своей программе функций работы с Flash,
	FLASH_PrefetchBufferCmd( ) та FLASH_SetLatency( ) можно закомментировать */

        /* Включаем Prefetch Buffer */
    	FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);

        /* FLASH Latency.
	Рекомендовано устанавливать:
		FLASH_Latency_0 - 0 < SYSCLK≤ 24 MHz
		FLASH_Latency_1 - 24 MHz < SYSCLK ≤ 48 MHz
		FLASH_Latency_2 - 48 MHz < SYSCLK ≤ 72 MHz */
        FLASH_SetLatency( FLASH_Latency_2);

        /* HCLK = SYSCLK */ /* Смотри на схеме AHB Prescaler. Частота не делится (RCC_SYSCLK_Div1) */
        RCC_HCLKConfig( RCC_SYSCLK_Div1);

        /* PCLK2 = HCLK */ /* Смотри на схеме APB2 Prescaler. Частота не делится (RCC_HCLK_Div1)  */
        RCC_PCLK2Config( RCC_HCLK_Div1);

        /* PCLK1 = HCLK/2 */ /* Смотри на схеме APB1 Prescaler. Частота делится на 2 (RCC_HCLK_Div2)
        потому что на выходе APB1 должно быть не более 36МГц (смотри схему) */
        RCC_PCLK1Config( RCC_HCLK_Div2);

        /* PLLCLK = 8MHz * 9 = 72 MHz */
        /* Указываем PLL от куда брать частоту (RCC_PLLSource_HSE_Div1) и на сколько ее умножать (RCC_PLLMul_9) */
        /* PLL может брать частоту с кварца как есть (RCC_PLLSource_HSE_Div1) или поделенную на 2 (RCC_PLLSource_HSE_Div2). Смотри схему */
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

        /* Включаем PLL */
        RCC_PLLCmd( ENABLE);

        /* Ждем пока PLL будет готов */
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
        {
        }

        /* Переключаем системное тактирование на PLL */
        RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);

        /* Ждем пока переключиться */
        while (RCC_GetSYSCLKSource() != 0x08)
        {
        }
    }
    else
    { /* Проблемы с HSE. Тут можно написать свой код, если надо что-то делать когда микроконтроллер не смог перейти на работу с внешним кварцом */

        /* Пока тут заглушка - вечный цикл*/
        while (1)
        {
        }
    }
}

Вы также можете настроить прерывания и написать свой обработчик прерывания в случае, когда HSE отваливается уже в процессе работы. Но в этой статье мы не будем это рассматривать, потому что не сможем смоделировать и проверить такую ситуацию, не применяя к тестовой плате деструктивных методов. Пример того, как это делается, Вы можете найти в файле RCC_Exp.c

На схеме также есть LSI (low-speed internal clock) и LSE (low-speed external clock). Это внутренний низкочастотный RC-генератор и внешний низкочастотный кварцевый резонатор. Как видно, LSI используется для тактирования Watchdog (WDG) и может использоваться для тактирования встроенных часов (RTC). А LSE только для тактирования часов (RTC). Кстати, тактирования RTC может быть и от HSE. Но у нас на плате есть часовой кварц 32768 Гц (LSE), его мы и будем использовать по назначению – для часов реального времени. Работу с часами реального времени (RTC) и Watchdog (WDG) будем рассматривать позже.

Также следует отметить, что микроконтроллер имеет выход тактовой частоты MCO (Main Clock Output), который при необходимости можно настроить для тактирования внешних устройств. Делается это функцией RCC_MCOConfig которая описана в файле stm32f10x_rcc.h. Ее параметры могут быть следующие:

  • RCC_MCO_NoClock – включаем MCO
  • RCC_MCO_SYSCLK – подает SYSCLK на MCO
  • RCC_MCO_HSI – подает HSI на MCO
  • RCC_MCO_HSE – подает SYSCLK на MCO
  • RCC_MCO_PLLCLK_Div2 – подает деленную на 2 частоту PLLCLK

Не забываем кроме этого настроить соответствующий выход порта. В нашем случае это A8.

STM32F103C8

Памятка

Потребление микроконтроллера на различных рабочих частотах:

STM32_Clock_02

STM32_Clock_03

Желаю успехов!

Смотри также:

Translate
Архіви

© 2011-2019 Андрій Корягін, Кременчук - Київ, Україна