Task và event trên các chân I/O của nRF52832 SoC Bluetooth

Ngoài việc lập trình GPIO theo phương pháp phổ thông như bài hướng dẫn trước đã trình bày thì chúng ta còn có thể việc làm việc với các I/O này thông qua các Task và Event được thiết kế trong khối GPIOTE của nRF52832 SoC với 8 channels. 

I/ TASK

Mỗi GPIOTE channel hỗ trợ 03 task để thực hiện việc ghi, thay đổi giá trị logic của 1 chân, 3 task này giống với tính năng OUPUT của khối GPIO. 
  • Set: Cài đặt mức logic của 1 chân lên 1 (chân đó được nối với nguồn)
  • Clear: Cài đặt mức locgic của 1 chân về 0 (chân đó được nối với đất)
  • Toggle: Đổi mức logic của 1 chân so với trạng thái trước đó. 

II/EVENT

Một event có thể được tạo ra trên mỗi GPIOTE channel khi có 1 trong các điều kiện tác động đầu vào sau:

  • Rising edge: phát hiện cạnh sườn lên (mức logic thay đổi từ 0 lên 1)
  • Falling edge: phát hiện cạnh sườn xuống (mức logic thay đổi từ 1 về 0)
  • Any change: phát hiện cả sườn lên và sường xuống. 

Điểm ưu việt của Event là giúp cho chúng ta phát hiện được sự kiện thay đổi ngay lập tức để có thể thực hiện các công việc tương ứng với sự kiện đó. Nếu chỉ dùng tính năng INPUT thông thường thì chúng ta chỉ có thể phát hiện khi câu lệnh đọc và kiểm tra giá trị logic được thực hiện. 

III/LẬP TRÌNH EVENT 

Để lập trình Event của khối GPIOTE chúng ta sử dụng thư viện nrf_drv_gpiote.h đã được hãng Nordic cung cấp trong nRF52 SDK. 
Mình sẽ hướng dẫn các bạn các bước để lập trình 1 event để phát hiện sự kiện thay đổi mức logic trên 1 chân của nRF52832 SoC Bluetooth.

Bước 1: Dùng hàm nrf_drv_gpiote_init() để cho phép sử dụng khối GPIOTE

Bước 2: Khai báo 1 struct có kiểu nrfx_gpiote_in_config_t đã được khai báo như sau:

Các member và ý nghĩa:

  • sense: cấu hình chọn sự kiện 
    • NRF_GPIOTE_POLARITY_LOTOHI  // chọn sườn lên của tín hiệu 0->1 
    • NRF_GPIOTE_POLARITY_HITOLO  // chọn sườn xuống
    • NRF_GPIOTE_POLARITY_TOGGLE // chọn cả 2 sườn
  • pull: cấu hình trở kéo
    • NRF_GPIO_PIN_NOPULL          //Không sử dụng trở kéo
      NRF_GPIO_PIN_PULLDOWN   //Sử dụng trở kéo xuống
      NRF_GPIO_PIN_PULLUP          //Sử dụng trở kéo lên
  • is_watcher            //True when the input pin is trackingan output pin
  • hi_accuracy          //True when high accuracy (IN_EVENT) is used
  • skip_gpio_setup   //Do not change GPIO configuration

Khai báo:nrfx_gpiote_in_config_t  in_config;  //Các bạn khai báo thêm các struct member

Bước 3: Định nghĩa hàm xử lý sự kiện: 

Ví dụ mình khai báo hàm xử lý sự kiện khi phát hiện sườn ngắt có tên là in_pin_handler

Bước 4: Khởi tạo sự kiện

  • pin : là chân mình muốn cấu hình
  • *p_config : ta gán  địa chỉ của struct mình đã tạo ở bước 1
  • evt_handler : là tên hàm ta sẽ sử dụng để xử lí ngắt

Bước 5: Cho phép sử dụng

Với

  • pin : là chân có thể tạo ra ngắt đã cấu hình ở trên
  • int_enable : đặt giá trị true/false nếu cho phép/không cho phép tạo ngắt.
Nâng cao: Bạn có thể điều khiển chân output trực tiếp thông qua event bằng cách cấu hình task cho chân output đó rồi kết nối event và task thông qua PPI (Programmable peripheral interconnect) mà không cần xử lí trong hàm xử lý sự kiện. 
Lưu ý: Khi sử dụng GPIOTE cho chân nào thì chân đó sẽ không sử dụng GPIO phổ thông được nữa.

Theo dõi chuỗi hướng dẫn về Bluetooth Low Energy, Bluetooth Mesh tại đây. Chúc các bạn thành công! 

Nhóm TAPIT R&D