30/09/2018, 20:21

Hỏi về ngắt timer trong STM32F4

AE cho hỏi cái biến time trong hàm xử lý ngắt timer 4 của STM32F4 này có chức năng là gì???

void TIM4_IRQHandler(void)
  {
    static uint32_t time=0;
    if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
    {
      if(++time>1000)
      {
        GPIO_ToggleBits(GPIOD,GPIO_Pin_12);
        time = 0;
      }
     TIM_ClearITPendingBit(TIM4, TIM_IT_Update); 
    }
  }
Lê Tuấn Anh viết 22:24 ngày 30/09/2018

Biến time này dùng để đếm số lần xảy ra ngắt, nếu lớn hơn 1000 thì nháy ở Pin_12 (chắc là led).
Nhưng theo như code thì có vẻ sai, vì vừa vào hàm đã gán bằng 0 mất rồi nên sẽ không bao giờ nháy được đâu.

Trần Dương viết 22:24 ngày 30/09/2018

các này dùng timer đếm biến time, thì time cứ đến 1000 thì đảo bit

Trần Dương viết 22:32 ngày 30/09/2018

hình như bỏ static đi là đc

Lê Tuấn Anh viết 22:28 ngày 30/09/2018

opps, code vẫn chạy bình thường nha, mình quên để ý đã khai báo static [quote=“Tran_Anh_Vu, post:1, topic:24014”]
static uint32_t time=0
[/quote]
Nếu bỏ static thì biến time sẽ luôn bằng 0.
Thêm nữa, trong lập trình nhúng, nhất là các biến trong xử lý ngắt thì nên khai báo là volatile để tránh khi optimize code biến này không được cập nhật. Do đó chúng ta nên khai báo biến time là: volatile static uint32_t time = 0;

superuser10 viết 22:28 ngày 30/09/2018

Trong ngắt nào mà có khai báo biến thì luôn luôn nên Volatile à bạn? Tiện thể có phải bạn dev nhúng à, có tài liệu gì hay, or kinh nghiệm, project gì stm32f4 f1 code về CAN/LIN, USB xin với? Tks

Lê Tuấn Anh viết 22:30 ngày 30/09/2018

Những biến trong xử lý ngắt thì nên thêm volatile
Các project thì trên mạng nhiều lắm, bạn tìm kiếm thêm xem. Các chuẩn truyền thông cơ bản thì có nhiều tài liệu rồi, bạn làm quen 1 cái dần dần đọc hiểu sẽ nhanh hơn.

Bài liên quan
0