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. Тестовая плата. Прошивка через последовательный порт и через 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
Додати коментар
Недавні записи
- 🇺🇦 FOC Board STM32F103RB 🧩
- STM32 Motor control SDK - керування оборотами мотора за допомогою потенціометра 📑
- Flask✙Gunicorn✙Nginx➭😎
- STM32 Motor control SDK - програмне керування обертам мотора
- STM32 Motor control SDK - як створити перший проект
- Vue SVG. Приклад побудови живого параметричного креслення
- Вимірювання моменту мотора
- Vue SVG - компонент. Приклад 📑
- Flask + Vue 🏁 Финальный пример 🏁
- Flask, CORS, JSON-файл. Пример#6
Tags
bldc brushless stm32 motor web html css flask atmega foc git java-script pmsm raspberry-pi python websocket mongodb esp8266 nodemcu st-link tim timer docker ngnix programmator ssd1331 ssd1306 wifi uart meteo bme280 bmp280 i2c gps mpu-6050 mpu-9250 sensors 3d-printer options usb barometer remap watchdog flash eeprom rtc bkp encoder pwm servo capture examples dma adc nvic usart gpio books battery dc-dc sms max1674 avr lcd dht11 piezo rs-232 rfid solar exti bluetooth eb-500 displays ethernet led smd soldering mpx4115a hih-4000
Архіви