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
-
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:
1 2 3 4 5 6 7 8 9 |
/**@brief Input pin configuration. */ typedef struct { nrf_gpiote_polarity_t sense; /**< Transition that triggers interrupt. */ nrf_gpio_pin_pull_t pull; /**< Pulling mode. */ bool is_watcher : 1; /**< True when the input pin is tracking an output pin. */ bool hi_accuracy : 1; /**< True when high accuracy (IN_EVENT) is used. */ bool skip_gpio_setup : 1; /**< Do not change GPIO configuration */ } nrfx_gpiote_in_config_t; |
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
- NRF_GPIO_PIN_NOPULL //Không sử dụng trở kéo
- 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
1 2 3 4 5 6 |
void in_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action) { //Chương trình ngắt sẽ được viết tại đây } |
Bước 4: Khởi tạo sự kiện
1 2 3 |
nrfx_err_t nrfx_gpiote_in_init(nrfx_gpiote_pin_t pin, nrfx_gpiote_in_config_t const * p_config, nrfx_gpiote_evt_handler_t evt_handler) |
- 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
1 |
nrfx_gpiote_in_event_enable(nrfx_gpiote_pin_t pin, bool int_enable) |
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.
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