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 1Chương 2
HƯỚ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 ARMcortex – 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ếtquả 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âydự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 5Tiến hành nhấn Ok, một giao diện thông báo xuất hiện yêu cầu tạo file Startup mới, bạn nênchọ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ộtgiao 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 chogroup 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ụctạ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 chophầ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ảnlý
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 12#include "USART.h"
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 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 );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4
|RCC_APB1Periph_USART3|RCC_APB1Periph_TIM2 , ENABLE );
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
}
void Delay(vu32 nCount)
{
Trang 13for(; nCount != 0; nCount );
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.
Trang 14GPIO_InitTypeDef GPIO_InitStructure;
/* 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;
Trang 15|RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO |RCC_APB2Periph_SPI1, ENABLE );
Trang 16e 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, khibằ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 18Vò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 bittrong 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
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:
Chỉ 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
Trang 190 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 20d 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
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ọnhơn
DEM Trước khi dịch Sau khi dịch Sau khi cộng 1000_0000 =
0x8000
0 0000 0000 0000
0000
0000 0000 00000000
1000 0000 0000 0000
Trang 212 1100 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
Bà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 đồ:
Trang 22unsigned 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.
Trang 23void 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 2410 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.
delay(5000); TT = TT <<1;TP = TP >>1;}
}
Trang 25} }
}
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ànphí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ầnbá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 4phí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, …
Hệ thống ít phím
Để 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.
Trang 26Tạ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.
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 27Bà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.
}
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:
Trang 28Lệnh if thứ nhất kiểm tra xem W = 00 hay không? Nếu W = 00 thì mới kiểm tra có nhấn phím
ON không? Nếu nhấn ON thì gán biến W = 0F và xuất ra port làm 4 led thấp sáng, 4 led cao tắt Nếu
W khác 00 tức là đã nhấn ON rồi thì không cần kiểm tra nhấn ON nữa, tiến hành kiểm tra xem có nhấnOFF không?
Nếu có nhấn OFF thì gán biến W bằng 0x00 và xuất ra port làm tắt led Nếu không nhấn OFF thìkiểm tra xem có nhấn phím đảo chiều INV hay không? Nếu có thì đảo giá trị của W và xuất ra portlàm 4 led tắt thành sáng, 4 led sáng thành tắt Nếu không nhấn INV thì quay lại kiểm tra OFF
Trong chương trình này khi chạy thực tế thì do tốc độ của vi điều khiển quá nhanh, khi nhấn đảochiều thì do thời gian nhấn phím dài nên vi điều khiển thực hiện đảo led liên tục, ta sẽ nhìn thấy 8 ledsáng luôn cho đến khi ta buông phím, hoặc ta nhấn nhanh thì trạng thái đảo của led không thể xác định
Bài mẫu 2-23 Giống bài 2-22 nhưng chống dội cho phím INV.
Tạo thư mục “BAI_967_8LED_ON_OFF_INV_CD” để lưu project.