1. Mục đích:
- Viết các ứng dụng với các giao tiếp vào ra cơ bản (GPIO) trên KIT, sử dụng các GPIO driver đã có sẵn, như: giao tiếp led, button, …
- Biên dịch, nạp và thực thi ứng dụng trên KIT
2. Chuẩn bị:
- PC Linux (Ubuntu) with arm-linux-gcc
- Bộ KIT thực hành FriendlyArm mini/macro2440
- Dữ liệu: Các ví dụ tham khảo
3. Lập trình vào ra căn bản:
3.1. Viết chương trình điều khiển tắt/bật led đơn
3.1.1. Mô tả:
- Dãy 4 led đơn trên KIT ghép nối qua cổng GPIO đã có sẵn driver trên Embedded Linux.
- Mô hình giao tiếp:
3.1.2. Mã nguồn tham khảo:
(File tham khảo: leds.c)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
int main(int argc, char **argv)
{
int on;
int led_no;
int fd;
//Kiểm tra các tham số truyền vào đã đúng quy định chưa
if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 || on < 0 || on > 1 || led_no < 0 || led_no > 3) {
fprintf(stderr, "Usage: leds led_no 0|1\n");
exit(1);
}
//Mở file
fd = open("/dev/leds", 0);
//Kiểm tra xem quá trình mở file có thành công không
if (fd < 0) {
perror("open device leds");
exit(1);
}
//Điều khiển led
ioctl(fd, on, led_no);
close(fd);
return 0;
}
3.1.3. Yêu cầu: Dựa trên ví dụ trên, viết chương trình điều khiển tắt, bật dãy led đơn. Biên dịch, nạp chương trình lên KIT và thực thi, quan sát kết quả.
Chú ý: Mặc định trên KIT chạy ứng dụng led_player trên nền Qtopia, cần tắt ứng dụng này để quan sát kết quả ứng dụng mới. Thực hiện: ….
3.2. Viết chương trình đọc trạng thái nút bấm
3.2.1. Mô tả:
- Dãy nút bấm K1, K2, K3, K4, K5, K6 trên KIT được ghép nối qua GPIO, đã có sẵn driver trên hệ điều hành Linux nhúng.
- Có thể đọc trạng thái các nút bấm này (pressed/release or not ?) và có xử lý thích hợp.
- Mô hình lập trình với nút bấm:
3.2.2. Mã nguồn tham khảo
(File buttons.c)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/time.h>
#include <errno.h>
int main(int argc, char** argv)
{
int buttons_fd;
//Mảng lưu trạng thái của 6 nút bấm
char buttons[6] = {'0', '0', '0', '0', '0', '0'};
//Mở file
buttons_fd = open("/dev/buttons", 0);
//Kiểm tra quá trình mở file
if (buttons_fd < 0) {
perror("open device buttons");
exit(1);
}
//Hỏi vòng kiểm tra trạng thái các nút bấm
for (;;) {
char current_buttons[6];
int count_of_changed_key;
int i;
//Đọc trạng thái các nút bấm
if (read(buttons_fd, current_buttons, sizeof current_buttons) != sizeof current_buttons) {
perror("read buttons:");
exit(1);
}
//Kiểm tra trạng thái các nút bấm và in ra trạng thái phù hợp (Key up hay Key down)
for (i = 0, count_of_changed_key = 0; i < sizeof buttons / sizeof buttons[0]; i++) {
if (buttons[i] != current_buttons[i]) {
buttons[i] = current_buttons[i];
printf("%skey %d is %s", count_of_changed_key? ", ": "", i+1, buttons[i] == '0' ?
"up" : "down");
count_of_changed_key++;
}
}
if (count_of_changed_key) {
printf("\n");
}
}
//Đóng file thiết bị
close(buttons_fd);
return 0;
}
Bạn có đam mê ngành thiết kế vi mạch và bạn muốn có mức lương 1000 usd cùng lúc bạn
đang muốn tìm một Trung tâm để học vậy hãy đến với ngành vi mạch tại SEMICON
HotLine: 0972 800 931 Ms Duyên