Giỏ hàng
Danh mục sản phẩm

Lập trình System tick STM32

Đăng bởi Buiprohd@gmail.com ngày bình luận

Bộ System tick STM32 để tạo thời gian chính xác để tạo delay

Trong hướng dẫn này, tôi sẽ giải thích về bộ đếm thời gian hệ thống (SysTick). Bộ đếm thời gian SysTick có thể được sử dụng để thực hiện chức năng trì hoãn. STM32F4 có bộ đếm thời gian hệ thống 24 bit, đếm ngược từ giá trị RELOAD về 0 (16.777.215 đến 0). Nguồn đồng hồ SysTick là 168 MHz nên 168.000.000 tick mỗi giây. Thời gian cần thiết để thực hiện một đánh dấu là 1 ÷ 168.000.000 5.952 ns.
 
Để sử dụng bộ đếm thời gian SysTick, chúng ta phải gọi hàm SysTick_Config có trách nhiệm khởi tạo bộ hẹn giờ đánh dấu hệ thống và ngắt nó và khởi động bộ hẹn giờ đánh dấu hệ thống. Bộ hẹn giờ ở chế độ chạy miễn phí để tạo ra các ngắt định kỳ. Đầu vào tham số của hàm SysTick_Config là số lần đánh dấu giữa hai lần ngắt (thời gian giữa hai lần ngắt). Bạn có thể thấy hàm SysTick_Config trong core_cm4.h.



 Ví dụ: nếu chúng ta muốn thực hiện ngắt mỗi 1 ms, chúng ta có thể đặt 1.000.000 ÷ 5.952 168.010.752 đánh dấu vào hàm SysTick_Config. Nhưng, kiểu dữ liệu của tham số đầu vào của hàm đó là uint32_t nên chúng ta chỉ có thể đặt số nguyên. Nếu chúng ta làm tròn số đánh dấu là 168.000, chúng ta có thể gọi biến SystemCoreClock chia cho 1000. SystemCoreClock là biến toàn cục chứa tần số hệ thống là 168 MHz.


Đây là mã ví dụ để thực hiện độ trễ với bộ đếm thời gian SysTick:
#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

__IO uint32_t msTick;

// This function will be called every 1ms
void SysTick_Handler(void)
{
    msTick--;
}

int main(void)
{
    // Enable GPIOD
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

    // Initialization for GPIO pin 13 (orange LED) as output
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD, &GPIO_InitStruct);

    // Update SystemCoreClock variable
    SystemCoreClockUpdate();
    // Make SysTick overflow every 1ms
    SysTick_Config(SystemCoreClock / 1000);

    while (1)
    {
        // Toggle LED
        GPIO_ToggleBits(GPIOD, GPIO_Pin_13);

        // Set delay 1s (1000ms)
        msTick = 1000;
        // Do nothing until msTick is zero
        while (msTick);
    }
}
 
 

Cũ hơn Mới hơn