You are currently viewing FRDM-KL46Z #6: Lập trình ghép nối cổng GPIO với đèn LED

FRDM-KL46Z #6: Lập trình ghép nối cổng GPIO với đèn LED

Bo mạch FRDM-KL46Z có sẵn hai đèn LED, LED màu xanh và LED màu đỏ, dành cho người sử dụng lập trình. Sơ đồ nguyên lý mạch ghép nối các LED tới vi điều khiển và sự sắp xếp các LED trên bo mạch FRDM-KL46Z được chỉ ra trong Hình 3‑12. LED đỏ được kết nối tới chân PTE29 (chân số 29 của cổng PORTE) và LED xanh được kết nối tới chân PTD5 (chân số 5 của cổng PORTD) như thể hiện trong Bảng 3‑4. Sơ đồ cũng cho chúng ta biết rằng khi chân vi điều khiển ở mức logic 0 đèn LED sẽ sáng.

Bạn đọc có thể tìm mua bo mạch ở đây (Đang có chương trình khuyến mại giảm giá 15%).

Sơ đồ ghép nối và vị trí các LED trên bo mạch FRDM-KL46Z

Hình 3‑12. Sơ đồ ghép nối và vị trí các LED trên bo mạch FRDM-KL46Z.

Bảng 3‑4: Kết nối các đèn LED tới các chân vi điều khiên trên bo mạch FRDM-KL46Z [13]

Đèn LED Chân trên bo mạch FRDM-KL46Z
RED PTE29
Green PTD5

Điều khiển bật/tắt đèn LED xanh trên bo mạch FRDM-KL46Z

Để điều khiển nhấp nháy đèn LED màu xanh lá cây của bo mạch FRDM KL46Z, chương trình phần mềm phải tuần tự thực hiện các bước sau:

1) Cho phép cấp xung nhịp tới cổng PORTD, vì quyền truy cập vào các thanh ghi của cổng sẽ bị từ chối cho đến khi tín hiệu xung nhịp được bật,

2) thiết lập cấu hình cho thanh ghi điều khiển chân PORTD_PCR [5] (Pin Control Register) để chọn chức năng GPIO cho pin PTD5,

3) đặt bit số 5 của thanh ghi hướng dữ liệu của PORTD để thiết lập chân PTD5 làm đầu ra,

4) ghi giá trị “1” vào bit số 5 trong thanh ghi đầu ra dữ liệu GPIOD_PDOR để tắt LED,

5) gọi một hàm tạo trễ một khoảng thời gian nhất định,

6) ghi “0” đến bit số 5 trong thanh ghi đầu ra dữ liệu GPIOD_PDOR để bật LED,

7) gọi một hàm tạo trễ một khoảng thời gian nhất định,

8) Lặp lại các bước 4 đến 7.

Chương trình 3‑1 chỉ ra một cách để điều khiển nhấp nháy đèn LED theo trình tự các bước được liệt kê ở trên.

Chương trình 31: Nháy LED màu xanh theo cách tự định nghĩa các thanh ghi 

/* Blinky_grLED.c Toggling LED in C using registers by addresses

* This program toggles green LED for 0.5 second ON and 0.5 second OFF.

* The green LED is connected to PTD5.

* The LEDs are low active (a ‘0’ turns ON the LED).

*/

/* System Integration Module System Clock Gating Control Register 5*/

#define SIM_SCGC5 (*((volatile unsigned int*)0x40048038))

/* Port D Pin Control Register 5*/

#define PORTD_PCR5 (*((volatile unsigned int*)0x4004C014))

/* Port D Data Direction Register */

#define GPIOD_PDDR (*((volatile unsigned int*)0x400FF0D4))

/* Port D Data Output Register */

#define GPIOD_PDOR (*((volatile unsigned int*)0x400FF0C0))

int main (void) {

void delayMs(int n);

SIM_SCGC5 |= 0x1000; /* enable clock to Port D */

PORTD_PCR5 = 0x100; /* make PTD5 pin as GPIO */

GPIOD_PDDR |= 0x20; /* make PTD5 as output pin */

while (1) {

GPIOD_PDOR &= ~0x20; /* turn on green LED */

delayMs(500);

GPIOD_PDOR |= 0x20; /* turn off green LED */

delayMs(500);

}

}

/* Delay n milliseconds

* The CPU core clock is set to MCGFLLCLK at 41.94 MHz in SystemInit().

*/

void delayMs(int n) {

int i;

int j;

for(i = 0 ; i < n; i++)

for (j = 0; j < 7000; j++) {}

}

      Để ý cách chúng ta xác định địa chỉ vật lý của các thanh ghi chức năng đặc biệt của các cổng I/O trong chương trình trên. Điều này khá nhàm chán và rất dễ mắc lỗi. Thông thường nhà sản xuất thiết bị sẽ cung cấp các định nghĩa này trong một tệp tiêu đề C. Chẳng hạn, với môi trường phát triển Keil MDK-ARM phiên bản 5, tệp tiêu đề được cung cấp trong bản tải xuống của gói thiết bị (Device Family Pack). Người lập trình có thể tìm thấy trong đường dẫn:

