ĐẠI ĐẠI HỌ HỌC QUỐ QUỐC GIA TP. HỒ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA ĐIỆ N – ĐIỆ – ĐIỆ N TỬ BỘ MÔN ĐIỆN ĐIỆN TỬ TỬ ---------------o0o---------------
BÁO CÁO THỰ THỰ C HÀNH THỰ THỰ C TẬ TẬP TỐ TỐT NGHIỆ NGHIỆP
LẬP TRÌNH ARM VỚ I KIT TIVA C
GVHD: Trần Trần Văn Hoàng SVTH: Nguyễ Nguyễn Nhậ Nhật Tân
41303554
TP. HỒ HỒ CHÍ MINH, THÁNG 4 NĂM NĂM 2017 2017
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
1. LAB 1: CÀI ĐẶT ĐẶT PHẦ PHẦN CỨ CỨ NG NG VÀ PHẦ PHẦN MỀ MỀM 1.1.
Mục tiêu - Tải và cài đặ t CCS (Code Composer Studio) - Tải các tài liệu và phần mềm phục vụ phần thực hành - Tìm hiểu về kit và chạy thử phần mềm demo đượ c nạ p sẵn trong kit
1.2.
Thự Thự c hành
1.2.1. Phần cứng - Máy tính chạy hệ điệu hành Windows 10 64-bit - Kit Tiva C TM4C123GH6PM 1.2.2. Tải và cài đặ t CCS - Tải bản mớ i nhất của Code Composer Studio tại địa chỉ: http://processors.wiki.ti.com/index.php/Download_CCS - Khởi động ccs_setup_5.xxxxx.exe từ folder đượ c tạo khi giải nén file đượ c tải trước đó. - Đồng ý điều khản sử dụng phần mềm và chọn Next .
Page | 1
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
1. LAB 1: CÀI ĐẶT ĐẶT PHẦ PHẦN CỨ CỨ NG NG VÀ PHẦ PHẦN MỀ MỀM 1.1.
Mục tiêu - Tải và cài đặ t CCS (Code Composer Studio) - Tải các tài liệu và phần mềm phục vụ phần thực hành - Tìm hiểu về kit và chạy thử phần mềm demo đượ c nạ p sẵn trong kit
1.2.
Thự Thự c hành
1.2.1. Phần cứng - Máy tính chạy hệ điệu hành Windows 10 64-bit - Kit Tiva C TM4C123GH6PM 1.2.2. Tải và cài đặ t CCS - Tải bản mớ i nhất của Code Composer Studio tại địa chỉ: http://processors.wiki.ti.com/index.php/Download_CCS - Khởi động ccs_setup_5.xxxxx.exe từ folder đượ c tạo khi giải nén file đượ c tải trước đó. - Đồng ý điều khản sử dụng phần mềm và chọn Next .
Page | 1
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Chọn thư mục bạn muốn cài đặt CCS. Nếu không chọn Next . Mặc định là C:/ti
- Chọn Custom để chọn từng phần cần cài đặt. Sau đó chọ n Next
Page | 2
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Chọn vi xử lý và bạn muốn sử dụng. Ở buổi thực hành này, ta sử dụng Tiva C nên chọn “Tiva C Series ARM MCUs”. Chọn Next
- Tại
trang
tiế p
theo,
giữ
mặc
định.
Chọn
Next
Page | 3
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Khi đến bước cài đặ t cuối cùng, bấm Next. Khi cài đặt hoàn tất, bỏ chọn “Launch Code Composer Studio v5” và chọ n Finish
- Công cụ bổ sung trong quá trình cài đặt CCS sẽ đòi hỏi quyền truy cậ p sâu vào hệ thống, bấm chọn “yes” hoặc “OK” khi hợ p thoại hiện lên. 1.2.3. Cài đặt TivaWare™ cho C Series - Tải và cài đặ t phiên phản mớ i nhất của Tivaware từ địa chỉ: : http://www.ti.com/tool/sw-tm4c. - Thư mục cài đặ t mặc định: C: \TI\TivaWare_C_Series-x.x. - Tải và cài đặ t Workshop Lab tại địa http://www.ti.com/TM4C123G-Launchpad-Workshop.
chỉ
:
- Thư mục cài đặ t mặc định: C: \Tiva_TM4C123G_LaunchPad. - Tải và cài đặt chương trình Terminal Putty - Tải và cài đặ t Windows-side USB Example tại địa chỉ: www.ti.com/sw-usb-win . - Ta cần công cụ thao tác đồ họa phù phợ p vớ i hình ảnh PNM. GIMP có thể làm điều đó. - Tải và cài đặ t GIMP tại địa chỉ: www.gimp.org
1.2.4. Tìm hiểu về Kit thực hành Bộ kit thực hành bao gồm: - Board TM4C123GXL. - Cáp USB (A-đực sang micro-B-đực). - Tờ giớ i thiệu. K ết nối board vớ i máy tính Page | 4
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Dùng USB k ết nối cổng USB trên máy tính v ớ i USB trên board (cổng DEBUG). Driver sẽ được cài đặt tự động. Chạy thử chương trình có sẵn - Kiểm tra chắc chắc công tắc đã đượ c bật qua chế độ Debug
- Phần chương trình có sẵn trên board sử dụng timers để tạo xung PWM để thay đổi độ sáng của 3 LED màu RGB. Do đó có thể tạo đượ c nhiều màu khác nhau. - Trên board có 2 nút nhấn SW1 và SW1. Bấm hoặc b ấm gi ữ SW1 để chuyển ph ổ màu về đỏ. B ấm hoặc b ấm giữ SW2 để chuyển ph ổ màu về tím. Nếu không bấm nút trong vòng 5s, code s ẽ tự động thay đổi màu. - Ta có thể giao tiế p với board thông qua UART. Uart đượ c k ết nối qua cổng serial ảo. - Click chuột phải vào nút START, chọn Manage device. Ta đượ c bảng sau
- Ta sẽ thấy thông tin về cổng nối tiế p ảo. Như vậy đã kế t nối thành công. Nếu gặ p sự cố, ta kiểm tra lại thiết bị và tiến hành cậ p nhật driver ICDI
Page | 5
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Mở Terminal Putter và thiết lập như hình dưới. Trong đó Seral li ne là cổng COM ảo máy tính tạo ra để k ết nối vớ i board
- Khi màn hình terminal mở lên, nhấn Enter 1 lần và LaunchPad board sẽ tr ả lờ i lại vớ i dấu ‘>’ để chỉ thị giao tiếp đượ c k ết nối. - Sử dụng các lệnh sau đây để sao tiế p vớ i board: o
o
help: hiển thị danh sánh lệnh. hib: đưa thiết bị vào tr ạng thái hibernation (ngủ đông ). Bấm SW2 để đánh thức thiết bị.
o
rand: bắt đầu lấy ngẫu nhiên (gỉa) cho các màu n ối tiế p nhau.
o
intensity: thay đổi cường độ sáng từ 0 đến 100%.
o
rgb: theo dõi giá tr ị hex cường độ sáng của tất cả 3 đèn led
- Tắt phần mềm terminal.
2. LAB 2: CODE COMPOSER STUDIO 2.1.
Mục tiêu Trong phần thực hành này, ta sẽ tạo 1 project gồm có 2 file, main.c và tm4c123gh6pm_startup_ccs.c, trong đó chó chứa mã nguồn nhấ p nháy LED trên LaunchPad board. Qua đó làm quen vớ i việc tạo 1 project và sử dụng CCS như thế nào.
2.2.
Thự c hành
2.2.1. Tạo project mớ i Page | 6
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Khởi động CCS, chờ đến khi hộ p thoại “Select your workspace” hiện lên, chọn đườ ng dẫn đến My Document (C:\Users\ntan1\My Document) - Không nên chọn “Use this as the default and do not ask again ”, vì khi có lỗi xảy ra ta có thể dễ dàng chỉnh sửa trong CCS 2.2.2. Chọn Giấy Phép bản quyền CCS - Nếu không có giấy phép Code Composer, ta sẽ có thể tr ải thêm vài bước để cài đặt phần mềm Ta cũng có thể thực hiện bướ c này bằng tay thông qua CCS Help menu. - Chọn Help
Code Composer Studio Licensing Infomation.
- Chọn tab “Upgrade” và sau đó chọn “Free” 2.2.3. Tắt TI Resource Explorer and/or Grace - Khi “TI Resource Explorer” hiệ n lên, ta sẽ t ắt chúng đi tại đấu “X” . Vì những công cụ nằng hỗ tr ợ cho các dòng vi xử lí khác. 2.2.4. Tạo project mớ i. - Chọn Project / New CCS Project.
- Thay đổi tên project thành lab2
Page | 7
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Bỏ chọn “Use default location” , bấ m vào Browser và d ẫn đến địa chỉ: C:\TM4C123G_LaunchPad_Workshop\lab2\project - Chọn OK 2.2.5. Sơ lượ c về CCS Editing GUI - Các thành phần cơ bản của GUI đượ c minh họa bên dướ i
2.3.
Thêm đường dẫn và giá trị khởi tạo
2.3.1. Thêm giá trị đường dẫn - Để thêm giá trị đường dẫn , bấm chuột phải vào project/Properties - Chờ hộp thoại hiện ra, bấm mở rộng Resource/Linked Resource
Page | 8
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Ta sẽ thấy 2 tab. Trong tab Path Variables, PROJECT_LOC được liệt kê và hiển thị như mặc định để liên kết các nguồn trong project
- Chọn New - Chờ hộp thoại hiện ra và nhập tên đường dẫn. Sau đó, bấm vào Folder và dẫn đường dẫn đến thư viện Tivaware.
- Bấm OK và kiểm tra lại đường dẫn mới đã nằm trong danh sách hay chưa 2.3.2. Thêm giá trị thiết lập. - Tiếp tục phần trên, chọn Build và chọn tab Variables . Chọn Add
- Chờ hộp thoại hiện ra và chọn têm giá trị là tên đã đặt cho đường dẫn Tivaware. - Bấm chọn “Apply to all configurations” - Thay đổi phần Type thành Dictionary
- Kiểm tra phần Value và bấm OK.
Thêm file vào project 2.4.1. Thêm file C Page | 9
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Chọn Project/Add File và chỉnh đến C:\TM4C123G_LaunchPad_Workshop\lab2\files
địa
chỉ
- Chọn main.c và bấm Open - Chọn Copy Files và ch ọn OK
2.4.2. Liên kết file driverlib.lib của Tivaware cho project - Bằng cách đã trình bày ở trên add file theo địa chỉ: C:\TI\TivaWare_C_Series-1.1\driverlib\ccs\Debug\driverlib.lib 2.4.3. Thêm thành phần Include cho file header - Chọn Project/Properties/Build/Include Options. - Bấm “+” và thêm giá trị như sau ${TIVAWARE_INSTALL} (TIVAWARE_INSTALL chính là đường dẫn đã tạo).
- Bấm OK
Page | 10
Báo cáo thực tập tốt nghiệp
2.5.
GVHD: Trần Văn Hoàng
Build, Load, Run
2.5.1. Build project và sửa lỗi - Đảm bảo LaunchPad đã kế t nối vớ i laptop của bạn. Tiền hành build và load project xuống bộ nhớ tiva thì bấm vào nút Debug. Nếu bạn chỉ muốn build project mà không load xuống tiva thì clich vào nút Build
- Nếu có lỗi trong quá trình build thì các lỗi sẽ đượ c hiện tại cửa sổ Problem. Dựa vào đó, ta sẽ tiến hành sửa lỗi. - Sau khi project đượ c build thành công, ta tiến hành debug bằng cách
bấm vào nút có hình Con b ọ 2.5.2. Tìm hiểu về CCS Debug GUI
Page | 11
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Giao diện CCS Debug GUI đượ c minh họa bên dướ i
2.5.3. Chạy chương trình - Bấm nút Resume hoặc nhấn nút F8 trên bàn phím để chạy chương trình
- Để tạm dừng chương trình đang chạ y, ta chọn nút Suspend
- K ết thúc quá trình debug bằng nút Terminate 2.5.4. Đặt Breakpoint - Thực hiện đặ Break Point tại dòng “GPIOPinWrite()” bằng cách nhấ p đúp vào dòng đó - Chú ý: ICDI không hỗ tr ợ thêm hoặc xóa Break Point khi vi x ử lí đang chạy
3. LAB 3 : KHỞ I TẠO VÀ GPIO 3.1.
Mục tiêu - Trong phần này, bạn sẽ học cách thiết lậ p Clock của hẹ thống và GPIO sử dụng Tivaware. Bạn sẽ sử dụng GPIO để nhấ p nháy LED trên LaunchPad
Page | 12
Báo cáo thực tập tốt nghiệp
3.2.
GVHD: Trần Văn Hoàng
Thự c hành
3.2.1. Tạo project lab3 - Tạo CCS project vớ i tên lab3 bằng cách chọn File/New/CCS Project. Sau đó chọ n các lựa chọn bên dướ i
Page | 13
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Thiết lập thư viện Tivaware như ở lab 2 3.2.2. Header File - Xóa nội dung có trong file main.c
- Chep đoạn code sau vào file main.c #include #include #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" uint8_t ui8PinData=2;
- Dấu “< >” chỉ việc sử dụng cho các đườ ng dẫn đặc biệt. Sử dụng " " có đườ ng dẫn bắt đầu từ thư mục gốc của project. Bạn phải đảm bảo r ằng các file Header là nguyên b ản, không bị chỉnh sửa.
stdint.h: Chứa định nghĩa về kiểu biến theo chuẩn C99 Page | 14
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
stdbool.h: Chứa định nghĩa về luận lý thoe chuẩn C99 hw_memap.h: Định nghĩa về bản đồ bộ nhớ của thiết bị Tiva C Series. Chúng bao gồm định nghĩa về địa chỉ cơ sở như GPIO_PORTF_BASE.
hw_types.h: Định nghĩa kiểu chung
sysctl.h : định nghĩa về API System Control c ủa Driverlib
gpio.h: Định nghĩ về API GPIO Driverlib
3.2.3. Hàm main() - Chép đoạn code này vào file main.c sau khi khai báo các file header int main(void) { }
3.2.4. Cấu hình clock - Cấu hình clock cho hệ thống, dùng thạch anh 16MHz tại ngõ vào mạch dao động chính, lái PLL lên 400MHz. PLL này ch ỉ có 1 tần số là 400MHz, nhưng có thể đượ c lái bở i thạch anh hay mạng dao động ở 5 đến 25MHz. Sau b ộ PLL là bộ chia 2. Ta chia thêm cho 5, t ổng cộng là chia 10. Do đó clock cấ p cho hệ thống là 40MHz. - Sử dụng đoạn code sau để tạo clock 40MHz SysCtlClockSet(SYSCTL_SYSDIV_5 |SYSCTL_USE_PLL |SYSCTL_XTAL_16MHZ |SYSCTL_OSC_MAIN);
-
Dưới đây là sơ đồ khối hệ thống clock
Page | 15
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Sơ đồ mạch dưới đây đượ c tham khảo từ LaunchPad schematic. Ở đây ta chú ý rằ ng thạch anh 16MHz đượ c nối vào ngỏ vào dao động chính.
3.2.5. Cấu hình GPIO - Ta có sơ đồ mạch GPIO port F trên launchPad k ết nối với đèn LED RGB và nút nhấn
-
Chép đoạn code này vào file main.c dưới đoạ n cấu hình clock SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE , GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
3.2.6. Vòng lậ p while() - Cuối cùng tạo while(1) để liên tục gởi ‘0’ và ‘1’ đế n chân GPIO port F. Ở giữa, ta sử dụng hàm delay - SysCtlDelay là vòng lặ p thờ i gian cung cấ p bở i Tivaware và mỗi vòng lặ p sẽ xử dụng 3 chu kì máy
-
Nhập đoạn code sau vào main.c while(1) { GPIOPinWrite(GPIO_PORTF_BASE , GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 , ui8PinData); SysCtlDelay(2000000); GPIOPinWrite(GPIO_PORTF_BASE , GPIO_PIN_1 | GPIO_PIN_2
Page | 16
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
| GPIO_PIN_3 , 0x00); SysCtlDelay(2000000); if(ui8PinData==8) {ui8PinData=2;} else {ui8PinData=ui8PinData*2;} }
- Ta có file main.c hoàn h ỉnh #include #include #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" uint8_t ui8PinData=2; int main( main(void void) ) { SysCtlClockSet(SYSCTL_SYSDI SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE V_5|SYSCTL_USE_PLL|SYSCTL_XTA _PLL|SYSCTL_XTAL_16MHZ|SYSCT L_16MHZ|SYSCTL_OSC_MAIN); L_OSC_MAIN); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput(GPIO_PORTF_B GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE, ASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_ GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); PIN_3); while(1) while (1) { GPIOPinWrite(GPIO_PORTF GPIOPinWrite (GPIO_PORTF_BASE, _BASE, GPIO_PIN_1| GPIO_PIN_2| GPIO_PIN_3, ui8PinData); SysCtlDelay(2000000); SysCtlDelay (2000000); GPIOPinWrite(GPIO_PORTF GPIOPinWrite (GPIO_PORTF_BASE, _BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_ GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, PIN_3, 0x00); SysCtlDelay(2000000); SysCtlDelay (2000000); if(ui8PinData==8) if (ui8PinData==8) {ui8PinData=2;} {ui8PinData=2;} else {ui8PinData=ui8PinData*2;} } }
3.2.7. Biên dịch, nạ p và chạy thử code - Tiền hành biên dịch và nạ p code bằng cách nhấn vào nút debug - Nhấn nút Resume để chạy chương trình vừa nạ p xuống bộ nhớ flash flash của LaunchPad - Nhấn nút Terminate để tr ở về cửa sổ CCS Edit ở v
4. LAB 4 : NGẮ NGẮT VÀ TIMER 4.1.
Mục tiêu
Page | 17
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Trong phần này ta sẽ tạo ngắt và viết chuognw trình đáp ứng ngắt bằng cách nháy LED
4.2.
Thự Thự c hành
4.2.1. Nhậ p project Lab4 - Chọn Project/Import Existing CCS Eclipse Project - Tiến hành như hình bên dướ i
4.2.2. Header files Page | 18
Báo cáo thực tập tốt nghiệp
#include #include #include #include #include #include #include #include #include
GVHD: Trần Văn Hoàng
"inc/tm4c123gh6pm.h" "inc/hw_memmap.h" "inc/hw_types.h" "driverlib/sysctl.h" "driverlib/interrupt.h" "driverlib/gpio.h" "driverlib/timer.h"
tm4c123gh6pm.h: Định nghĩa ngắt và phân chia thanh ghi c ủa Tiva C Series trên lauchPad
interrupt.h: Định nghĩa về bộ điều khiển NVIC (ngắt)
timer.h: Định nghĩa định nghĩa về API Timer
4.2.3. Main() int main(void) { uint32_t ui32Period; }
- Sử dungk biến ui32Period để tính thờ i gian delay 4.2.4. Cấu hình clock - Tương tự như lab3, cấu hình clock hệ thống là 40MHz SysCtlClockSet(
SYSCTL_SYSDIV_5 |SYSCTL_USE_PLL |SYSCTL_XTAL_16MHZ |SYSCTL_OSC_MAIN
);
4.2.5. Cấu hình GPIO - Như lab3, ta cần enable GPO và cáu hình port k ết nối v ớ i các LED ở chế độ output
Page | 19
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput( GPIO_PORTF_BASE , GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
4.2.6. Cấu hình Timer - Cũng như tất cả các ngoại vi khác, timer cũng cầ n phải cấp clock trướ c khi sử dụng. Khai báo đầu tiên sẽ cho phép cấp clock đến timer - Khai báo thứ 2 cấu hình Timer0 ở chế đố tuần hoàn 32-bit. Chú ý r ằng Timer0 32-bit bao gồm 2 timer 16-bit Timer 0A và Timer 0B SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);
4.2.7. Tính delay - Để nháy LED vớ i tần số 10Hz và 50% duty cycle, bạn cần tạo 2 ngắt tại thời điểm ½ chi k ỳ. - Đầu tiên phải tính số chu k ỳ clock để t ạo tần số 10Hz bằng cách lấy chu k ỳ hệ thống chi cho 10. Sau đó chia cho 2, bạ n sẽ đượ c 1 ngắt sau ½ chu k ỳ ui32Period = (SysCtlClockGet() / 10) / 2; TimerLoadSet(TIMER0_BASE, TIMER_A, ui32Period -1);
4.2.8. Cho phép ngắt - Để cho phép ngắt ngắt, ta không chỉ thực hiện tại module timer mà còn tại NVIC (the Nested Vector Interrupt Controller) - Lệnh IntMasterEnable() là lệnh cho phép ngắt chính của tất cả các ngắt - Lệnh IntEnable() dùng để cho phép ngắt của từng modul nhỏ IntEnable(INT_TIMER0A); TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); IntMasterEnable();
4.2.9. Cho phép Timer TimerEnable(TIMER0_BASE, TIMER_A);
4.2.10. Vòng lặ p while(1) Page | 20
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Vòng lặ p chính là 1 vòng l ặ p tr ống. Giá tr ị GPIO sẽ thay đổi ch ỉ khi nào interrupt xảy ra While(1) { }
4.2.11. Trình phục vụ ngắt Timer - Khi có ngắt xảy ra trình phục vụ ngắt sẽ đượ c gọi để thực hiện và nhanh chóng thoát khỏi đó void Timer0IntHandler(void) { // Clear the timer interrupt TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // Read the current state of the GPIO pin and // write back the opposite state if(GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_2)) { GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0); } else { GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 4); } }
- Ta đượ c file main.c hoàn chỉnh sau đây
Page | 21
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
#include #include #include "inc/tm4c123gh6pm.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/sysctl.h" #include "driverlib/interrupt.h" #include "driverlib/gpio.h" #include "driverlib/timer.h" int main(void) { uint32_t ui32Period; SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); SysCtlPeripheralEnable (SYSCTL_PERIPH_TIMER0); TimerConfigure (TIMER0_BASE, TIMER_CFG_PERIODIC); ui32Period = (SysCtlClockGet() / 10) / 2; TimerLoadSet (TIMER0_BASE, TIMER_A, ui32Period -1); IntEnable(INT_TIMER0A); TimerIntEnable (TIMER0_BASE, TIMER_TIMA_TIMEOUT); IntMasterEnable (); TimerEnable (TIMER0_BASE, TIMER_A); while(1) {} } void Timer0IntHandler(void) { // Clear the timer interrupt TimerIntClear (TIMER0_BASE, TIMER_TIMA_TIMEOUT); // Read the current state of the GPIO pin and // write back the opposite state if(GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_2)) { GPIOPinWrite (GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0); } else { GPIOPinWrite (GPIO_PORTF_BASE, GPIO_PIN_2, 4); } }
- Để cài đặt trình phục vụ ngắt, ta thực hiện 1 trong 2 cách sau :
Cách 1 : mở file tm4c123gh6pm_startup_ccs.c, tìm và sửa IntDefaulthandler tại « Timer 0 subtimer A » thành Timer0IntHandler. Bổ sung thêm dòng code extern void TimerIntHandler (void); vào file statup
Page | 22
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
Cách 2 : Bổ sung vào file main.c đoạ n code sau TimerIntRegister(TIMER0_BASE, TIMER_A, Timer0IntHandler);
4.2.12.Biên dịch, nạ p và chạy code - Thực hi ện biên dịch, nạ p, ch ạy, k ết thúc bằng các nút Build, Debug, Resume và Terminate. - Tiến hành thoát chương trình và ngắt k ết nối
5. LAB 5 : ADC12 5.1.
Mục tiêu - Sử dụng ADC12 để đo nhiệt độ qua cảm biến nhiệt độ trên chip - Sử dụng Code Composer để hiển thị nhiệt độ
Page | 23
Báo cáo thực tập tốt nghiệp
5.2.
GVHD: Trần Văn Hoàng
Thự c hành
5.2.1. Nhậ p project Lab5 - Chọn Project/ Import Existing CCS Eclipse Project - Thực hiện các thao tác bên dướ i.
5.2.2. Header files Page | 24
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Xoá dữ liệu hiện tại trên main.c và nh ập đoạn code sau để include thư viện Tivaware #include #include #include #include #include #include #include
"inc/hw_memmap.h" "inc/hw_types.h" "driverlib/debug.h" "driverlib/sysctl.h" "driverlib/adc.h"
- Công dụng các file header : adc.h : Định nghĩa cho việc sử dụng bộ ADC
5.2.3. main() - Nhập vào file main.c như bên dướ i int main(void) { }
- Định nghĩ sau đây sẽ tạo ra biến mảng và đượ c sử dụng để lưu dữ liệu đọc từ ADC FIFO. Chúng nên có kích thướ c lớn hơn bộ FIFO. Chúng ta sẽ s ử dụng bộ sắ p x ế p dãy 1 có b ộ FIFO chiều sâu bằng 4. Nếu b ộ sắ p x ếp dãy khác đượ c s ử d ụng có kích thướ c nh ỏ hơn hoặc sâu hơn FIFO, thì biến m ảng s ẽ thay đổi kích thướ c. Ví dụ, b ộ s ắ p x ế p dãy 0 có ó chiều sâu 8 - Thêm dòng code sau đây vào main.c
uint32 t ui32ADC0Value 4 ;
- Chúng ta cần các biến để tính toán nhiệt độ từ dữ liệu cảm biến. Biến đầu tiên dùng lưu giá trị nhi ệt độ trung bình. Biến đợi để lưu giá trị nhiệt độ dạng Celsius hoặc Fahrenheit. Tất cả các mô t ả như “volatile” ở mỗi biến s ẽ không đượ c t ối ưu bở i trình biên dịch và khả dụng để cửa sổ 'Expression' hoặc 'Local' chạy theo thờ i gian - Thêm đoạn code sau vào man.c volatile uint32_t ui32TempAvg; volatile uint32_t ui32TempValueC; volatile uint32_t ui32TempValueF;
- Cấu hình clock hệ thống 40MHz - Cho phép ngo ại vi ADC0 Page | 25
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Cho ADC chạy mặc định ở mắc 1Msps. Bây gi ờ ta sẽ cấu hình thứ tự m ẫu
cho ADC. Ta mu ốn sử dụng ADC0, thứ tự mẫu loại 1, cho bộ xử lí kính hoạt theo trình tự và mức ưu tiên ADC là cao nhấ t
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN| SYSCTL_XTAL_16MHZ); SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); ADCSequenceConfigure(ADC0_BASE, 1, ADC_TRIGGER_PROCESSOR, 0);
- Tiế p theo, ta cấu hình cho 4 phần của bộ sắ p xế p dãy ADC. Các ph ần 0 đến 2 của bộ sắ p xế p dãy sẽ nhận mẫu của cảm biến nhiệt độ (ADC_CTL_TS). Phần 4 của bộ sắ p xếp dãy cũng sẽ nhận mẫu từ cảm biến nhệt độ và đượ c cấu hình để bật interrupt flat (ADC_CTL_IE) khi hoàn thành lấy mẫu. Thêm vào đó, là thông báo vớ i ADC r ằng đây là sự chuyển dổi cuối cùng của bộ sắ p xế p dãy (ADC_CTL_END). - Cuối cùng là khởi động bộ dẫy lấy mẫu ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_TS); ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_TS); ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_TS); ADCSequenceStepConfigure(ADC0_BASE,1,3,ADC_CTL_TS|ADC_CTL_IE|ADC_CTL_END); ADCSequenceEnable(ADC0_BASE, 1);
5.2.4. Vòng lặ p while() - Trong vòng lặ p thực hiện các bướ c sau :
Xóa cờ ngắt của ADC
Thực hiện kích khởi động ADC
Chờ cờ ngắt ADC
Lấy giá tr ị ADC
Tính toán, lưu giá trị và quay tr ở lại bước đầu
- Việc tính toán giá tr ị nhiệt độ theo Celsius hoặc Fahrenheit đượ c thực hiện vớ i công thức như sau :
Celsius : TEMP = 147.5 – ((75*(VREFP – VREFN)*ADCVALUE) / 4096)
Fahrenheit : F = ((C * 9) + 160) / 5
- Cuối cùng ta được file main.c như sau : Page | 26
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
#include #include #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/debug.h" #include "driverlib/sysctl.h" #include "driverlib/adc.h" int main(void) { uint32_t ui32ADC0Value[4]; volatile uint32_t ui32TempAvg; volatile uint32_t ui32TempValueC; volatile uint32_t ui32TempValueF; SysCtlClockSet(SYSCTL_SYSDIV_5 |SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ); SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); ADCSequenceConfigure(ADC0_BASE, 1, ADC_TRIGGER_PROCESSOR, 0); ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_TS); ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_TS); ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_TS); ADCSequenceStepConfigure(ADC0_BASE,1,3 ,ADC_CTL_TS|ADC_CTL_IE|ADC_CTL_END); ADCSequenceEnable(ADC0_BASE, 1); while(1) { ADCIntClear(ADC0_BASE, 1); ADCProcessorTrigger(ADC0_BASE, 1); while(!ADCIntStatus(ADC0_BASE, 1, false)) {} ADCSequenceDataGet(ADC0_BASE, 1, ui32ADC0Value); ui32TempAvg = (ui32ADC0Value[0] + ui32ADC0Value[1] + ui32ADC0Value[2] + ui32ADC0Value[3] + 2)/4; ui32TempValueC = (1475 - ((2475 * ui32TempAvg)) / 4096)/10; ui32TempValueF = ((ui32TempValueC * 9) + 160) / 5; }
5.2.5. Biên dịch, nạ p và chạy code - Thực hiện biên dịch và nạ p code lên Launchpad - Mở tab Expressions và xóa t ất cả các biến trong tab bằng các ch ọn Remove All
- Tìm các biến ui32ADC0Value, ui32TempAvg, ui32TempValueC và ui32TempValueF ở ph ần cu ối c ủa code. Trên mỗi bi ến th ực hi ện các bước: bôi đen, bấ m chuột ph ải, chọn Add Watch Expression và ch ọn OK
Page | 27
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
5.2.6. Breakpoint - Đặt 1 breakpoint trước dòng đầ u tiên trong vòn lặ p while(1) bằng các double-click vào vùng màu xanh bên trái - Click chuột phải vào breakpoint và chọn Breakpoint Properties - Đổi giá tr ị tại mục Action thành Refresh All Windows, sau đó bấ m OK
- Bấm nút Resume để chạy chương trình. Nếu phần cửa sổ giá tr ị không đượ c update , bấm Suspend sau đó bấ m lại Resume - Ta thấy giá tr ị ui32ADC0Value được thay đổi r ất nhanh, các giá tr ị có sự thay đổi sẽ đượ c highlight màu vàng - Dùng ngón tay đặt lên chip của lauchpad để chúng mát hơn và quan sát các giá tr ị trên màn hình 5.2.7. Lấy trung bình bằng phần cứng - Nhấn nút Terminate để k ết thúc debug, quay tr ở lại cửa sổ CCS Edit - Tìm phần khở i tạo ADC trong đoạn code của bạn
Ngay sau hàm SysCtlPeripheralEnable(), thêm đoạ n code sau : ADCHardwareOversampleConfigure(ADC0_BASE, 64);
Page | 28
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Hàm đượ c thêm vào nhằm m ục đích lấ y trung bình của s ố mẫu nhất đinh trước khi đưa vào FIFO. Các giá trị này có thể là 2, 4, 8, 16, 32 hoặc 64. Với 64, đồng nghĩ vớ i việc giá tr ị mẫu đưa vào FIFO là trung bình của 64 giá tr ị mẫu lấy từ ADC - Thực hiện biên dịch và debug để so sánh vớ i k ết quả trướ c. Giá tr ị ui32ADC0Value ít bị thay đổi hơn so với trướ c khi hiệu chỉnh 5.2.8. Gọi APIs từ ROM - Trong file lab5.map, timd đế n SECTION ALLOCATION MAP và tìm vị trí có chữ ‘.text’
Ở đây đọ dài của chương trình là 5e4h - Trong ROM của Tiva Series đã đượ c bao bồm thư viện ngoại vi. Do đó sẽ tốt hơn so vớ i gọi thư viện từ bộ nhớ Flash. Ta có thể gọi chúng từ ROM.Từ đó, có thể giảm đượ c của chương trình trên bộ nhớ Flash. Để làm được điều đó, ta cần thêm phần hỗ tr ợ từ ROM trong code - Trong file main.c. Thêm đoạn code dưới đâu vào phầ n cuối cùng trong danh sách include #define TARGET_IS_BLIZZARD_RB1 #include "driverlib/rom.h"
Trong đó Blizzard là tên nội bộ các sản phẩm của TI dùng cho h ọ các thiết bị đượ c sử dụng trên LaunchPad. Định nghĩa này sẽ cho phép chúng ta truy cập các hàm API lưu trong ROM - Thêm tiền tố ROM_ vào phía trước các hàm. Ta được file main.c như sau
Page | 29
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
#include #include #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/debug.h" #include "driverlib/sysctl.h" #include "driverlib/adc.h" #define TARGET_IS_BLIZZARD_RB1 #include "driverlib/rom.h" int main(void) { uint32_t ui32ADC0Value[4]; volatile uint32_t ui32TempAvg; volatile uint32_t ui32TempValueC; volatile uint32_t ui32TempValueF; ROM_SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL |SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); ROM_ADCHardwareOversampleConfigure(ADC0_BASE, 64); ROM_ADCSequenceConfigure(ADC0_BASE, 1, ADC_TRIGGER_PROCESSOR, 0); ROM_ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_TS); ROM_ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_TS); ROM_ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_TS); ROM_ADCSequenceStepConfigure(ADC0_BASE,1,3,ADC_CTL_TS |ADC_CTL_IE|ADC_CTL_END); ROM_ADCSequenceEnable(ADC0_BASE, 1); while(1) { ROM_ADCIntClear(ADC0_BASE, 1); ROM_ADCProcessorTrigger(ADC0_BASE, 1); while(!ROM_ADCIntStatus(ADC0_BASE, 1, false)) {} ROM_ADCSequenceDataGet(ADC0_BASE, 1, ui32ADC0Value); ui32TempAvg = (ui32ADC0Value[0] + ui32ADC0Value[1] + ui32ADC0Value[2] + ui32ADC0Value[3] + 2)/4; ui32TempValueC = (1475 - ((2475 * ui32TempAvg)) / 4096)/10; ui32TempValueF = ((ui32TempValueC * 9) + 160) / 5; } }
5.2.9. Biên dịch, nạ p và chạy chương trình - Nhấn nút Build để biên dịch chương trình - Mở file lab5.map để quan sát lại giá tr ị .text
Page | 30
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
Sau khi chuyển sang sử d ụng các hàm API được lưu sẵ n trong ROM nên bộ nhớ flash không cần phải lưu thêm các hàm đó nữ a nên kích thước đã giảm đi 36%, độ dài chỉ còn 3c0h - Thoát khỏi phần debug và ngắt k ết nối
6. LAB 6 : CHẾ ĐỘ NGỦ ĐÔNG (HIBERNATION) 6.1.
Mục tiêu - Sử dụng chế dộ Hibernate để đưa thiết bị vào tr ạng thái ít tiêu tụ năng lượ ng - Đánh thức thiết bị từ chân Wake up và clock th ờ i gian thực (RTC) - Tiến hành đo dòng điện để thấy đượ c sự khác nhau trong chế độ hoạt động
6.2.
Thự c hành Page | 31
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
6.2.1. Nhậ p project lab6 - Chọn Project/Import Existing CCS Eclipse Project - Thực hiện như hình bên dướ i
6.2.2. Hạn chế - Để giữ cho giá của LaunchPad thấ p nhất, khay giữ pin đã đượ c loại bỏ, và V BATT đượ c k ết n ối s ẵn đến nu ồn 3.3V. Ta sẽ kh ảo sát các chế độ hoạt động và các cách đánh thứ c thiết bị dưới đây :
Run
Hibernate (VDD3ON)
Wake from pin (no RTC)
Wake from RTC
6.2.3. Header files - Mở file main.c, xóa h ết n ội dung hiện t ại. Nhậ p ph ần include header vào file main.c
Page | 32
Báo cáo thực tập tốt nghiệp
#include #include #include #include #include #include #include #include #include #include
GVHD: Trần Văn Hoàng
"utils/ustdlib.h" "inc/hw_types.h" "inc/hw_memmap.h" "driverlib/sysctl.h" "driverlib/pin_map.h" "driverlib/debug.h" "driverlib/hibernate.h" "driverlib/gpio.h"
6.2.4. Main() - Thiết lậ p clock 40MHz - Enable GPIO và cấu hình port F chân 1, 2, 3 là output. Sau đó bật sáng chân số 3 (đèn xanh lá) SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x08);
- Cấu hình Hibernate Ta sẽ cấu hình điều kiện để wake up thiết bị qua wake pin (SW2) SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE); HibernateEnableExpClk(SysCtlClockGet()); HibernateGPIORetentionEnable(); SysCtlDelay(64000000); HibernateWakeSet(HIBERNATE_WAKE_PIN); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3, 0x00);
Dòng 1 : Cho phép chế độ Hibernation
Dòng 2 : Cấ p clock cho module hibernation
Dòng 3 : Kích hoạt GPIO để chờ đánh thức khi chip ở tr ạng thái hibernation
Dòng 4 : delay 4 giây để ta qua sát LED
Dòng 5 : Cấu hình điều kiện để wake up qua wake pin
Dòng 6 : tắt LED xanh lá trướ c khi Hibernate
6.2.5. Yêu cầu Hibernate Page | 33
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Thực hiện yêu cầu Hibernation. Khi tiến hành Hibernate, module sẽ ngưng cup cấp năng lượ ng cho bộ điều khiển ngoài , nhân xử lí và tất cả ngoại vi HibernateRequest(); while(1) { }
- Nhấn nút save, khi đó file main.c sẽ có nội dung đầy đủ như sau #include #include #include "utils/ustdlib.h" #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "driverlib/sysctl.h" #include "driverlib/pin_map.h" #include "driverlib/debug.h" #include "driverlib/hibernate.h" #include "driverlib/gpio.h" int main(void) { SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL |SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE , GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x08); SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE); HibernateEnableExpClk(SysCtlClockGet()); HibernateGPIORetentionEnable(); SysCtlDelay(64000000); HibernateWakeSet(HIBERNATE_WAKE_PIN); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3, 0x00); HibernateRequest(); while(1) { } }
6.2.6. Biên dịch, nạ p và chạy code VDD3ON (no RTC) - Biên dịch và nạ p code lên board - Chạy chương trình bằng cách nhấn Resume. Đèn LED xanh lá sẽ sáng trong 4s, sau đó thiết bị sẽ vào chế độ Hibernation - Khi bấm SW2, vi xử lí s ẽ thức dậy và chạy code tr ở lại, LED xanh lá sẽ sáng - Nhấn nút Terminate để thoát khỏi chế độ debug, quay lại cửa sổ CCS Edit - Sau khi xác nhận code đã hoạt động qua đèn LED, ta có thể tiến hành đo dòng điện. Trướ c tiên, ta bỏ dòng code bật led xanh lá bằng Page | 34
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
comment. Sau đó lưu project, tiế n hành biên dịch và nạ p code lên launchpad 6.2.7. Đo dòng điện - Chuyển sang chế độ Devide bằng switch gần cổng usb - Bỏ jumper trên launchpad gần cỗng usb device
- Dùng đồng hồ tử k ết nối 2 chân của Jumper và vặn đồng hồ về chế độ 20mA DC
- Chuyển về lại chế độ debug và đọc giá tr ị trên đồng hồ đó - Sau 4s, chuyển tầm đo trên đồng hồ về 20uA DC và đọc giá tr ị trên đồng hồ 6.2.8. Đánh thức vớ i RTC - Thay đổi code để cho phép thiết bị đánh thức từ RTC hoặc từ PIN. Ta sẽ lập trình cho RTC đánh thức thiết bị sau 5s -
Trong file main.c, tìm đế n dòng code HibernateWakeSet(HIBERNATE_WAKE_PIN);
- Nhập vào 3 đoạn code sau đâu bên trên đó HibernateRTCSet(0); HibernateRTCEnable(); HibernateRTCMatchSet(0,5);
- Thay đổi thông số wake up để thêm wake up t ừ RTC Tìm dòng code HibernateWakeSet(HIBERNATE_WAKE_PIN); Và thay thế bằng : HibernateWakeSet(HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC);
- Mở lại dòng code bất led xanh lá
- Lưu project, ta đượ c file main.c
Page | 35
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
#include #include #include "utils/ustdlib.h" #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "driverlib/sysctl.h" #include "driverlib/pin_map.h" #include "driverlib/debug.h" #include "driverlib/hibernate.h" #include "driverlib/gpio.h" int main(void) { SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x08); SysCtlPeripheralEnable (SYSCTL_PERIPH_HIBERNATE); HibernateEnableExpClk (SysCtlClockGet()); HibernateGPIORetentionEnable (); SysCtlDelay(64000000); HibernateRTCSet(0); HibernateRTCEnable (); HibernateRTCMatchSet(0,5); HibernateWakeSet (HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3, 0x00); HibernateRequest (); while(1) { } }
- Biên dịch và nạ p code (Chú ý quá trình nạ p bấm SW2 để đánh thức chip) - Bấm Resume để chạy code và đo dòng điệ n khi led sáng và tắt Mode
Your reading
Our reading
Run (40MHz)
20.9mA
21.9mA
VDD3ON (no RTC)
5uA
6.7uA
VDD3ON (RTC)
0.5mA
6.9uA
7. LAB 7 : USB 7.1.
Mục tiêu
- Trong phần này bạn sẽ đượ c tr ải nghiệm gửi data qua lại trông qua k ết nối USB chế độ bulk tranfer
Page | 36
Báo cáo thực tập tốt nghiệp
7.2.
GVHD: Trần Văn Hoàng
Thự c hành
7.2.1. Code mẫu - Có 4 cách truyền dữ li ệu qua USB : truyền có điều khiển, truyền qua ngắt, truyền d ữ liệu liên tục có chu kì và truyền kiểu Bulk (truyền c ả khối dữ liệu lớ n)
- Trướ c khi thực hiện code, ta sẽ dùng usb_bulk_example để kiểm tra
thiết bị. Ta sẽ sử dụng Windows host command line để truyền xâu đến lauchpad qua k ết nối USB
7.2.2. Nhậ p project - Project usb_bilk_example là 1 ví dụ của bộ thư viện Tivaware. Khi ta nạ p project, nó sẽ tự động đượ c chép vào workspace. Nếu ta muốn truy cập các project đó thông qua Windows Explorer, file mà bạn đang làm việc sẽ chứa ở workspace chứ không phải folder Tivaware. Nếu ta xóa project trên CCS, nó vẫn tồn tại trong workspace nếu ta không yêu cầu xóa trên ổ đĩa. - Chọn Project/Import Exiting CCS Eclipse Project và thực hiện như minh họa bên dướ i
Page | 37
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Chọn Finish 7.2.3. Biên dịch, nạ p và chạy code - Tiến hành biên dịch và nạ p code lên LunchPad. Sau đó bấ m nút Resum để chạy chương trình - Bấm nút Terminate để thoát khỏi chế độ debug, chuyển qua cửa sổ CCS Edit - Cắm cáp USB t ừ c ổng debug sang cổng device. Switch chuyển sang chế độ device. Led xanh lá sáng ch ứng tỏ LaunchPad đã đượ c cấ p nguồn và k ết nối vớ i máy tính
- Sau ít phút, máy tính s ẽ phát hiện thiết bị là generic bulk device. Nếu cần thiết phải cài đặt driver thủ công, ta tiến hành cài đặ t driver tại thư mục C:\ti\Tivaware_C_Series-1.1\windows_drivers Page | 38
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Kiểm tra máy tính đã được cài đặt StellarisWare Windows-side USB examples
- Tiến hành khởi động USB Bulk Example. Sau ít phút, trên màn hình sẽ hiện ra cửa sổ như sau
- Nhậ p thử 1 vài ký tự và nhấn Enter. Ví dụ như ‘TI’ bên dướ i
- Ứ ng dụng sẽ gửi 2 byte ASCII tương ứ ng vớ i ‘ti’ qua USB đến LaunchPad. Chương trình trong LaunchPad sẽ chuyển kí tự hoa thành kí tự thườ ng, nháy LED và gửi ngượ c lại. Sau đó ứ ng d ụng trên máy sẽ hiển thị kí tự vừa nhận đượ c từ LaunchPad 7.2.4. Tìm hiểu sâu hơn - Thoát chương trình USB Bulk Example trên máy tính - K ết nối cáp USB vào c ổng Debug và chuyển SW sang chế độ Debug - Mở file usb_dev_bulk.c trong project usb_dev_bulk. Chương trình sẽ gồm 5 phần như sau :
SysTickIntHandler – trình phụ v ụ ng ắt t ừ SysTick Timer hỗ tr ợ chia kênh thờ i gian. EchoNewDataToHost - chương trình con giúp lấy dữ liệu từ bộ đệm và truyền dữ liệu đến cổng USB. Page | 39
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
TxHandler - trình phục vụ ngắt giúp thông báo khi quá trình truyền USB hoàn thành. RxHandler - trình phục vụ ng ắt tương tác vớ i d ữ li ệu đi vào, sau đó gọi EchoNewDataHost thực thi. Main() - kh ởi động chính, và vòng lặp while để giáp sát các byte đượ c truyền.
7.2.5. Theo dõi thiết bị - K ết n ối c ả hai cổng USB của lauchpad vào máy tính. SW đặ t ch ế độ Debug. - Khởi động chương trình Terminal trên máy tính và kế t n ối vào cổng nối tiế p ảo Stellaris. - Tiến hành biên dịch và nạ p code lên lauchpad => Bấm Resume để bắt đầu chạy. - Khởi động USB Bulk Example. - Nhậ p chuỗi kí tự “TEXAS INSTRUMENT” vào cử a sổ USB Bulk Example.
- Bấm nút Suspend để tạm dừng chương trình 7.2.6. Theo dõi bộ nhớ đệm
Page | 40
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Loại bỏ các bi ến trong tab Expressions bằng cách bấm chuottj phải vào tab và chọn Remove all
- Tìm trong usb_dev_bulk.c dòng code như sau
- Bôi đen g_sTxBuffer và g_sRxBuffer và thêm vào Expression bằ ng cách click chuột phải chọn Add Watch Expression, chọn Ok
- Ta cũng thể theo dõi thông quá tab Memory Browser, nhưng cách này thì chậm hơn đôi chút. - Tìm trong usb_dev_bulk.c dòng code sau và nh ấp đúp để đánh dấu breakpoint.
- Bấm chuột phải chọn Properties Breakpoint trong mục Action thay đổi thành Update View, bấm OK. - Bấm nút Code Reset để reset thiết bị.
- Khởi động lại USB Bulk Example và k ết nối lauchpad. Page | 41
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Do Expression chỉ có thể hiển thị 10 kí tự, ta chỉ nhậ p chuỗi kí tự ngắn như “TI”. - Khi chạy đến điểm Breakpoint., các biến trong Expression sẽ đượ c cậ p nhật. - Tiến hành thoát chương trình và ngắt k ết nối
8. LAB 8 : BỘ NHỚ VÀ MPU 8.1.
Mục tiêu - Biết cách đọc/ ghi FLASH trong hệ thồng. - Biết cách đọc/ ghi EEPROM. - Biết sử dụng bit-banding. - Cấu hình đơn vị bảo về bộ nhớ và giải quyết thiếu sót.
8.2.
Thự c hành
8.2.1. Nhậ p Lab8 - Chọn Project/Import Existing CCS Eclipse Project - Đảm bảo các thiết lập như hình dưới, sau đó nhấn Finish
Page | 42
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Tiến hình chỉnh sửa file main.c hoàn chỉnh như sau #include #include #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "driverlib/sysctl.h" #include "driverlib/pin_map.h" #include "driverlib/debug.h" #include "driverlib/gpio.h" int main(void) { SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x00); SysCtlDelay(20000000); while(1) {} }
8.2.2. Ghi chương trình vào bộ nhớ flash - Nhấn nút Build All để biên dịch chương trình mà không nạ p code xuống board - CCS sẽ tạ p 1 file map trong quá trình build. Tìm trong lab8 project và mở file lab8/map - Tìm chỉ mục MEMORY CONFIGURATION và SEGMENT ALLOCATION MAP Page | 43
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
Ở đây ta thấy tổng bộ nhớ flash đượ c sẻ dụng có độ dài là 0x07a8, bắt đầu tại địa chỉ 0x0. Điều đó có nghĩa là nơi nào có đị a chỉ trên 0x1000 là có thể sử dụng được. Đóng file lab8.map -
Tr ở lại main.c, thêm file header h ỗ tr ợ các API dùng cho bộ nhớ flash #include "driverlib/flash.h"
-
Thêm 4 đoạn code sau đây để them buffer cho đọc và ghi dữ liệu và để khở i tạo giá tr ị cần ghi uint32_t pui32Data[2]; uint32_t pui32Read[2]; pui32Data[0] = 0x12345678; pui32Data[1] = 0x56789abc;
-
Bên trên vòng lặ p, them 4 dòng sau
FlashErase(0x10000); FlashProgram(pui32Data, 0x10000, sizeof(pui32Data)); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x02); SysCtlDelay(20000000);
-
Dòng 1 : xóa block ô nhớ flash được xác đị nh bằng địa chỉ Dòng 2 : Ghi chuỗi dữ liệu mà ta đã khở i tạo trước đó, với đị a chỉ ghi bắt đầu là 0x10000, độ dài bằng độ dài của chuỗi
Dòng 3 : Bật sáng đền LED đỏ
Dòng 4 : delay 2 giây trướ c khi vào vòng lặ p
Chương trình của bạn sẽ trông như sau
Page | 44
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
#include #include #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "driverlib/sysctl.h" #include "driverlib/pin_map.h" #include "driverlib/debug.h" #include "driverlib/gpio.h" #include "driverlib/flash.h" int main(void) { uint32_t pui32Data[2]; uint32_t pui32Read[2]; pui32Data[0] = 0x12345678; pui32Data[1] = 0x56789abc; SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x00); SysCtlDelay(20000000); FlashErase (0x10000); FlashProgram(pui32Data, 0x10000, sizeof(pui32Data)); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x02); SysCtlDelay(20000000); while(1) {} }
8.2.3. Biên dịch, nạ p và chạy code - Biên dịch và nạ p code xuống board. Đặt 1 breakpoint trướ c dòng lệnh FlashProgram()
- Chạy chương trình bằ ng cách nhấn Resume. Chương trình sẽ đượ c thực thi và dừng lại tại breakpoint
Page | 45
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Mở Memory Browser bằng cách chọn View/Memory Browser. Cửa sổ nhỏ bật lên. Nhập 0x10000 đẽ kiểm tra giá tr ị ô nhớ có địa chỉ 0x10000
- Nhấn tiếp nút Resume. Đèn LED đỏ sẽ sáng. Nhấn Suspend để dừng chương trình, Memory Browser sẽ update giá tr ị và hiển thị giá tr ị mớ i đượ c ghi vào ô nhớ flash
- Xoa bỏ breakpoint, nhấn Terminate để thoát khỏi debug và tr ở về cửa sổ CCS Edit 8.2.4. Đọc và ghi vào bộ nhớ EEPROM - Quay tr ở lại file main.c, thêm dòng include header h ỗ tr ợ các API EEPROM Page | 46
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
#include "driverlib/eeprom.h"
- Trên vòng lặp while(1), thêm vào 7 dòng code sau đây SysCtlPeripheralEnable(SYSCTL_PERIPH_EEPROM0); EEPROMInit(); EEPROMMassErase(); EEPROMRead(pui32Read, 0x0, sizeof(pui32Read)); EEPROMProgram(pui32Data, 0x0, sizeof(pui32Data)); EEPROMRead(pui32Read, 0x0, sizeof(pui32Read)); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x04);
Dòng 1 : Cho phép ngoại vi EEPROM Dòng 2 : Tiền hành phục hồi nếu như nguồn bị lỗi trong quá trình ghi trước đó
Dòng 3 : Xóa toàn bộ EEPROM.
Dòng 4 : Đọc giá tr ị đã xóa vào biến puilRead
Dòng 5 : Ghi chuỗi gử liệu vào EEPROM
Dòng 6 : Đọc dữ liệu vừa ghi vào pulRead
Dòng 7 : Tắt LED đỏ và bật LED xanh dương
- Lưu lại file main.c
Page | 47
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
#include #include #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "driverlib/sysctl.h" #include "driverlib/pin_map.h" #include "driverlib/debug.h" #include "driverlib/gpio.h" #include "driverlib/flash.h" #include "driverlib/eeprom.h" int main(void) { uint32_t pui32Data[2]; uint32_t pui32Read[2]; pui32Data[0] = 0x12345678; pui32Data[1] = 0x56789abc; SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x00); SysCtlDelay(20000000); FlashErase (0x10000); FlashProgram(pui32Data, 0x10000, sizeof(pui32Data)); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x02); SysCtlDelay(20000000); SysCtlPeripheralEnable(SYSCTL_PERIPH_EEPROM0); EEPROMInit (); EEPROMMassErase(); EEPROMRead (pui32Read, 0x0, sizeof(pui32Read)); EEPROMProgram(pui32Data, 0x0, sizeof(pui32Data)); EEPROMRead (pui32Read, 0x0, sizeof(pui32Read)); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x04); while(1) {} }
8.2.5. Biên dịch, nạ p và chạy code EEPROM - Biên dịch và nạ p code xuống board bằng nút Debug - Mở tab Variables và mở r ộng cả 2 chuỗi pui32Data và pui32Read bằng cách nhấn vào dấu +. Click chuột phải vào biến đầu tiên, chọn
Page | 48
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
Number Format/Hex. Lặ p lại cho các biến còn lại
- Đặt 1 breakpoint tr ị dòng EEPROMProgram(), click Resume đẻ chạy chương trình đến điể m breakpoint - Giá tr ị được đọc từ ô nhớ sau khi bị xóa hiển thị bên dướ i
- Nhấn Resume để chạy code. Khi LED xanh dương sáng, nhấ n Suspend. Giá tr ị mới đượ c ghi vào EEPROM sẽ được đọc lại như sau
8.2.6. Bộ bảo vệ bộ nhớ - Nhậ p project ví dụ về bộ bảo vệ bộ nhớ MPU bằng cách nhấn Project/Import Existing CCS Eclipe Project Page | 49
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Biên dịch, nạ p code vào board và chạy code - Sử dụng termainal để giao tiế p vớ i board. Thử các trườ ng hợ p sau đây :
Thử ghi giá tr ị vào flash. Sẽ gây ra lỗi vì vùng này chỉ cho đọc
Thử đọc giá tr ị từ section bị vô hiệu hóa từ trướ c. Sẽ gây ra lỗi
Thử đọc giá tr ị từ vùng chỉ đọc. Không gây ra l ỗi
Thử ghi vào vùng chỉ đọc trên RAM. Sẽ gây ra l ỗi
9. LAB 9 : FLOATING POINT UNIT 9.1.
Mục tiêu
- Trong phần này, ta sẽ sử dụng FPU để chạy thử và sơ lượ c về code FPU
Page | 50
Báo cáo thực tập tốt nghiệp
9.2.
GVHD: Trần Văn Hoàng
Thự c hành
9.2.1. Nhậ p lab9 - Chọn Project/Import Existin CCS Eclipse Project
9.2.2. Duyệt qua code - Sử file main.c hoàn chỉnh như sau Page | 51
Báo cáo thực tập tốt nghiệp
#include #include #include #include #include #include #include #include
GVHD: Trần Văn Hoàng
"inc/hw_memmap.h" "inc/hw_types.h" "driverlib/fpu.h" "driverlib/sysctl.h" "driverlib/rom.h"
#ifndef M_PI #define M_PI 3.14159265358979323846 #endif #define SERIES_LENGTH 100 float gSeriesData[SERIES_LENGTH]; int32_t i32DataCount = 0; int main(void) { float fRadians; ROM_FPULazyStackingEnable(); ROM_FPUEnable(); ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN); fRadians = ((2 * M_PI) / SERIES_LENGTH); while(i32DataCount < SERIES_LENGTH) { gSeriesData[i32DataCount] = sinf(fRadians * i32DataCount); i32DataCount++; } while(1) {} }
math.h – sử dụng cho hàm sinf()
fpu.h – hỗ tr ợ cho bộ dấu chấm động
9.2.3. Biên dịch, nạ p và chạy code - Biên dịch và nạ p code bằng cách nhấn nút Debug. Nhấn Resume để chạy code - Nhấn Suspend để dừng chương trình. Chú ý rằ ng vị trí dừng phải nằm ở vòng lặ p while(1) - Mở Memory Browser bằng cách nhấn View/Memory Browser. Nhậ p gSeriesData vào hộp địa chỉ, click Go. Bạn sẽ thấy giá tr ị của biến dướ i dạng dấu chấm động 32 bit bằng cách chọn hiển thị 32 bit Floating Point.
Page | 52
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Để thấy đượ c hành dạng sóng sin. Ta sẽ hiển thị giá tr ị của chuỗi dướ i dạng đồ thị. Chọn Tools/Graph/Single Time. Nhậ p các giá tr ị như hình dướ i
Đồ thị hình sin như sau
Page | 53
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
9.2.4. Sơ lượ c về Code - Điều thú vị bạn cần biết là thời gian để tính 100 giá tr ị của sóng sin là bao nhiêu. - Trướ c tiên, ta loại bỏ tất cả các breakpoint bằng cách nhấn Run/Remove All Breakpoints. Tại file main.c, đặt 1 breakpoint mớ i tại dòng fRadians = ((2 * M_PI) / SERIES_LENGTH); - Nhấn nút restart để khởi động lại code. Nhấn Resume để chạy code đến điểm breakpoint - Nhấn chuột phải vào Breakpoint pane và Select Breakpoint/Count event. Thay đổ i Event to Count thành Clock Cycles. Nh ấn OK - Đặt 1 breakpoint tại dòng while(1) - Nhấn Resume để thực thi chương trình đến breakpoint thứ 2. Khi chương trình dừng lại, cycle count sẽ cậ p nhật lại
- Cycle count là 34996 nghĩa là mất 350 chu kì clock để tính toán và cậ p nhật 1 giá tr ị cho biến i32dataCount. Vì clock hệ thống là 50MHz nên mỗi lần tính 1 giá tr ị mất 7us, 100 mẫu là mất 700us. - K ết thúc lab, ta bỏ toàn bộ breakpoint và đóng project lạ i.
10.LAB 12 : FLOATING POINT UNIT 10.1. Mục tiêu - Trong bài thí nghiệm này, ta sẽ gửi dữ liệu qua UART. UART sẽ đượ c k ết nối cổng nối tiế p ảo thồn qua cáp USB.
Page | 54
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
10.2. Các bướ c tiến hành. 10.2.1. Nạ p Lab12. - Chọn Project Import Existing CCS Eclipse Project. - Thực hiện như hình minh họa bên dướ i.
Page | 55
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
- Mở r ộng project và nhấp đúp vào main.c, ta thấy đoạn code như sau: #include #include #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/sysctl.h" #include "driverlib/uart.h" int main(void) { SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ); SysCtlPeripheralEnable (SYSCTL_PERIPH_UART0); SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOA); GPIOPinConfigure (GPIO_PA0_U0RX); GPIOPinConfigure (GPIO_PA1_U0TX); GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); UARTConfigSetExpClk (UART0_BASE, SysCtlClockGet(), 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE)); UARTCharPut(UART0_BASE, 'E' ); UARTCharPut(UART0_BASE, 'n' ); UARTCharPut(UART0_BASE, 't' ); UARTCharPut(UART0_BASE, 'e' ); UARTCharPut(UART0_BASE, 'r' ); UARTCharPut(UART0_BASE, ' ' ); UARTCharPut(UART0_BASE, 'T' ); UARTCharPut(UART0_BASE, 'e' ); UARTCharPut(UART0_BASE, 'x' ); UARTCharPut(UART0_BASE, 't' ); UARTCharPut(UART0_BASE, ':' ); UARTCharPut(UART0_BASE, ' ' ); while (1) { if (UARTCharsAvail(UART0_BASE)) UARTCharPut(UART0_BASE, UARTCharGet(UART0_BASE)); } }
- Trong hàm main() các tác v ụ khởi động thực hiện liên tiế p nhau để sử dụng UART:
Thiết lậ p Clock hệ thống. Cho phép UART0 và ngoại vi GPIOA (UART sử dụng chân GPIO PORT A ). Cấu hình chân để truyền và nhận sử dụng GPIOPinConfig. Nạ p giá tr ị tham số cho UART : 115200, 8-1-N. Sử dụng “UARTCharPut()” để tạo lờ i nhắc. Sử dụng vòng vô tận. Trong vòng lặ p này, nếu nhận đượ c các kí tự, UART sẽ đọc và gởi ngượ c lại. Do đó , các kí tự ta gở i sẽ bị phẩn hồi và hiện trên terminal.
10.2.2.Biên dịch, nạ p và chạy code UART. - Trên máy tính, mở putty.exe , chọn cổng COM và cấu hình Serial như sau :
Tốc độ baud: 115200 bps.
Dữ liệu : 8 bit. Page | 56
Báo cáo thực tập tốt nghiệp
Bit Parity: Không (None).
Stop bit: 1bit
Flow control: Không (None).
GVHD: Trần Văn Hoàng
- Sau đó bấm Open.
Page | 57
Báo cáo thực tập tốt nghiệp
GVHD: Trần Văn Hoàng
10.2.3.Sử dụng ngắt UART. - Trong file main.c, thêm thần include cho ngắt: #include "inc/hw_ints.h" #include "driverlib/interrupt.h"
- Sau đó, ta cấ u hình cho phép ngắt UART0 (thêm phía sau hàm UARTConfigSetExpClk())
IntMasterEnable(); IntEnable(INT_UART0); UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);
- Sử dụng thêm Led ở Port F để báo hiệu: SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);
- Cuối cùng ta bỏ các lệnh sử dụng trong While(1): while (1) { //if (UARTCharsAvail(UART0_BASE)) UARTCharPut(UART0_BASE, UARTCharGet(UART0_BASE)); }
- Để ngắt có thể thực hiện nhiệm vu ta thêm chương trình phụ c vụ ngắt: Page | 58