25. STM32. SysTick
STM32. SysTick (на русском языке)
Системний таймер STM32 SysTick
STM32 має системний таймер SysTick. Це найпростіший лічильник з автоматичним завантаженням початкового значення при досягненні лічильником 0. Кожен раз, коли лічильник досягає нуля викликається переривання. Для обробки переривання потрібно написати обробник SysTick_Handler. Ось все що вміє робити цей таймер. Проте він досить часто використовується для виконання різних завдань. У цій статті ми задіємо його для реалізації простої затримки.Ініціалізація таймера виконується однією командою:
SysTick_Config (SystemCoreClock / 1000);
Задається частота з якою таймер буде викликати переривання, і відповідно, викликати SysTick_Handler. В даному випадку ми задаємо 1000 герц. Тобто, переривання буде генеруватися 1000 раз на секунду. Далі у нас оголошена змінна sysTickCount, в яку ми будемо завантажувати кількість мілісекунд, а обробник переривання таймера буде зменшувати значення змінної на 1 кожну мілісекунду. Нам лишається тільки почекати поки sysTickCount не буде дорівнювати 0.
Приклад функцій затримки для STM32 з використанням SysTic:
stm32f10x.h:
#ifndef SYSTICKDELAY_H_
#define SYSTICKDELAY_H_
void sysTickDalayInit ();
void sysTickDalay (uint32_t nTime);
void sysTickSet (uint32_t nTime);
uint32_t sysTickGet ();
#endif
stm32f10x.c:
#include "stm32f10x.h"
static volatile uint32_t sysTickCount = 0;
void SysTick_Handler ()
{
if (sysTickCount! = 0) {
sysTickCount--;
}
}
void sysTickDalayInit () {
SysTick_Config (SystemCoreClock / 1000);
}
void sysTickDalay (uint32_t nTime)
{
sysTickCount = nTime;
while (sysTickCount! = 0);
}
void sysTickSet (uint32_t nTime)
{
sysTickCount = nTime;
}
uint32_t sysTickGet ()
{
return sysTickCount;
}
Ці функції можуть бути використані у два способи:
1. використовувати функцію sysTickDalay. В цьому випадку мікроконтролер буде просто чекати. Така затримка підійде, якщо під час запуску Вашого пристрою потрібно зробити невелику паузу. Наприклад, Ви намалювали на екрані заставку або привітання, та бажаєте щоб користувач встиг насолодитися її красою. А мікроконтролеру в цей час вкрай нічого робити.
2. використовувати дві функції sysTickSet та sysTickGet. sysTickSet задає час затримки у мілісекундах, а sysTickGet повертає скільки мілісекунд залишилося до кінця затримки. Наприклад, мікроконтролер виконує у циклі якусь процедуру, але періодично, наприклад раз на секунду, потрібно виконувати якісь додаткові операції. Спочатку задаємо необхідний час, наприклад одну секунду sysTickSet(1000); а потім у циклі опитуємо стан змінної:
if (sysTickGet () == 0) {
// Щось, що треба робити раз на секунду
sysTickSet (1000);
}
Приклад блимання світлодіодом із застосуванням затримки на системному таймері SysTick:
#include "stm32f10x.h"
#include "sysclk.h"
#include "systickdelay.h"
int main(void)
{
uint32_t i;
// Set clock
SetSysClockTo72();
// SysTick Init
sysTickDalayInit();
GPIO_InitTypeDef GPIO_InitStructure;
/* Initialize LED which connected to PC13 */
// Enable PORTC Clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
/* Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* Toggle LED which connected to PC13*/
for (i = 0; i < 10; i++) {
GPIOC->ODR ^= GPIO_Pin_13;
sysTickDalay(500); // Delay & wait
}
while (1) {
// do something
// ..
if (sysTickGet() == 0) {
sysTickSet(1000);
GPIOC->ODR ^= GPIO_Pin_13;
}
}
}
Точність затримки в запропонованому прикладі достатня тільки для поблимати світлодіодом та інших подібних завдань. Давайте припустимо, що ми бажаємо отримати затримку 1 мілісекунду. Оскільки функція sysTickSet може бути викликана буквально перед тим як таймер викличе переривання, у нас може трапиться, що затримки взагалі не буде. Тобто якщо ми зробимо так: sysTickSet(1);, затримки 1 мілісекунду ми практично ніколи не отримаємо, вона завжди буде різною і менше однієї мілісекунди.
У другій частині прикладу на точність затримки додатково впливає навантаженість контролера. Точність складно гарантувати, оскільки нам не відомо на скільки завантажений контролер і коли у нього буде час "звернути увагу" на стан змінної. Тому цю реалізацію можна використовувати коли не потрібна супер точність.
Існують методи, які дозволяють зробити більш точну затримку, але в цій статті вони розглядатися не будуть.
Ви можете використовувати таймер SysTick для виконання періодичних операцій майже як звичайний таймер. Для цього треба необхідні функції вставити в обробник переривання SysTick_Handler(). Зрозуміло, в цьому випадку, клопоту з точністю вимірювання часу не буде.
Виникає питання: який максимально можливий період можна встановити для SysTick? Максимально можливий період розраховується за формулою: 2 ^ 24 / SystemCoreClock. Тобто Коли ми налаштовуємо таймер функцією SysTick_Config(), параметр, який ми їй передаємо не має бути більше за 24 бітне число. Якщо у нас мікроконтролер працює на частоті 72Мгц, тоді 16777216/72000000 = 0.233 секунди. Якщо мікроконтролер працює на частоті 1Мгц, тоді 16777216/1000000 = 16.777 секунди.
Зкачати приклад для System Workbench for STM32: STM32F103/Example_SysTick
Успіхів.
Дивись також:
- 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
Додати коментар
Недавні записи
- 🇺🇦 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
Архіви