BÀI 04 : SYSTEM TICK TIMER VỚI STM32F1.
- Sơ lược về lý thuyết.
- Cấu hình với thư viện chuẩn của ST.
- Lợi dụng System Tick ta sẽ tạo 1 hàm delay tuyệt đối 1 ms như sau:
- Chương trình thực thi trong ngắt:
- Một số thanh ghi quan trọng.
- STK_CTRL - SysTick control and status register.
- COUNTFLAG : bằng 1 ở lần đầu tiên giá trị đếm = 0 và giữ nguyên trạng thái cho các lần tiếp theo.
- CLKSOURCE: chọn lựa nguồn clock source là AHB/8 hoặc AHB.
- TICKINT : có kiểm tra ngắt khi bộ đếm bằng 0 hay không.
- ENABLE: cho phép bộ đếm bắt đầu đếm hay không.
- STK_LOAD – SysTick reload value register.
- STK_VAL - SysTick current value register.
- Bài tập.
- Viết hàm Delay ms dùng system Tick timer có sử dụng ngắt.
- Viết hàm Delay ms dùng system Tick timer có sử dụng ngắt.
System Tick Timer là bộ timer 24 bit độc lập nằm trong lõi cortex. Bộ timer này là timer đếm xuống, xảy ra ngắt ở mức ưu tiên cao khi giá trị đếm bằng 0 và tự nạp lại giá trị đếm ban đầu.
System Tick Timer thường được được dùng để tạo hàm delay với độ chính xác cao, thay thế cho các hàm delay với độ chính xác tương đối dùng vòng lặp for hay while.
Ta sử dụng hàm có sẵn là SysTick_Config(SystemCoreClock/F); để cấu hình thời gian xảy ra ngắt System Tick. Ví dụ SystemCoreClock = 72M và F =1000. Thì giá trị nạp vào bộ System Tick là 72000-1, kết quả sau 1ms bộ đếm System Tick sẽ = 0 một lần -> xảy ra ngắt 1 lần và tên vector ngắt sẽ là SysTick_Handler nằm trong file stm32f10x_it.c.
SysTick_Handler là chương trình phục phụ ngắt khi giá trị của bộ đếm (thanh ghi STK_VAL) bằng 0 và được nhận biết bằng cờ COUNT FLAG.
CHÚ Ý: có nhiều kiểu khai báo biến Timingdelay. Khi sử dụng biến này ở nhiều file .c khác nhau thì cần khai báo “extern” trên mỗi file có sử dụng biến Timingdelay đó.
RELOAD: đây là giá trị đếm được truyền vào khi bộ đếm bắt đầu và khi bộ đếm bắt đầu lại khi tràn về 0. Giá trị thực của bộ đếm = giá trị truyền vào + 1. Giá trị tối đa của thanh ghi này = 2^24.
CURRENT[23:0] : thanh ghi này chứa giá trị đếm hiện tại của bộ đếm.
Chương trình system tick không dùng ngắt
bạn ơi, có phải là kể cả khi mình không dùng systick thì hệ thống vẫn chạy đúng không? nhưng do hàm ngắt systick để trống nên không có hiện tượng gì xảy ra phải không vậy?
ReplyDeletetại mình đọc thư viện thì không thấy có đoạn nào khai báo kiểu như để bắt đầu khởi tạo systick nên mình nghĩ nó luôn luôn chạy.
1. "có phải là kể cả khi mình không dùng systick thì hệ thống vẫn chạy đúng không" : cái này đúng nha bạn, hay còn gọi là system tick timer.
ReplyDelete2. "nhưng do hàm ngắt systick để trống nên không có hiện tượng gì xảy ra phải không vậy". khi chưa được cấu hình thì nó sẽ không chạy nha bạn. dùng hàm "SysTick_Config" trong thư viện chuẩn tương đương với việc tác động vào các thanh ghi và cho phép nó chạy.
3. Nếu bạn không sử dụng hàm "SysTick_Config" hoặc chưa cấu hình các thanh ghi của nó thì system tick timer này sẽ không chạy. bạn có thể kích chuột phải vào hàm này -> go to definition of ... hoặc bấm F12 thì sẽ thấy việc cấu hình.
bạn ơi cái chỗ "giá trị nạp vào bộ System Tick là 72000-1" mk tưởng là nó phải nhỏ hơn 2^16 chứ ạ
ReplyDeleteThanh ghi STK_LOAD 24 bit nên giá trị nạp vào là 72000 -1 thỏa mãn nha bạn.
DeleteCho mình hỏi là bit COUNTFLAG trong thanh ghi SysTick->CTRL sẽ tăng lên 1 khi VAL bằng 0 rồi giảm xuống 0 thi VAL nạp lại đúng không ạ?
ReplyDelete