<p>Тактовая частота, один из важнейших параметров МК. Этот параметр характеризует производительность. Чем она выше, тем больше операций сможет выполнить МК за единицу времени. Поэтому, при выборе МК обращайте на это внимание. Зачастую, в мелких проектах не требуется высокая производительность, но в некоторых случаях, производительности может не хватить. Выходов из такой ситуации несколько:</p>
<ul>
    <li>Оптимизация кода (сокращение количества операций в критической секции);</li>
    <li>"Разгон". Да, STM32 можно разогнать, но не всегда это реально, так как некоторая периферия работает только на определенной частоте;</li>
    <li>Замена МК на более производительный.</li>
</ul>
<p>Разберемся как устроена система тактирования в STM32. Рассмотрим структурную схему системы формирования тактовых частот из официальной документации.</p>
<a class="highslide" href="http://stm32dev.ru/uploads/posts/2017-06/1497958387_clock.png"><img class="fr-dib fr-draggable" src="/uploads/posts/2017-06/medium/1497958387_clock.png" alt=""></a>
<p>Из схемы видно, что большая часть периферии подключена к линии <b>SYSCLK</b>(Системная частота). Именно ее максимальный номинал характеризует МК по частоте. В документации пишут максимальную частоту на которой производитель гарантирует стабильную работу. Как я уже писал ранее мы имеем возможность повысить частоту, но это на свой страх и риск.</p>
<p>Конечная линия нам известна, но начнем мы более подробный разбор с источников тактирования. Если внимательно рассмотреть схему, можно заметить что линии тактирования разделены на <b>HS&nbsp;</b>и <b>LS</b>. <b>HS</b>(High speed) предназначена для тактирования основной периферии. <b>LS</b>(Low speed) - для тактирования <b>RTC</b>(Real time clock) часов реального времени и <b>IWDG</b>(Independent Watchdog).</p>
<p>В свою очередь обе линии могут быть подключены либо к соответствующим внутренним генераторам ТЧ, либо к внешним.</p>
<p>Внутренний генератор <b>HSI&nbsp;</b>имеет частоту 8 МГц. При подаче питания, МК стартует с использованием <b>HSI&nbsp;</b>и только после переходит на работу от внешнего источника, если данная функция активна. Так же за счет такой схемы в МК предусмотрена функция автоматического перехода на внутреннее тактирование с помощью модуля <b>CSS</b>, в случае выхода из строя внешнего источника ТЧ. Что гарантирует его работу не зависимо от выбранного источника. Сразу может возникнуть вопрос, зачем нам тогда нужен внешний источник при наличии внутреннего? Дело в том, что частота внутреннего источника может "плавать" при изменении температуры, а с учетом умножения частоты отклонения могут быть весьма ощутимы. Такие отклонения могут привести к нестабильной работе МК или его периферии. Поэтому на практике чаще всего применяют внешние источники.</p>
<p><b>LSI&nbsp;</b>имеет частоту 40 кГц и обладает теми же недостатками что и <b>HSI</b>. К тому же часам для точной работы необходим сигнал с частотой 32.768 кГц.</p>
<p>Для внешнего тактирования используются источники с частотой 4-25 МГц для <b>HSE&nbsp;</b>и 32.768 кГц для <b>LSE</b>.</p>
<p>С источниками разобрались, теперь проследуем дальше.</p>
<p>С линией <b>LS&nbsp;</b>ничего сложного. На <b>IWDG&nbsp;</b>идет источник только <b>LSI</b>. На <b>RTC&nbsp;</b>сигнал поступает переключателя <b>RTCSEL&nbsp;</b>которому на вход приходят <b>LSI</b>, <b>LSE&nbsp;</b>и <b>HSE</b>/128.</p>
<p>А вот с линией HS уже интереснее. В зависимости от модели МК у нас может быть несколько переключателей источников тактирования, а так же делителей и умножителей частоты (<b>PLL</b>). Так или иначе целью нашей задачи является выбор источника тактирования и его проследование до <b>SYSCLK</b>. А так же в ходе его проследования, подбор необходимых коэффициентов делителей и умножителей таким образом, чтобы выйти на требуемую для работы МК частоту.</p>
<p>STM32 имеет возможность вывода тактовой частоты на контакт MCO (в основном PA8, но в некоторых моделях могут быть отличия). Источник при этом выбирается программно. Это могут быть как встроенные генераторы так и SYSCLK и другие линии тактирования. Необходимость такого вывода обусловлена контролем частоты МК или тактированием внешнего устройства.</p>
<a class="highslide" href="http://stm32dev.ru/uploads/posts/2017-06/1498043212_clock2.png"><img class="fr-dib fr-draggable" src="/uploads/posts/2017-06/thumbs/1498043212_clock2.png" alt=""></a>
<p>Настройка всех элементов системы тактирование осуществляется с помощью соответствующих регистров. Наименования регистров могут отличаться в зависимости от линейки STM32, поэтому придется пролистать документацию на соответствующую модель. Но чтобы облегчить нам жизнь, STMicroelectronics предоставила нам отличный инструмент - CubeMX.</p>
<a class="highslide" href="http://stm32dev.ru/uploads/posts/2017-06/1497963113_clock1.png"><img class="fr-dib fr-draggable" src="/uploads/posts/2017-06/medium/1497963113_clock1.png" alt=""></a>
<p>После создания проекта в CubeMX, перейдем во вкладку Clock Configuration. Здесь предоставлена форма для настройки тактовой частоты. Причем все в наглядном и доступном виде. CubeMX не только предоставляет возможность настроить в ручную и проследить прохождение тактового сигнал, но и автоматически подобрать коэффициенты делителей и умножителей при выставлении заданного номинала в <b>HCLK</b>.</p>
<p>После генерации исходных файлов проекта, вы можете посмотреть что получилось в функции <b>SystemClock_Config&nbsp;</b>расположенной в файле <b>main.c</b>.</p><pre class="language-markup"><code>void SystemClock_Config(void)
{

&nbsp; RCC_OscInitTypeDef RCC_OscInitStruct;
&nbsp; RCC_ClkInitTypeDef RCC_ClkInitStruct;

&nbsp; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
&nbsp; RCC_OscInitStruct.HSEState = RCC_HSE_ON;
&nbsp; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV5;
&nbsp; RCC_OscInitStruct.Prediv1Source = RCC_PREDIV1_SOURCE_PLL2;
&nbsp; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
&nbsp; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
&nbsp; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
&nbsp; RCC_OscInitStruct.PLL2.PLL2State = RCC_PLL2_ON;
&nbsp; RCC_OscInitStruct.PLL2.PLL2MUL = RCC_PLL2_MUL8;
&nbsp; RCC_OscInitStruct.PLL2.HSEPrediv2Value = RCC_HSE_PREDIV2_DIV5;
&nbsp; if (HAL_RCC_OscConfig(&amp;RCC_OscInitStruct) != HAL_OK)
&nbsp; {
&nbsp; &nbsp; Error_Handler();
&nbsp; }

&nbsp; RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
&nbsp; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
&nbsp; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
&nbsp; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
&nbsp; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
&nbsp; if (HAL_RCC_ClockConfig(&amp;RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
&nbsp; {
&nbsp; &nbsp; Error_Handler();
&nbsp; }

&nbsp; HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

&nbsp; HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

&nbsp; __HAL_RCC_PLLI2S_ENABLE();
}</code></pre>
<p>Не каких регистров в данном коде вы естественно не найдете, так как CubeMX генерирует код на основе библиотеки HAL. Но особо любознательные могут проследовать по функциям инициализации и найти их.</p>
<p>На конец стоит отметить, что почти вся периферия отключена от тактирования, это сделано с целью экономии электро питания. Включение тактирования для каждого периферийного устройства производится отдельно.</p><pre class="language-markup"><code>__HAL_RCC_GPIOB_CLK_ENABLE();//включение тактирования для порта PB

__HAL_RCC_USART1_CLK_ENABLE();//включение тактирования для модуля USART1</code></pre>
<p>При выборе периферии в CubeMX, после генерации кода, функции включения тактирования будут помещены в соответствующие функции инициализации <b>HAL_XXX_MspInit&nbsp;</b>в файле <b>stm32fxxx_hal_msp.c</b>. Например для <b>USART1&nbsp;</b>такая функция будет иметь название <b>HAL_UART_MspInit</b>. Если вы сами инициализируете периферию не забывайте про включение тактирования, иначе будете долго гадать, почему она у вас не работает.</p>
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


© Copyright 2017. Все права защищены.
Яндекс.Метрика