C:\Keil_v5\ARM\PACK\NXP\MKL46Z4_DFP\10.0.3\MKL46Z4.h

      Lưu ý là khi chúng ta bắt đầu một dự án trong môi trường Keil MDK-ARM và chọn thiết bị là Freescale MKL46Z thì trình hướng dẫn dự án (project wizard) sẽ tự động thêm vị trí của tệp tiêu đề này vào trong đường dẫn tìm kiếm của trình biên dịch. Do đó trong chương trình, chúng ta chỉ cần xác định tên tệp với dòng lệnh:

#include <MKL46Z4.H>

      Keil MDK-ARM sử dụng một cú pháp riêng để định nghĩa các thanh ghi tuân thủ chuẩn giao diện phần mềm vi điều khiển Cortex CMSIS (Cortex Microcontrollers Software Interface Standard). Trong cú pháp này, mỗi cổng được định nghĩa là một con trỏ trỏ tới một cấu trúc với các thanh ghi là các thành viên của cấu trúc đó. Ví dụ: Thanh ghi hướng dữ liệu của cổng D được tham chiếu đến như là PTD-> PDDR và thanh ghi dữ liệu của cổng D được tham chiếu đến như là PTD-> PDOR, v.v.

     Trong suốt phần tiếp theo, chúng ta sẽ sử dụng tệp tiêu đề được cung cấp bởi môi trường Keil MDK-ARM khi viết các chương trình ứng dụng cho bo mạch FRDM-KL46Z. Chương trình 3‑3 minh họa việc sử dụng tệp tiêu đề được định nghĩa sẵn trong môi trường Keil MDK-ARM để viết chương trình điều khiển nhấp nháy LED giống như chức năng trong các Chương trình 3‑1.

Chương trình 33: Nháy LED màu xanh bằng cách sử dụng tệp header định nghĩa sẵn trong Keil
/* gLED_HFile.c Toggling LED in C using Keil header file register definitions.
* This program toggles green LED for 0.5 second ON and 0.5 second OFF.

* The green LED is connected to PTB19.

* The LEDs are low active (a ‘0’ turns ON the LED).

*/

#include <MKL46Z4.H>

int main (void) {

void delayMs(int n);

SIM->SCGC5 |= 0x1000; /* enable clock to Port D */

PORTD->PCR[5] = 0x100; /* make PTD5 pin as GPIO */

PTD->PDDR |= 0x20; /* make PTD5 as output pin */

while (1) {

PTB->PDOR &= ~0x20; /* turn on green LED */

delayMs(500);

PTB->PDOR |= 0x20; /* turn off green LED */

delayMs(500);

}

}

/* Delay n milliseconds

* The CPU core clock is set to MCGFLLCLK at 41.94 MHz in SystemInit().

*/

void delayMs(int n) {

int i;

int j;

for(i = 0 ; i < n; i++)

for (j = 0; j < 7000; j++) {}

}

    Nhắc lại từ bài viết FRDM-KL46 #5: Cổng GPIO rằng, bên cạnh thanh ghi PDOR, dòng vi điều khiển Kinetis còn có ba thanh ghi bổ sung giúp đặt và xóa trạng thái các chân dễ dàng hơn, đó là thanh ghi đầu ra thiết lập cổng PSOR, thanh ghi đầu ra xóa cổng PCOR, thanh ghi đầu ra đảo trạng thái cổng PTOR. Cách sử dụng các thanh ghi này để điều khiển bật/tắt đèn LED xanh trên bo mạch FRDM_KL46Z được để dành như một bài tập cho bạn đọc.

Nguyễn Kiêm Hùng

Hung K. Nguyen studied “Electronic Engineering” in both his bachelor’s and master’s degrees at the Vietnam National University, Hanoi, Vietnam. He received the bachelor’s degree in 2003. After receiving his bachelor’s degree, He worked as an internship in the Research Center of Electronics and Telecommunications. In 2006, He received the master’s degree in electronic engineering from VNU University of Engineering and Technology (VNU-UET). Before pursuing his Ph.D’s degree, He worked as a researcher at the Laboratory for Smart Integrated Systems in VNU University of Engineering and Technology for two years. In 2008, He went to Southeast University, Nanjing, China to get his Ph.D degree. He received the Ph.D. degree in Microelectronics and Solid State Electronics from Southeast University in 2013. After got his Ph.D’s degree, He returned to VNU University of Engineering and Technology to continue his research in VLSI design. He works currently as an assistant professor and senior researcher at VNU Key Laboratory for Smart Integrated Systems. His research interests mainly include multimedia processing, reconfigurable computing, and SoC designs.

This Post Has 4 Comments

  1. Huy

    Bài 3.1 – line 16 trong phần comment ad sửa là portD đi ạ

    1. Nguyễn Kiêm Hùng

      Cám ơn bạn

  2. Huy Tuấn

    Ad làm thêm phần nút bấm đi ạ

Trả lời