ARM

[Tiva C] Một số chú ý khi sử dụng Interrupt

Bài viết này tóm tắt một số chú ý khi sử dụng Nested Vectored Interrupt Controller (NVIC) trên Tiva C MCUs với bộ thư viện TivaWare.


Global Interrupts của Tiva C MCUs được kích hoạt ngay sau khi MCU reset, do đó cần chú ý disable global interrupt trước khi tiến hành thiết lập các cài đặt cho MCU.

Functions:

bool IntMasterDisable(void); // disable global interrupt
bool IntMasterEnable(void); // enable global interrupt

Interrupt handlers cho một tín hiệu interrupt từ ngoại vi có thể được thiết lập bằng 02 cách:

  • Static configuration: thiết lập handler cho interrupt bằng cách chỉnh sửa Vector Table trong startup code. Cách thiết lập này cho phép thời gian phản hồi của interrupt rất nhanh, tuy nhiên lại làm cho chương trình khó mở rộng;
  • Run-time configuration: thiết lập handler cho interrupt bằng cách sử dụng function IntRegister() hoặc function tương đương của ngoại vi (ví dụ như UARTIntRegister()). Cách thiết lập này cho phép chương trình dễ dàng mở rộng, nhưng thời gian phản hồi của interrupt sẽ chậm lại một chút.

CHÚ Ý:

  • dù thực hiện cách thiết lập nào, interrupt từ ngoại vi phải được enable bởi function IntEnable() và fuction tương ứng của ngoại vi (ví dụ như function UARTIntEnable());
  • nếu sử dụng function tương ứng với ngoại vi để thiết lập interrupt handle (ví dụ như UARTIntRegister()) thì KHÔNG cần phải gọi function IntEnable() nữa;
  • Run-time configuration yêu cầu Interrupt Handler Table phải được đặt ở địa chỉ bắt đầu của SRAM với 1-kB boundary (không cần lo lắng vì thư viện TivaWare đã thiết lập sẵn).
  • System stack cần phải đủ lớn để tránh bị tràn (từ 1kB đến 2kB). Điều chỉnh system stack bằng cách thay đổi kích thước của mảng pui32Stack trong startup code: static uint32_t pui32Stack[512];.

Functions:

// Valid interrupt list: page 347 TivaWare User's Guide.
// ex. INT_GPIOA, INT_TIMER0A,...
void IntEnable(uint32_t ui32Interrupt);
void IntDisable(uint32_t ui32Interrupt);
void IntRegister(uint32_t ui32Interrupt, void (*pfnHandler)(void));
void IntUnregister(uint32_t ui32Interrupt);

Leave a comment