Chia sẻ STM32_Study: #02-SysTick module

#1
System Tick là một bộ Timer 24 bit count down, auto-reload. Timer này là chuyên biệt của core ARM nhưng cũng có thể sử dụng như một bộ downcounter thông dụng. SysTick sẽ gây một sự kiện ngắt khi giá trị xung clock về 0. Ta thường hay dùng SysTick làm bộ đếm của hệ thống và delay một khoảng thời gian với độ chính xác cao.
Xét ví dụ sau: Có 4 led nối lần lượt vào PA0, PA1, PA2, PA3. Viết chương trình sáng lần lượt PA0, PA1, PA2, PA3 theo chu kỳ 500ms (dùng SysTick Timer).
P3.png

Với ví dụ này thì chúng ta sử dụng lại "LED module" của bài tập trước
1. SysTick module - Delay in milisecond
SysTick module cung cấp hàm
Mã:
void SysTick_DelayMs(uint32_t nTime)
để delay một khoảng thời gian có timebase là 1 milisecond. Vì vậy muốn delay một khoảng thời gian 500ms (theo ví dụ) thì ta chỉ việc gọi SysTick_DelayMs(500)
Lời giải của ví dụ trên như sau:
Mã:
/* Function to turn off all leds */
void TurnOffAllLeds(void)
{
  LED1_OFF;
  LED2_OFF;
  LED3_OFF;
  LED4_OFF;
}

int main(void)
{
  /* Configure SysTick module */
  SysTick_Configuration();
  /* Configure LEDs module */
  LED_Configuration();   
 
  while (1)
  {
     /* Only LED1 ON */
     TurnOffAllLeds();
     LED1_ON;
     SysTick_DelayMs(500);
     
     /* Only LED2 ON */
     TurnOffAllLeds();
     LED2_ON;
     SysTick_DelayMs(500);
     
     /* Only LED3 ON */
     TurnOffAllLeds();
     LED3_ON;
     SysTick_DelayMs(500);
     
     /* Only LED4 ON */
     TurnOffAllLeds();
     LED4_ON;
     SysTick_DelayMs(500);
  }
}
2. SysTick module - Timeout
Timeout thường hay sử dụng khi chúng ta làm về truyền thông, hay chờ đợi một sự kiện nào đó mà ta không biết trước là nó có xảy ra hay không.
Ví dụ khi ta làm về truyền thông 2 con STM32 bằng I2C, ta hay viết:
P5.png

viết vòng lặp while khi check sự kiện thực sự nguy hiểm, vì có thể một lúc nào đó bộ I2C của chú STM32 bị problem thì chương trình của ta sẽ chết cứng ở đây.
Thay vào đó ta dùng Timeout của SysTick:
P6.png

Như vậy ta thấy sau Timeout 10ms mà không có gì chuyển biến thì ta thoát được vòng lặp while :D
Okie, với module này mình xin kết thúc ở đây. Các bạn down module ở file đính kèm nhé.
 

Đính kèm

bibacky

Học sinh trung cấp
#2
anh ơi! Anh có project nào viết về kết nối usb không. Hướng dẫn em với :).Em đang nghiên cứu mà thấy bế tắc quá ạ
Em cảm ơn
 
#3
System Tick là một bộ Timer 24 bit count down, auto-reload. Timer này là chuyên biệt của core ARM nhưng cũng có thể sử dụng như một bộ downcounter thông dụng. SysTick sẽ gây một sự kiện ngắt khi giá trị xung clock về 0. Ta thường hay dùng SysTick làm bộ đếm của hệ thống và delay một khoảng thời gian với độ chính xác cao.
Xét ví dụ sau: Có 4 led nối lần lượt vào PA0, PA1, PA2, PA3. Viết chương trình sáng lần lượt PA0, PA1, PA2, PA3 theo chu kỳ 500ms (dùng SysTick Timer).
Xem đính kèm 35842
Với ví dụ này thì chúng ta sử dụng lại "LED module" của bài tập trước
1. SysTick module - Delay in milisecond
SysTick module cung cấp hàm
Mã:
void SysTick_DelayMs(uint32_t nTime)
để delay một khoảng thời gian có timebase là 1 milisecond. Vì vậy muốn delay một khoảng thời gian 500ms (theo ví dụ) thì ta chỉ việc gọi SysTick_DelayMs(500)
Lời giải của ví dụ trên như sau:
Mã:
/* Function to turn off all leds */
void TurnOffAllLeds(void)
{
  LED1_OFF;
  LED2_OFF;
  LED3_OFF;
  LED4_OFF;
}

int main(void)
{
  /* Configure SysTick module */
  SysTick_Configuration();
  /* Configure LEDs module */
  LED_Configuration();  

  while (1)
  {
     /* Only LED1 ON */
     TurnOffAllLeds();
     LED1_ON;
     SysTick_DelayMs(500);
    
     /* Only LED2 ON */
     TurnOffAllLeds();
     LED2_ON;
     SysTick_DelayMs(500);
    
     /* Only LED3 ON */
     TurnOffAllLeds();
     LED3_ON;
     SysTick_DelayMs(500);
    
     /* Only LED4 ON */
     TurnOffAllLeds();
     LED4_ON;
     SysTick_DelayMs(500);
  }
}
2. SysTick module - Timeout
Timeout thường hay sử dụng khi chúng ta làm về truyền thông, hay chờ đợi một sự kiện nào đó mà ta không biết trước là nó có xảy ra hay không.
Ví dụ khi ta làm về truyền thông 2 con STM32 bằng I2C, ta hay viết:
Xem đính kèm 35843
viết vòng lặp while khi check sự kiện thực sự nguy hiểm, vì có thể một lúc nào đó bộ I2C của chú STM32 bị problem thì chương trình của ta sẽ chết cứng ở đây.
Thay vào đó ta dùng Timeout của SysTick:
Xem đính kèm 35844
Như vậy ta thấy sau Timeout 10ms mà không có gì chuyển biến thì ta thoát được vòng lặp while :D
Okie, với module này mình xin kết thúc ở đây. Các bạn down module ở file đính kèm nhé.
rất cám ơn bác vì cách viết rất sáng sủa và luôn đi thẳng vào trọng tâm của vấn đề nhờ bác em tiết kiệm đc khối thời gian
 

tam762410

Sinh viên đại học
#4
có thể sử dụng cho STM32F4 không bạn.. Với lại có thể giải thích cho mình hiểu phần cấu hình của nó được không.. Xung Clock Systick có giá trị bao nhiêu trong ví dụ trên...
 

tam762410

Sinh viên đại học
#5
à mình đã tìm ra.. Cám ơn sự chia sẽ của bạn.........
SysTick interrupt period = the Reload Value register divided by clock frequency
= (SystemCoreClock/1000)/SystemCoreClock = 1/1000 = 1m
 
#8
cái món stm nầy nó có tốc độ lấy adc là bao nhiêu j giờ mình thấy sao nó rẻ quá
 
#9
Anh ơi,sự khác nhau của system tick và ngắt timer là gì,em thấy nó giống nhau mà
 

ga_cong

Kỹ sư
#10
dungvt bài viết của bác rất hay, tôi chỉ có 1 góp ý rất nhỏ là những bức ảnh có code thì lại bị che mất vài chữ quan trong.
 

Quảng cáo Google