4. STM32. Програмування STM32F103. Тактування
Тактування - це серце мікроконтролера. Для роботи мікроконтролера серце має битися. Чим вища частота, тим швидше працює мікроконтролер, але і більше споживає енергії. І навпаки, чим менша частота тактування, тим менше споживання енергії та менша швидкість роботи контролера. Те саме стосується периферії. Тактування слід налаштовувати в залежності від поточних задач. У попередніх прикладах ми не займали налаштування тактування і мікроконтролер працював з невідомою нам частотою. Але у подальшому, при роботі з периферією нам прийдеться налаштовувати сам мікроконтролер і певні модулі на роботу на конкретній частоті. Тому ми маємо розібратися з цим питанням.
STM32 має 2 джерела тактування:
- HSI — Внутрішній RC-генератор частотою 8 Мгц (для STM32F103). Не потребує ніяких додаткових елементів. Частота може змінюватися (плавати) в залежності від температури.
- HSE — Зовнішній кварцовий резонатор від 4 до 16 Мгц. Забезпечує високу стабільність частоти.
Мікроконтролер завжди стартує від внутрішнього RC-генератора (8МГц), а всі зміни тактування виконуються програмно. STM32 може повернутися до тактування з HSI у випадку, якщо обраний раніше HSE з якихось причин "відвалився". Також можна програмно змінювати режими тактування у ході виконання програми. Наприклад, для переходу у режим енергозбереження, тощо. Роздивимось схему тактування з документації до мікроконтролера.
Приклад налаштування тактування на 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
Пам`ятка
Споживання мікроконтролера на різних робочих частотах:Бажаю успіхів!
Дивись також:
- 1. STM32. Програмування STM32F103. Тестова плата. Прошивка через UART та через ST-Link
- 2. STM32. Програмування. IDE для STM32
- 3. STM32. Програмування STM32F103. GPIO
- 4. STM32. Програмування STM32F103. Тактування
- 5. STM32. Програмування STM32F103. USART
- 6. STM32. Програмування STM32F103. NVIC
- 7. STM32. Програмування STM32F103. ADC
- 8. STM32. Програмування STM32F103. DMA
- 9. STM32. Програмування STM32F103. TIMER
- 10. STM32. Програмування STM32F103. TIMER. Захоплення сигналу
- 11. STM32. Програмування STM32F103. TIMER. Encoder
- 12. STM32. Програмування STM32F103. TIMER. PWM
- 13. STM32. Програмування STM32F103. EXTI
- 14. STM32. Програмування STM32F103. RTC
- 15. STM32. Програмування STM32F103. BKP
- 16. STM32. Програмування STM32F103. Flash
- 17. STM32. Програмування STM32F103. Watchdog
- 18. STM32. Програмування STM32F103. Remap
- 19. STM32. Програмування STM32F103. I2C Master
- 20. STM32. Програмування STM32F103. I2C Slave
- 21. STM32. Програмування STM32F103. USB
- 22. STM32. Програмування STM32F103. PWR
- 23. STM32. Програмування STM32F103. Option bytes
- 24. STM32. Програмування STM32F103. Bootloader
- STM32. Скачати приклади
- System Workbench for STM32 Інсталяція на Ubuntu
- Keil uVision5 – IDE для STM32
- IAR Workbench – IDE для STM32
- Керування безколекторним двигуном постійного струму (BLDC) за допомогою STM32
- Керування PMSM за допомогою STM32
Дивись на схемі AHB2 Prescaler. Дивись на схемі AHB1 Prescaler. Нема таких прескалерів ні на схемі ні в дейташиті вцілому. Маються на увазі APB1 та APB2?
Дякую. Помилку виправив. Так. Малося на увазі APB1 та APB2.
Недавні записи
- FOC - своя реалізація векторного керування. Підбиваю підсумки 2022 року
- Конструктор регуляторів моторів. Підбиваю підсумки 2022 року.
- Чому трифазні мотори стали такими популярними?
- FOC & Polar coordinates
- Конструктор регуляторів PMSM, BLDC двигунів
- Своя бібліотека для векторного керування безколекторними моторами
- Not Allowed
- Адаптивний ПІД регулятор
- Конструктор регуляторів моторів. Структура.
- Конструктор регуляторів моторів. Анонс.
Tags
st-link 3d-printer encoder servo solar java-script git wifi uart mpu-9250 sensors capture motor esp8266 nodemcu usb usart piezo rfid css atmega bmp280 bkp avr displays brushless watchdog battery sms rs-232 tim mpu-6050 barometer examples nvic pmsm dc-dc eb-500 soldering meteo rtc gpio books websocket docker dht11 led smd stm32 web timer dma lcd mpx4115a hih-4000 bldc ssd1306 adc mongodb python options eeprom raspberry-pi remap max1674 programmator ethernet foc ngnix ssd1331 gps flash exti bluetooth html bme280 i2c pwm flask
Архіви