Mỗi một project chứa nhiều file nên phải tạo nhiều thư mục để lưu các loại file khác nhau ví dụ thư mục lưu thư viện, thư mục lưu file phát sinh sau biên dịch, thư mục lưu file biên dịch
Trang 1HƯỚNG DẪN SỬ DỤNG PHẦN MỀM LẬP TRÌNH KEIL CHO ARM CORTEX –
Trang 2I GIỚI THIỆU
Chương này trình bày cách sử dụng phần mềm KEIL – ARM để tạo project lập trình cho ARM cortex – M3 STM32F
Sau khi biết cách tạo project thì có thể thực hiện các bài điều khiển khác
II CÁCH TẠO PROJECT
Cách tạo project lập trình cho ARM cũng giống như lập trình cho vi điều khiển AT89Sxx, chỉ có
1 vài khác biệt, chi tiết tiến hành như sau
Yêu cầu: tạo một project điều khiển 1 led đơn chớp tắt.
Thực hiện: ARM là dòng 32 bit với tài nguyên và cấu trúc lớn hơn nhiều so với vi điều khiển 8
bit và được hổ trợ thư viện nhiều nên khi lập trình ta phải khai báo các thư viện cho sẵn
Mỗi một project chứa nhiều file nên phải tạo nhiều thư mục để lưu các loại file khác nhau ví dụ thư mục lưu thư viện, thư mục lưu file phát sinh sau biên dịch, thư mục lưu file biên dịch trung gian,
…
Bước 1: Tạo thư mục cha để lưu tất cả các project, tiến hành tạo thư mục con để lưu project của
bài 1 led chớp tắt Kết quả sau khi tạo thư mục như hình sau
Hình 2-2 Thư mục cha và thư mục con.
Bước 2: Tiến hành copy thư mục chứa các file thư viện từ 1 project nào đó có sẵn đã chạy vào
thư mục của project mà bạn đang xây dựng, tên thư mục có thể khác nhau và không quan trọng, kết quả sau khi copy như sau:
Hình 2-3 Sau khi copy thư mục có tên Source.
Các thành phần có trong thư mục như hình sau:
Trang 3Hình 2-4 Các thư mục con của thư mục Source.
Bên trong các thư mục con có các thư mục con nữa và lưu các file thư viện và các file để xây dựng project
Bước 3: Khởi động phần mềm KEIL như sau:
Hình 2-5 Giao diện phần mềm Keil.
Bước 4: Tạo project mới theo 2 trình tự 1 và 2 như hình sau:
Hình 2-6 Tiến hành tạo project mới.
Một giao diện mới xuất hiện, bạn tiến hành chọn thư mục lưu project rồi đánh tên cho project tùy
ý nhưng ở đây đặt tên là LED_CHOPTAT, kết quả như hình sau:
Trang 4Hình 2-7 Đặt tên, chọn đường dẫn lưu project mới.
Một giao diện mới xuất hiện yêu cầu bạn chọn loại ARM, bạn tiến hành chọn mục ARM
“STMicroelectronis” rồi chọn chip cho đúng với kit đang sử dụng, kết quả như hình sau:
Hình 2-8 Chọn đúng thông số cho chip.
Trang 5chọn No vì file này đã có sẵn trong thư viện mà đa đã copy
Màn hình như sau:
Hình 2-9 Màn hình chưa có gì.
Bước 5: Tiến hành gán tên project, thiết lập các nhóm, gán thư viện:
Chọn biểu tượng như trong hình sau:
Hình 2-10 Chọn biểu tượng gán.
Khi đó một giao diện mới xuất hiện như hình sau:
Trang 6Hình 2-11 Giao diện thay đổi tên và đường dẫn.
Trong giao diện này bạn thấy có 3 cột, cột thứ nhất tên của project là target1 và cột thứ 2 có tên
là Source Group1, các tên này là mặc nhiên phần mềm tạo ra, ta cần phải thay thế các tên này Kết quả thay đổi tên project và thành lập các group mới như hình sau:
Hình 2-12 Sau khi thay đổi tên.
Tên trong group có thể đặt tùy ý
Cách thực hiện: bạn để dấu nháy ngay cột thứ nhất và tiến hành đánh đúng tên là xong
Chuyển sang cột thứ 2 rồi đánh hàng thứ nhất xong thì nhấn enter và bấm vào ô vuông gần ô xóa
để tạo hàng mới và đánh tên cho group thứ 2, tương tự cho group thứ 3
Tiếp theo là gán file cho từng group:
Gán các file cho group CMSIS: chọn group CMSIS rồi chọn Add Files nằm ở cột thứ 3 thì một giao diện mới xuất hiện như hình sau:
Trang 7Hình 2-13 Giao diện chọn file để Add.
Tiến hành vào thư mục Source cho đến khi tìm được 2 file rồi bấm Add để đưa vào group như hình sau:
Hình 2-14 Chọn file để add.
Group CMSIS chỉ cần lưu 2 file này, sau đó bấm close để trở lại, màn hình sau khi add cho group CMSIS như hình sau:
Hình 2-15 Kết quả sau khi add cho group CMSIS.
Tương tự bạn chọn group APP và tìm file rồi add, kết quả của group App như hình sau:
Trang 8Hình 2-16 Kết quả sau khi add cho group APP.
Tương tự bạn chọn group LIB và tìm file rồi add, kết quả của group LIB như hình sau:
Hình 2-17 Kết quả sau khi add cho group LIB.
Sau đó nhấn OK để đóng phần này, giao diện màn như sau:
Hình 2-18 Giao diện màn hình mới sau khi gán cho các group.
Trang 9Bước 6: Tiến hành thiết lập các lựa chọn cho project bằng cách bấm vào biểu tượng có tên
“Target Option” Một giao diện mới xuất hiện tiến hành chọn tab có tên là “Output” rồi tick vào mục tạo file hex như hình sau:
Hình 2-19 Tick ô xây dựng file hex.
Sau đó bấm vào ô tương ứng với số 2 để tạo thư mục lưu các file phát sinh khi biên dịch
Giao diện sau xuất hiện:
Hình 2-20 Giao diện tạo thư mục.
Bạn tiến hành tạo thêm thư mục có tên là obj và mở thư mục đó ra để thiết lập đường dẫn cho phần mềm biết các file đối tượng sau khi tạo ra do trình biên dịch sẽ lưu vào thư mục này cho dễ quản lý
Kết quả như hình sau:
Trang 10Hình 2-21 Sau khi thiết lập thư mục obj.
Sau khi tạo thư mục obj và vào luôn thư mục đó (số 1) thì đường dẫn tạo ra trỏ đến thư mục đó (số 2), tiếp theo nhấn Ok (số 3) để kết thúc tab này
Tiến hành chọn tab Listing rồi bấm vào ô để thiết lập thư mục lưu các file lst do trình biên dịch tạo ra giống như mới vừa làm cho obj
Kết quả sau khi thực hiện như hình sau:
Hình 2-22 Sau khi thiết lập thư mục lst.
Tiến hành chọn tab C/C++ rồi bấm vào ô dấu 3 chấm của hàng “Include Paths” để thiết lập các đường dẫn cho các file cho trình biên dịch biết để biên dịch
Một giao diện mới xuất hiện chưa có đường dẫn, bạn tiến hành thiết lập các đường dẫn và kết quả như sau:
Trang 11Hình 2-23 Thiết lập đường dẫn cho các file để biên dịch.
Tiến hành chọn tab Linker rồi tick vào ô chọn “Use Memory layout …”
Tiến hành chọn tab Utilities rồi chọn loại bộ nạp mà bạn đang có, ở đây tác giả sử dụng bộ nạp
có tên là Cortex-M3 J-LINK (số 1)
Trang 12Bước 7: Mở file main.c và hiệu chỉnh lại nội dung để điều khiển 1 led sáng tắt:
/* Configure IO connected to LD1, LD2, LD3 and LD4 leds *********************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE
|RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO |RCC_APB2Periph_SPI1, ENABLE );
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL ,ENABLE );
Trang 13|RCC_APB1Periph_USART3|RCC_APB1Periph_TIM2 , ENABLE );
Bước 8: Tiến hành biên dịch và kết quả sau khi biên dịch như sau:
Hình 2-25 Kết quả sau khi biên dịch.
Bước 9: Tiến hành nạp và quan sát kết quả sau khi nạp.
III CÁC CHƯƠNG TRÌNH ĐIỀU KHIỂN LED ĐƠN
Sau khi thực hiện xong bài 2-1 thì tiến hành làm bài 2-2, vào “Project”, chọn mục “Close projet”
để đóng project Thực hiện tương tự cho các bài tiếp theo
Bài mẫu 2-2 Chương trình điều khiển 4 LED đơn sáng tắt dần.
Tạo thư mục “BAI_998_4LED_STD” để lưu project.
a Mạch điện:
b Lưu đồ:
c Chương trình:
/**************************************************************
Trang 14CHUONG TRINH SANG DAN TAT DAN
/* Configure IO connected to LD1, LD2, LD3 and LD4 leds *********************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
Trang 15void RCC_Configuration(void)
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
|RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE
|RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO |RCC_APB2Periph_SPI1, ENABLE );
Trang 16GPIO_SetBits(GPIOD, GPIO_Pin_8); /* Turn off LD1 */
e Quan sát kết quả: nếu kết quả không đúng yêu cầu thì kiểm tra lại chương trình
Bài tập 2-3 Chương trình điều khiển 32 LED đơn nhấp nháy.
Tạo thư mục “BAI_997_32_LED_CHOPTAT” để lưu project.
Bài mẫu 2-4 Chương trình điều khiển 32 LED đơn nhấp nháy 5 lần rồi sáng luôn.
Tạo thư mục “BAI_996_32_LED_CHOPTAT_5” để lưu project.
{ }
}
Trang 17• Giải thích chương trình:
Cho biến “i = 0”, thực hiện vòng lặp while chóp tắt 32 led với điều kiện là biến “i” nhỏ hơn, khi bằng 5 thì làm lệnh “lb: goto lb” là nhảy tạo chỗ
Bài mẫu 2-5 Chương trình điều khiển 8 LED sáng dần tắt dần từ phải sang trái.
Tạo thư mục “BAI_994_8_LED_STD_PST” để lưu project.
{ P0 = (P0 << 1); delay(5000); }}
Trang 18d Tiến hành biên dịch và nạp
e Quan sát kết quả: nếu kết quả không đúng yêu cầu thì kiểm tra lại chương trình
f Giải thích chương trình:
Lệnh “P0 = 0x00;” làm cho port0 bằng 00 để tắt 8 led, delay để nhìn thấy
Vòng lặp for thực hiện 8 lần: mỗi lần thực hiện lệnh: “P0 = (P0 << 1) + 1” sẽ dịch dữ liệu 8 bit trong port 0 sang trái 1 bit và cộng với 1:
Dữ liệu lần lượt của 8 lần dịch trái:
i Trước khi dịch Sau khi dịch Sau khi cộng 1
Tương tự làm cho tắt dần thì chỉ cần dịch là được
Bài mẫu 2-6 Chương trình điều khiển 8 LED sáng dần tắt dần từ phải sang trái, trái
{ P0 = (P0 << 1); delay(5000); }for(i = 0; i < 8; i++)
{ P0 = (P0 >> 1) + 0x80; delay(5000); }for(i = 0; i < 8; i++)
{ P0 = (P0 >> 1); delay(5000); }}
}
d Tiến hành biên dịch và nạp
Trang 19Chỉ cần giải thích phần từ trái sang phải: lệnh xoay từ trái sang phải là “P0 = (P0 >> 1) + 0x80”
có chức năng xoay port 0 từ phải sang trái đồng thời cộng với 0x80 để đẩy số 1 vào từ bên trái
Dữ liệu lần lượt của 8 lần dịch phải:
i Trước khi dịch Sau khi dịch Sau khi cộng 1000_0000 = 0x80
0 0000 0000 0000 0000 1000 0000
1 1000 0000 0100 0000 1100 0000
2 1100 0000 …
Sau mỗi lần dịch thì thực hiện delay để nhìn thấy
Bài mẫu 2-7 Chương trình điều khiển 16 LED sáng dần tắt dần từ phải sang trái, trái
Trang 20e Quan sát kết quả: nếu kết quả không đúng yêu cầu thì kiểm tra lại chương trình.
f Giải thích chương trình: Cách này thực hiện từng port, hơi dài, cách sau xử lý 16 bit sẽ gọn hơn
Bài mẫu 2-8 Chương trình điều khiển 16 LED sáng dần tắt dần từ phải sang trái, trái
sang phải dùng biến 16 bit.
Tạo thư mục “BAI_991_16_LED_STD_PST_TSP_C2” để lưu project.
a Mạch điện:
b Lưu đồ:
c Chương trình:
#include <AT89X52.h>
signed char i=0; unsigned int Z;
void delay (unsigned int x)
{ Z = (Z << 1); XUAT2PORT (); delay (5000); }for(i = 0; i < 16; i++)
{ Z = (Z >>1) + 0x8000; XUAT2PORT (); delay (5000); }for(i = 0; i < 16; i++)
{ Z = (Z >> 1); XUAT2PORT (); delay (5000); }}
}
d Tiến hành biên dịch và nạp
e Quan sát kết quả: nếu kết quả không đúng yêu cầu thì kiểm tra lại chương trình
f Giải thích chương trình: Cách này thực hiện từng port, hơi dài, cách sau xử lý 16 bit sẽ gọn hơn
Trang 210 0000 0000 0000
0000
0000 0000 0000 0000
1000 0000 0000 0000
Bài mẫu 2-9 Chương trình điều khiển 32 LED sáng dần tắt dần từ phải sang trái, trái
sang phải Tạo thư mục “BAI_990_32_LED_STD_PST_TSP” để lưu project.
d Tiến hành biên dịch và nạp
e Quan sát kết quả: nếu kết quả không đúng yêu cầu thì kiểm tra lại chương trình
Trang 22Bài mẫu 2-10 Chương trình điều khiển 32 LED sáng tắt dần từ ngoài vào, từ trong
ra Tạo thư mục “BAI_989_32_LED_STD_TNV_TTR” để lưu project.
a Mạch điện:
b Lưu đồ:
c Chương trình:
#include<AT89X52.H>
unsigned int Z,V; signed char i;
void delay( unsigned int x)
for(i=0;i<16;i++) { Z = (Z<<1);V= (V>>1); xuat4port(); delay(5000);}
for(i=0;i<16;i++) { Z = (Z>>1)+0x8000; V= (V<<1)+1; xuat4port();
delay(5000);}
for(i=0;i<16;i++) { Z = (Z>>1);V= (V<<1); xuat4port(); delay(5000);}
} }
d Tiến hành biên dịch và nạp
e Quan sát kết quả: nếu kết quả không đúng yêu cầu thì kiểm tra lại chương trình
Bài mẫu 2-11 Chương trình điều khiển 32 LED theo yêu cầu:
1 Chớp tắt 5 lần
2 Sáng dần từ phải sang trái, tắt dần từ phải sang trái 2 lần.
3 Chớp tắt 5 lần
4 Sáng dần từ trái sang phải, tắt dần từ trái sang phải 2 lần.
Tạo thư mục “BAI_988_32_LED_TONGHOP_1” để lưu project.
a Mạch điện:
b Lưu đồ:
c Chương trình:
#include<AT89X52.H>
Trang 23void delay( unsigned int x)
void stdan_pstrai()
{ for (j=0;j<2;j++)
{
for(i=0;i<32;i++) { W = (W<<1)+1; tach_16bit_xuat4port(); delay(5000);}
for(i=0;i<32;i++) { W = (W<<1); tach_16bit_xuat4port(); delay(5000);}
e Quan sát kết quả: nếu kết quả không đúng yêu cầu thì kiểm tra lại chương trình
Bài tập 2-12 Chương trình điều khiển 32 LED theo yêu cầu:
Trang 246 Sáng dần tắt dần từ ngoài vào và từ trong ra – 2 lần.
7 Chớp tắt 5 lần.
8 Sáng dần phải sang trái, tắt dần từ trái sang phải – 2 lần.
9 Chớp tắt 5 lần.
10 Sáng dần trái sang phải, tắt dần từ phải sang trái – 2 lần.
Chú ý: ghép thêm các chương trình con.
Tạo thư mục “BAI_987_32_LED_TONGHOP_2” để lưu project.
Bài mẫu 2-13 Chương trình con điều khiển 32 LED sáng dồn từ phải sang trái.
Thêm chương trình con sáng dồn 32 led từ phải sang trái vào chương trình tổng hợp.
delay(5000); T = T <<1;}
}}
}
}
d Tiến hành biên dịch và nạp
e Quan sát kết quả: nếu kết quả không đúng yêu cầu thì kiểm tra lại chương trình
Bài tập 2-14 Hãy viết chương trình con điều khiển 32 LED sáng dồn từ trái sang
phải.
Thêm chương trình con sáng dồn 32 led từ trái sang phải vào chương trình tổng hợp.
Bài mẫu 2-15 Chương trình điều khiển 32 LED sáng dồn từ ngoài vào.
Thêm chương trình con sáng dồn 32 led từ trái sang phải vào chương trình tổng hợp.
Trang 25for(k = 0;k<j;k++){ V = UT|TT; Z = UP|TP; xuat4port();
delay(5000); TT = TT <<1;TP = TP >>1;}
}}
}
}
d Tiến hành biên dịch và nạp
e Quan sát kết quả: nếu kết quả không đúng yêu cầu thì kiểm tra lại chương trình
Bài tập 2-16 Chương trình điều khiển 32 LED sáng dồn từ trong ra.
Viết thêm chương trình con sáng dồn 32 led từ trong ra vào chương trình tổng hợp
Bài tập 2-17 Chương trình điều khiển 32 LED chạy theo yêu cầu:
Lần 1: 1 điểm sáng chạy từ phải sang trái.
Lần 2: 2 điểm sáng chạy từ phải sang trái.
Lần 3: 3 điểm sáng chạy từ phải sang trái.
Lần 4: 4 điểm sáng chạy từ phải sang trái.
…
Lần 8: 8 điểm sáng chạy từ phải sang trái.
Sau khi viết xong thì thêm vào chương trình tổng hợp.
Bài tập 2-18 Chương trình điều khiển 32 LED chạy theo yêu cầu:
Lần 1: 1 điểm sáng bên phải chớp tắt 2 lần.
Lần 2: 2 điểm sáng bên phải chớp tắt 2 lần.
Lần 3: 3 điểm sáng bên phải chớp tắt 2 lần.
Lần 4: 4 điểm sáng bên phải chớp tắt 2 lần.
…
Lần 32: 32 điểm sáng bên phải chớp tắt 2 lần.
Sau khi viết xong thì thêm vào chương trình tổng hợp.
IV CÁC CHƯƠNG TRÌNH GIAO TIẾP NÚT NHẤN
Nút nhấn, bàn phím dùng để giao tiếp giữa con người và mạch điện tử để điều khiển, ví dụ: bàn phím máy tính, bàn phím điện thoại, bàn phím máy bán xăng dầu dùng nhập số tiền cần bán, số lít cần bán … máy giặt tự động có bàn phím để chỉnh chế độ giặt, chọn mực nước …
Có 2 dạng giao tiếp vi điều khiển với bàn phím, nút nhấn:
• Hệ thống ít phím: ví dụ đk động cơ bằng 3 phím: start, stop, inv, đồng hồ có 3 đến 4 phím
để chỉnh thời gian
• Hệ thống nhiều phím: bàn phím máy tính, bàn phím điện thoại, …
Trang 26Để hiểu giao tiếp vi điều khiển với bàn phím ta khảo sát các bài ứng dụng theo sau.
Bài mẫu 2-21 Dùng vi điều khiển AT89S52 giao tiếp với 8 led đơn và 2 nút nhấn
ON, OFF Khi cấp điện thì 8 led tắt, khi nhấn ON thì 8 led sáng, khi nhấn OFF thì 8 led tắt.
Tạo thư mục “BAI_969_8LED_ON_OFF” để lưu project.
a Mạch điện: kết nối port0 với 8 led đơn, 3 nút nhấn với 3 bit của port3
Hình 2-21: Sơ đồ điều khiển led và 3 nút nhấn.
Trang 27d Tiến hành biên dịch và nạp
e Quan sát kết quả: nếu kết quả không đúng yêu cầu thì kiểm tra lại chương trình
Bài mẫu 2-22 Dùng vi điều khiển AT89S52 giao tiếp với 8 led đơn và 3 nút nhấn
ON, OFF, INV Khi cấp điện thì 8 led tắt, khi nhấn ON thì 4 led phải sáng, 4 led trái tắt, khi nhấn INV thì 4 led sáng thành tắt, 4 led tắt thành sáng, khi nhấn OFF thì 8 led tắt Tạo thư mục “BAI_968_8LED_ON_OFF_INV” để lưu project.