You are on page 1of 55

Lab1: Hardware and Software Set Up

I. Mục tiêu:

 Download và cài đặt phần mềm Code Composer Studio, cũng như download
nhiều tài liệu và phần mềm hỗ trợ để sử dụng trong toàn bộ các bài lab.
 Tìm hiểu các thành phần của kit và kiểm tra hoạt động của chương trình demo
đã được nạp sẵn trên kit.
 Các công cụ phát triển này sẽ được sử dụng trong xuyên suốt các bài lab về
sau.

II. Các bước tiến hành:

Harware
1. Yêu cầu phần cứng:
 Laptop 32 hoặc 64 bit Window XP hoặc Window 7 với tối thiểu 2G bộ nhớ ổ
cứng trống.
 Có kết nối mạng.
 Nếu thực hiện các bài lab dùng 2 màn hình hiển thị thì sẽ giúp quá trình dễ
dàng hơn. Do đó, khuyến khích các bạn mang theo labtop cá nhân trong các
gi thực hành.
 Thực hiện các bài lab trên kit EK-LM4F120XL.
 Một multi – meter.

Download và cài đặt Code Composer Studio


2. Download phần mềm Code Composer Studio (CCS) 5.x web installer từ địa chỉ
http://processors.wiki.ti.com/index.php/Download_CCS (không download bất kì
bản dùng thử nào). Yêu cầu kết nối mạng cho đến khi quá trình hoàn tất. Nếu
không có kết nối mạng thì có thể sử dụng offline version để cài đặt.
3. Nếu sử dụng file offline, chạy file ccs_setup_5.xxxxx.exe trong folder sau khi giải
nén.
4. Đồng ý Software License Agreement và click Next.

5. Ngoại trừ việc muốn cài đặt CCS một vị trí khác, thì tốt nhất nên chọn folder
mặc định theo chương trình cài đặt và Click Next.

6. Chọn “Custom” cho phần Setup type và Click Next.


7. Trong hộp thoại tiếp theo, chọn processors mà CCS sẽ hỗ trợ. Chọn “Stellaris
Cortex M MCUs” để thực hiện các bài lab. Ngoài ra, nếu quan tâm tới MSP430
thì có thể chọn “MSP430 Low Power MCUs”. Có thể chọn thêm các kiến trúc
khác, tuy nhiên sẽ mất th i gian cài đặt cũng như kích thước cài đặt sẽ lớn. Click
Next.

8. Trong hộp thoại Component, giữ mặc định các lựa chọn và Click Next.
9. Trong hộp thoại Emulator, bỏ chọn Blackhawk and Spectrum Digital emulators, trừ
khi có ý định sử dụng chúng.

10. Khi tới đến hộp thoại cài đặt cuối cùng, Click Next. Quá trình cài đặt sẽ bắt đầu.
Khi hoàn tất quá trình cài đặt, không chạy CCS.
Cài đặt StellarisWare
11. Download và cài đặt version cuối cùng của StellarisWare từ địa chỉ:
http://www.ti.com/tool/sw-lm3s . Nếu có thể, nên cài đặt StellarisWare vào folder
mặc định C:\StellarisWare.

Cài đặt LM Flash Programmer


12. Download, giải nén, và cài đặt mới nhất LM Flash Programmer
(LMFLASHPROGRAMMER) từ http://www.ti.com/tool/lmflashprogrammer .

Download ICDI Drivers


13. Download phiên bản mới nhất của in-circuit debug interface drivers từ địa chỉ
http://www.ti.com/tool/stellaris_icdi_drivers . Giải nén file di chuyển folder
stellaris_icdi_drivers vào trong địa chỉ C:\StellarisWare.

Download và cài đặt Workshop Lab Files


14. Download the lab installation file từ địa chỉ Wiki site bên dưới. Các file lab sẽ
được cài đặt trong C:\StellarisWare\boards\MyLaunchPadBoard . Do đó, phải
chắc chắn rằng StellarisWare phải được cài đặt trước đó.
www.ti.com/StellarisLaunchPadWorkshop

Download Workshop Workbook Lab Files


15. Có thể download file Tiếng Anh hướng dẫn các bài lab này với nhiều bài lab hơn
theo địa chỉ sau:
www.ti.com/StellarisLaunchPadWorkshop

Terminal Program
16. Nếu sử dụng Window XP, có thể sử dụng HyperTerminal. Window 7 không có
chương trình terminal, nên phải sử dụng một phần mềm khác. Các câu lệnh trong
các bài labs sử dụng HyperTerminal và PuTTY. Có thể download PuTTY từ địa
chỉ sau:
http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe

Window-side USB Examples


17. Download và cài đặt StellarisWare Windows-side USB examples từ địa chỉ:
www.ti.com/sw-usb-win

Download và cài đặt GIMP


18. Chúng ta sẽ cần một công cụ thao tác đồ họa có khả năng xử lí các ảnh định dạng
PNM. GIMP có thể làm điều đó. Download và cài đặt GIMP từ địa chỉ:
www.gimp.org
LaunchPad Board Schematic
19. Để tham khảo, schematic sẽ có phần cuối của tài liệu này.

Các tài liệu và trang web tham khảo hữu dụng


20. Có rất nhiều tài liệu hữu dụng, tuy nhiên ít nhất bạn nên có các tài liệu sau.
Tìm trong C:\StellarisWare\docs sẽ thấy:

Peripheral Driver User’s Guide (SW-DRL-UGxxxx.pdf)

USB Library User’s Guide (SW-USBL-UGxxxx.pdf)

Graphics Library User’s Guide (SW-GRL-UGxxxx.pdf)

LaunchPad Board User’s Guide (SW-EK-LM4F120XL-UG-xxxx.pdf )

21. Vào địa chỉ: http://www.ti.com/product/lm4f120h5qr và download


LM4F120H5QR Data Sheet. Stellaris Data Sheet thực sự là một hướng dẫn sử
dụng đầy đủ cho các device.
22. Download the ARM Optimizing C/C++ Compilers User Guide từ địa chỉ
http://www.ti.com/lit/pdf/spnu151 (SPNU151).
23. Các gợi ý được trình bày trong cuối mỗi bài labs (nếu có) để cung cấp các thông
tin hữu dụng khi gặp phải các vấn đề trong các bài labs.
24. Tìm kiếm TI website cho các tài liệu tham khảo thêm:
SPMU287: Stellaris Driver Installation Guide (for ICDI and FTDI drivers)

SPMU288: BoosterPack Development Guide

SPMU289: LaunchPad Evaluation Board User’s Manual (includes schematic)

Có thể tìm thêm thông tin ở các websites sau:


Main page: www.ti.com/launchpad

Stellaris LP: www.ti.com/stellaris-launchpad

EK-LM4F120XL product page: http://www.ti.com/tool/EK-LM4F120XL

BoosterPack webpage: www.ti.com/boosterpack

LaunchPad WiKi: www.ti.com/launchpadwiki

LM4F120H5QR folder: http://www.ti.com/product/lm4f120h5qr

Kit
25. M hộp kit ra
Sẽ có trong đó:

 The LM4F120H5QR LaunchPad Board


 USB cable (A-male to micro-B-male)
 README First card

Cài đặt Board ban đầu


26. Kết nối board với máy tính và cài đặt drivers
LM4F120 LaunchPad Board ICDI USB port (có ghi nhãn trên board là DEBUG
và có thể thấy như trong hình dưới) là cổng USB và bao gồm 3 kết nối:

Stellaris ICDI JTAG/SWD Interface - debugger connection


Stellaris ICDI DFU Device - firmware update connection
Stellaris Virtual Serial Port - a serial data connection

Drivers sẽ được cài đặt tự động.

QuickStart Application
LaunchPad Board đã được lập trình trước với một ứng dụng QuickStart. Chỉ cần cung
cấp nguồn cho board, ứng dụng này sẽ chạy một cách tự động.

27. Phải chắc chắn rằng Power switch phía trên góc trái của board được gạt qua vị
trí bên phải DEBUG như trong hình:
28. Phần mềm trong LM4F120H5QR sử dụng timers như là pulse-width modulators
(PWMs) để thay đổi cư ng độ của tất cả 3 màu trên Led đơn RGB (red, green,
and blue). B i vậy, mắt sẽ cảm nhận được nhiều màu sắc khác nhau được tạo ra
thông qua việc kết hợp các màu cơ bản.
Hai plushbuttons phía dưới của board được đánh nhãn SW1 (bên trái) và SW2
( bên phải ). Nhấn hoặc nhấn và giữ SW1 để di chuyển về phía phổ màu đỏ
cuối. Nhấn hoặc nhấn và giữ SW2 để di chuyển về phổ màu tím cuối.

Nếu không nhấn nút nào trong vòng 5 giây, phần mềm sẽ tự động quay về thay
đổi màu sắc như mặc định.

29. Nhấn và giữ cả 2 nút nhấn SW1 và SW2 trong vòng 3 giây sẽ đi vào hibernate
mode (chế độ ngủ). Trong chế độ này màu sắc cuối cùng sẽ nhấp nháy 1/2 giây
sau mỗi 3 giây. Giữa các khoảng nhấp nháy, thiết bị chế độ ngủ VDD3ON với
realtime-clock (RTC) đang chạy. Nhấn SW2 bất kì lúc nào sẽ đánh thức thiết bị
và quay về chương trình hiển thị màu sắc một cách tự động.
30. Ta có thể giao tiếp với board thông qua UART. UART được kết nối như là cổng
nối tiếp ảo thông qua kết nối USB giả lập.
Các bước sau đây sẽ hướng dẫn làm cách nào m kết nối với board sử dụng
HyperTerminal (trong Window XP) và PuTTY (trong Window 7 hoặc 8).

31. Ta cần tìm COM port number của Stellaris virtual Serial Port trong Device
Manager. Bỏ qua bước 32 nếu đạng sử dụng Window 7 hoặc 8.
Window XP:

A. Click chuột phải My Computer và chọn Properties.

B. Trong cửa sổ System Properties, chọn tab Hardware.

C. Click nút Device Manager.

M Ports heading và viết số của Stellaris Virtual Serial Port đây: COM____
32. Window 7 hoặc 8:
A. Click chuột phải My Computer và chọn Properties.

B. Chọn Device Manager hộp thoại bên trái.

M Ports heading và viết số của Stellaris Virtual Serial Port đây: COM____
33. Trong Win XP, m HyperTerminal. Trong hộp thoại hiện ra, chọn kết nối sử
dụng COM##, với ## là số của cổng COM đã ghi chú bước trước. Click OK.
Chọn các thiết lập như hình sau và click OK.

Khi cửa sổ terminal được m , nhấn ENTER một lần và LaunchPad board sẽ phản
hồi là xác nhận giao tiếp đã m . Bỏ qua bước 31.
34. Trong Win 7 hoặc 8, double click vào putty.exe. Thiết lập các cài đặt như hình
dưới và sau đó click Open. COM Port number sẽ là số mà ta đã ghi chú lại trước
đây.

Khi cửa sổ terminal được m , nhấn ENTER một lần và LaunchPad board sẽ phản
hồi là xác nhận giao tiếp đã m . Bỏ qua bước 31.

35. Bạn có thể giao tiếp bằng cách gõ các dòng lệnh sau và nhấn ENTER:
help: sẽ tạo ra một danh sách các lệnh và thông tin.

hib: sẽ đưa thiết bị vào chế độ ngủ. Nhấn SW2 để đánh thức thiết bị.

rand: sẽ bắt đầu một chuỗi pseudo-random màu sắc.

intensity: điều chỉnh độ sáng của LED từ 0 tới 100%. Với 100 sẽ làm LED hiển
thị sáng nhất.

rgb: theo sau là một “6 hex character value” để thiết lập cư ng độ của tất cả 3
LEDs. Ví dụ: rgb FF0000 LED sáng màu đỏ, rgb 00FF00 LED sáng màu xanh
dương và rgb 0000FF LED sáng màu xanh lá.

36. Đóng chương trình Terminal.


Hoàn thành!
Lab 2: Code Composer Studio

I. Mục tiêu:

Mục tiêu của lab này là làm quen với cách sử dụng Code Composer Studio một cách cơ
bản.

II. Load the Lab 2 Project

Mở Code Composer Studio

1. Double click vào shortcut Code Composer trên Destop để m CCS


Khi hộp thoại “Select a workspace” xuất hiện, trỏ đến folder My Computer:

(In WinXP) C:\Documents and Settings\< user> \My Documents

(In Win7) C:\Users\< user> \My Documents

Ngoài ra, cũng có thể trỏ đến folder mong muốn của bạn. Click OK.

Tên của workspace là không quan trọng, tuy nhiên hãy sử dụng
MyWorkspaceLM4F120.
Không chọn ô “Use this as the default and do not ask again”.

Click OK.

Nếu không có licensed Code Composer, bạn sẽ được hỏi trong những bước cài đặt
tiếp theo. Khi đó, chọn “Evaluation”. Ngay khi máy tính được kết nối với
LaunchPad board, Code Composer sẽ có đầy đủ chức năng, miễn phí. Bạn có thể
quay lại và thay đổi license nếu cần thiết bằng cách chọn Help -> Code Composer
Studio Licensing Information -> Upgrade tab -> Launch License Setup…

Khi cửa sổ “TI Resource Explorer” and/or “Grace” xuất hiện, đóng các tabs. Vào
lúc đó các công cụ chỉ hỗ trợ MSP430.

Tạo Lab2 Project


2. Trên CCS menu bar chọn File -> New -> CCS Project. Thiết lập các tùy chọn như
bên dưới. Phải chắc chắn rằng bỏ chọn “Use default location” và chọn đư ng
dẫn chính xác. Bước này là quan trọng để làm cho project của bạn linh động
và để cho liên đới tới công việc một cách trực tiếp. Gõ “120” trong ô variant để
đưa lên 4 phiên bản của thiết bị. Chọn “Empty Project (with main.c)” cho project
mẫu. Click Finish.
3. File main.c sẽ được m trong editor tab. Xóa nội dung và gõ hoặc copy/paste
đoạn code sau vào trong file. Đừng băn khoăn về code bây gi ; đã sẽ đi vào chi
tiết về code trong lab 3. Lưu ý các câu hỏi xuất hiện bên trái của các câu lệnh
include. Điều này cho biết rằng Code Composer không biết đư ng dẫn đến các
nguồn. Ta sẽ sữa điều đó phần sau.
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
int main(void)
{
int LED = 2;
SysCtlClockSet(SYSCTL_SYSDIV_4|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);
while(1)
{
// Turn on the LED
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, LED);
// Delay for a bit
SysCtlDelay(2000000);
// Cycle through Red, Green and Blue LEDs
if (LED == 8) {LED = 2;} else {LED = LED*2;}
}
}

Click nút Save trên menu bar để để lưu lại. Nếu có bất kì vấn đề gì, bạn có thể
tìm code trong folder Lab2/ccs trong file main.txt.

Nếu code thụt vào thụt ra không rõ ràng, nhấn Ctrl-A, click chuột phải và chọn
Source -> Correct Indentation.

4. M rộng project trong Project Explorer pane ( phía bên trái) bằng cách click vào
dấu + hoặc dấu của Lab 2. Danh sách này cho thấy được tất cả các file được sử
dụng để build project. Một trong các file này là startup_ccs.c mà ta đã đưa vào
trong folder của lab (file này sẵn có trong mỗi StellarisWare example). Double-
click vào file để m nó. File này định nghĩa “stack and the interrupt vector table
structure” trong những thứ khác. Các cài đặt này là cần thiết cho Code Composer
để build project. Không thay đổi bất kì nội dung nào trong file này và đóng lại.

Cài đặt Build Options


5. trên đã đề cập đến những câu hỏi xuất hiện sau hàng lệnh include. Hai bước
tiếp theo sẽ giúp giải quyết vấn đề đó để tìm ra nguồn của các file cần thiết cho
biên dịch code.
Click chuột phải Lab2 trong Project Explorer pane và chọn Properties. Click
Include Options dưới ARM Compiler. bên dưới, khung include search path,

click Add button và thêm vào include search path sau. Bạn có thể muốn
copy/paste từ workbook pdf với 2 bước tiếp theo.

${PROJECT_ROOT}/../../../..

Đư ng dẫn này cho phép trình biên dịch (compiler) tìm chính xác folder driverlib,
với 4 mức trên tính từ folder project. Chú ý rằng, nếu bạn để folder project của
bạn vị trí khác thì đư ng dẫn trên không hoạt động.
6. Phía dưới ARM Linker click File Search Path. Thêm vào cửa sổ phía trên file
library sau:
${PROJECT_ROOT}/../../../../driverlib/ccs-cm4f/Debug/driverlib-cm4f.lib
Bước này cho phép trình liên kết (linker) tìm thấy chính xác file lib. Chú ý rằng
nếu bạn không để project một vị trí khác thì đư ng dẫn trên cũng không hoạt
động.

Click OK để lưu lại các thay đổi.

Chạy Code chương trình


7. Phải chắc chắn rằng LaunchPad board đã được cắm vào. Kiểm tra rằng Lab2 là
Active Project bằng cách click vào project trong khung Project Explorer, click nút
Debug trên CCS menu bar để build và tải Lab2 project. Khi quá trình hoàn
thành, CCS sẽ trong giao diện Debug (lưu ý 2 tabs phía trên bên phải của màn
hình … kéo chúng qua bên trái một chút để bạn có thể nhìn thấy chúng hoàn
toàn).
8. Click nút Run trên CCS menu bar để chạy chương trình. Quan sát LED ba
màu sáng đỏ, lục và lam trên LaunchPad board.

Một vài đặc trưng của CCS


9. Click nút Suspend trên CCS menu bar. Nếu chương trình dừng với một báo
hiệu “No source available …” , click vào tab main.c. Hầu hết th i gian trong vòng
lặp while() là trong các hàm delay và source file này không linked vào trong
project.
10. Breakpoints
Trong cửa sổ chương trình giữa màn hình, double-click vào vùng xám bên trái
của line number của hang lệnh GPIOPinWrite() để thiết lập breakpoint (nó trông
giống thế này ). Click nút Resume để restart lại chương trình. Chương trình
sẽ dừng lại điểm breakpoint và bạn sẽ thấy một mũi tên bên trái của line
number, xác định rằng bộ đếm chương trình đã được dừng trên hang này của
code. Chú ý rằng ICDI driver hiện tại không hỗ trợ thêm vào/bỏ bớt
breakpoints trong khi processor đang chạy. Click nút Resume một vài lần hoặc
nhấn phím F8 để chạy chương trình. Quan sát LED trên LaunchPad board.

11. Register View


Click View -> Registers để thấy giá trị core and peripheral register. Chỉnh lại kích
thước cửa sổ nếu thấy cần thiết. Bấm vào dấu cộng bên trái để xem registers. Lưu
ý rằng thiết bị ngoại vi không thuộc hệ thống chưa được kích hoạt không thể đọc
được. Trong project này bạn có thể thấy Core Registers, GPIO_PORTA (where
the UART pins are), GPIO_PORTF (where the LEDs and pushbuttons are
located), HIB, FLASH_CTRL, SYSCTL and NVIC.

12. Memory View


Click View -> Memory Browser để kiểm tra processor memory. Gõ 0x00 trong ô
trống và nhấn Enter. Bạn có thể thấy memory và có thể click vào một vị trí và
thay đổi giá trị trực tiếp trong vị trí bộ nhớ đó.

13. Expressions View


Phải chắc chắn rằng bạn có thể thấy khung Expressions góc trên bên phải màn
hình. Bạn có thể phải click vào tab Expressions. Click chuột phải vào khung và
chọn Remove All để làm cho chắc chắn rằng không còn gì hiển thị trong
expressions.

Trong cửa sổ code, double-click vào biến LED xung quanh dòng 18. Click chuột
phải vào biến được chọn và chọn Add Watch Expression và sau đó click OK. Cửa
sổ trên bên phải sẽ chuyển sang Expression view và bạn sẽ thấy biến đó đã được
liệt kê. Chạy chương trình vài lần. Mỗi lần code thực hiện tới điểm breakpoint,
giá trị hiển thị sẽ được cập nhật,. Giá trị đã được cập nhật được bôi nền màu vàng.

Xóa tất cả các điểm breakpoint mà bạn đã thiết lập bằng cách click Run ->
Remove All Breakpoints từ menu bar. Một lần nữa, breakpoint chỉ có thể được
xóa khi processor không chạy.

14. Click vào Terminate để quay về môi trương soạn thảo. Click phải chuột vào
Lab2 trong khung Project Explorer và chọn Close Project để đóng project.
Minimize CCS.

LM Flash Programmer
15. LM Flash Programmer là một giao diện lập trình độc lập mà cho phép bạn lập
trình flash của của một thiết bị Stellaris thông qua nhiều port. Tạo ra nhiều file
cần thiết cho bước build r i rạc trong Code Composer mà sẽ được thấy trong
trang tiếp theo của bài lab này.
Nếu không sẵn có, cài đặt LM Flash Programmer vào máy của bạn.

16. Phải chắc chắn rằng Code Composer Studio không chạy code trong môi trư ng
CCS Debug … bằng không CCS và Flash Programmer sẽ xung đột trong việc
điều khiển USB port.
Đó sẽ là Shortcut của LM Flash Programmer trong Destop
của bạn, double-click vào đó để m công cụ. Nếu không thấy
shortcut trên Destop, vào Start -> All Programs -> Texas
Instruments -> Stellaris -> LM Flash Programmer và click vào LM Flash
Programmer.

17. Hiện tại board của bạn đang chạy ứng dụng của Lab2. Nếu User LED không sáng,
nhấn nút RESET trên board. Ta sẽ lập trình ứng dụng ban đầu tr lại trên
LM4F120H5QR.
Click vào tab Configuration. Chọn LM4F120 LaunchPad từ Quick Set menu thả
xuống của Configuration tab. Xem user’s guide để thêm thông tin về cách nào
cấu hình bằng tay công cụ cho một thiết bị mà không phải là evaluation boards.

18. Click vào tab Program. Sau đó click vào nút Browse và điều khiển đến:
C:\StellarisWare\boards\ek-lm4f120XL\qs-rgb\ccs\Debug\qs-rgb.bin

Đây là ứng dụng mà đã được nạp sẵn trên flash memory của LM4F120XL của
board.

Lưu ý rằng là các ứng dụng đây đã được build sẵn với mỗi IDE được hỗ trợ.
Phải chắc chắn rằng các ô chọn sau đây được lựa chọn:
19. Click vào nút Program.
Bạn sẽ thấy quá trình programming và verification phía dưới của cửa sổ. Sau
khi các bước này hoàn thành, quickstart application sẽ chạy trên kit.

20. Đóng LM Flash Programmer.

Tuỳ chọn: Tạo một bin File cho Flash Programmer


Nếu bạn muốn tạo một bin file để sử dụng b i stand-alone programmer trong một
vài bài labs, sử dụng các bước sau đây. Nhớ rằng project phải được m trước khi
bạn có thể thay đổi đặc tính của nó.

In Code Composer 5.2 and Earlier:

Trong Code Composer, trong Project Explorer, click chuột phải vào project và
chọn Properties. bên trái, click Build và và sau đó Steps tab. Dán các câu lệnh
sau vào trong Post-build steps Command box:

"${CCS_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin"

"${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin"

"${CG_TOOL_ROOT}/bin/ofd470" "${CG_TOOL_ROOT}/bin/hex470"

"${CCS_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin"

In Code Composer 5.3 and Later:

Trong Code Composer, trong Project Explorer, click chuột phải vào project và
chọn Properties. bên trái, click Build và và sau đó Steps tab. Dán các câu lệnh
sau vào trong Post-build steps Command box:

"${CCS_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin"

"${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin"

"${CG_TOOL_ROOT}/bin/armofd" "${CG_TOOL_ROOT}/bin/armhex"

"${CCS_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin"

Mỗi câu lệnh được bao quanh b i dấu ngoặc kép và có các khoảng trống mỗi
cái. Các bước này sẽ chạy sau khi project builds và bin file sẽ được tạo ra trong
folder … Labx/ccs/debug. Bạn có thể truy xuất nó trong CCS Project Explorer
trong project bằng cách click vào Debug folder.

Hoàn Thành!
Lab 3: Khởi tạo và GPIO

I. Mục tiêu:

Trong bài lab này ta sẽ học được làm cách nào kh i tạo clock hệ thống và ngoại vi GPIO.
Sau đó ta sẽ sử dụng các GPIO ouput để làm sang LED trên board.

II. Các bước tiến hành:

Tạo Lab3 project


1. Maximine Code Composer. Trên CCS menu bar chọn File -> New-> CCS
Project. Làm các chọn lựa như bên dưới. Phải chắc chắn rằng không chọn vào ô
“Use default location” và chọn đư ng dẫn chính xác tới “ccs” folder mà bạn tạo
ra. Bước này quan trọng vì nó sẽ làm project của bạn linh động và để include
các đường dẫn để làm việc cho đúng. Trong hộp variant, gõ “120” để thu hẹp
các kết quả trong hộp bên phải. Trong cửa sổ Project templates and examples,
chọn Empty Project (with main.c). Click Finish.
Header Files
2. Xóa nội dung hiện tại của main.c. Gõ (hoặc cắt/dán từ file pdf) các hàng sau vào
trong main.c để include các file header cần thiết truy xuất StellarisWare APIs
cũng như định nghĩa biến:
#include "inc/hw_memmap.h"

#include "inc/hw_types.h"

#include "driverlib/sysctl.h"

#include "driverlib/gpio.h"

int PinData=2;

hw_memmap.h: Macros định nghĩa memory map của thiết bị Stellaris. Include
này định nghĩa các vị trí peripheral base address như là GPIO_PORTF_BASE.
hw_types.h: định nghĩa common types và macros như là tBoolean và
HWREG(x).

sysctl.h: định nghĩa và macros cho System Control API của DriverLib. Cái này
bao gồm API functions như là SysCtlClockSet và SysCtlClockGet.

gpio.h: định nghĩa và macros cho GPIO API của DriverLib. Cái này bao gồm API
functions như là GPIOPinTypePWM và GPIOPinWrite.

int PinData=2; : tạo một biến integer được gọi là PinData và kh i tạo giá trị của
nó là 2. Nó sẽ được sử dụng để quay vòng qua 3 LED, sáng một lần một th i
điểm.

Bạn sẽ thấy câu hỏi xuất hiện bên trái của dòng include trong main.c được hiển thị
trong Code Composer. Ta chưa định nghĩa đư ng dẫn tới include folders, do đó
Code Composer không thể tìm thấy chúng. Ta sẽ sửa lỗi này sau.

Main() Function
3. Tiếp theo, ta sẽ tạo một khuôn mẫu cho hàm main. Copy đoạn code sau vào phía
sau phần khai báo của chương trình:
int main(void)
{

Clock Setup
4. Cấu hình clock hệ thống để chạy sử dụng một thạch anh 16MHz trên bộ giao
động chính, lái qua 400MHz PLL. 400MHz PLL dao động tần số duy nhất,
nhưng có thể được điều khiển b i các thạch anh và bộ dao động chạy giữa 5 và
25MHz. Có một mặc định là bộ chia 2 trong đư ng clock và bây gi ta đang thiết
lập thêm bộ chia 5, để nâng tổng số lên 10. Điều đó có nghĩa là clock hệ thống sẽ
40MHz. Đưa hàng code sau vào trong hàm main():
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);

Biểu đồ dưới đây là một bản vẽ vắn tắt của clock tree để nhấn mạnh đư ng Clock
hệ thống và sự lựa chọn.
Biểu đồ bên dưới là một phần được trích từ LaunchPad board Schematic. Lưu ý rằng
thạch anh gắn liền với đầu vào dao động chính là 16MHz, trong khi thạch anh gắn với
đầu vào real-time clock (RTC) là 32,768MHz.

GPIO Configuration
5. Trước khi gọi bất kỳ hàm ngoại vi cụ thể driverLib, ta phải tích cực clock cho
ngoại vi đó. Nếu bạn thất bại, nó sẽ trả về kết quả là một Fault ISR (address fault).
Đây là một lỗi chung của một số ngư i dùng thư ng mắc phải. Hàng lệnh thứ 2
bên dưới cấu hình 3 chân GPIO kết nối với LEDs như là ngõ ra. Một phần sơ đồ
bên dưới của LaunchPad board schematic chỉ rõ các chân PF1, PF2 và PF3 là
được kết nối với LEDs.
Cách ra một hàng, sau đó đưa 2 hàng code sau vào trong main() sau hang lệnh
bước trước.

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);

Base addresses của GPIO ports được liệt kê trong User Guide được đưa ra bên
dưới. Lưu ý rằng chúng là tất cả trong memory map’s peripheral section được đưa
ra trong module 1. APB là Advanced Peripheral Bus, trong khi AHB là Advanced
High-Performance Bus. AHB cung cấp hiệu suất tốt hơn so với APB bus. GPIO
truy cập thông qua AHB có thể dịch chuyển với một chu kì xung clock so với 2
chu kỳ xung clock đối với port trên APB. Trong các ứng dụng nhạy cảm về công
suất, APB sẽ là một sự lựa chọn tốt hơn so với AHB. Trong bài lab này,
GPIO_PORTF_BASE là 0x40025000.

GPIO Port A (APB): 0x4000.4000


GPIO Port A (AHB): 0x4005.8000
GPIO Port B (APB): 0x4000.5000
GPIO Port B (AHB): 0x4005.9000
GPIO Port C (APB): 0x4000.6000
GPIO Port C (AHB): 0x4005.A000
GPIO Port D (APB): 0x4000.7000
GPIO Port D (AHB): 0x4005.B000
GPIO Port E (APB): 0x4002.4000
GPIO Port E (AHB): 0x4005.C000
GPIO Port F (APB): 0x4002.5000
GPIO Port F (AHB): 0x4005.D000
While() Loop
6. Cuối cùng, tạo một vòng lặp while(1) để gửi một “1” hay “0” tới một pin GPIO
cho trước, với một hàm delay giữa 2 lệnh.
SysCtlDelay() là một vòng lặp timer được cung cấp trong StellarisWare. Tham số
đếm là số vòng lặp, không phải th i gian delay thực sự trong chu kì clock.

Để ghi vào chân GPIO, sử dụng GPIO API function được gọi là GPIOPinWrite.
Phải chắc chắn đọc và hiểu được làm thế nào GPIOPinWrite function được sử
dụng trong Datasheet.

Trong ví dụ bên dưới, ta đang ghi giá trị trong biến PinData lên tất cả 3 pin GPIO
mà được kết nối tới LEDs. Chỉ có 3 pin đó được sẽ được ghi giá trị dựa trên bit
mask đã được xác định trước đó.

Bây gi có lẽ là th i điểm tốt để nhìn vào Datasheet cho Stellaris device. Xem
chương GPIO để hiểu cách duy nhất GPIO data register được thiết kế và ưu điểm
của phương pháp.

Bỏ trống một hàng và thêm đoạn code sau vào trong hàm main():

while(1)
{
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, PinData);
SysCtlDelay(2000000);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x00);
SysCtlDelay(2000000);
if(PinData==8) {PinData=2;} else {PinData=PinData*2;}
}

7. Click nút Save để lưu lại. Đoạn chương trình sẽ như sau:

#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
int PinData=2;
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);
while(1)
{
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, PinData);
SysCtlDelay(2000000);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x00);
SysCtlDelay(2000000);
if(PinData==8) {PinData=2;} else {PinData=PinData*2;}
}
}

Nếu bạn đang cố gắng build đoạn chương trình trên thì không nên, vì như vậy sẽ
thất bại. Lưu ý các câu hỏi xuất hiện trong hàng lệnh include… CCS vẫn chưa
biết vị trí của các file đó đâu. Chúng ta vẫn cần thêm vào start up code và thiết
lập các tùy chọn để build.

Startup Code
8. Ngoài các file chính đã tạo ra, bạn cũng cần có một startup file cụ thể để chuỗi
công cụ mà bạn đang sử dụng. File này chứa đựng vector table, startup routines để
sao chép data kh i tạo cho RAM, xóa bss section, và lỗi mặc định ISRs. File này
đã đưa vào trong folder của bạn.
Double-click vào startup_ccs.c trong Project Explorer pane và có một cái nhìn
tổng quan. Đừng thay đổi điều gì vào lúc này.

Set the Build Options


9. Click chuột phải vào Lab3 trong Project Explorer pane và chọn Properties. Click
Include Options dưới ARM Compiler. phía dưới, include search path pane,
click nút Add và thêm vào “search path” sau:
${PROJECT_ROOT}/../../../..

Nếu bạn làm theo các hướng dẫn trên trong quá trình tạo Lab3 project, thì
đư ng dẫn trên trên 4 mức so với folder project, sẽ cho phép project của bạn
truy xuất vào inc và driverlib folder. Bằng không, bạn phải tự điều chỉnh đư ng
dẫn của mình.

Để tránh gõ sai thì tốt nhất là copy/paste đoạn này và đoạn ở bước tiếp theo.
Click OK. Ngay lập tức, CCS sẽ refresh lại project và bạn sẽ thấy là các câu hỏi
sau câu lệnh include trong main.c sẽ biến mất.

10. Click phải chuột Lab3 trong Project Explorer pane một lần nữa và chọn
Properties. Phía dưới ARM Linker, click File Search Path. Ta phải cung cấp
cho project đư ng dẫn đến M4F libraries. Thêm include library file sau vào cửa
sổ phía trên:
${PROJECT_ROOT}/../../../../driverlib/ccs-cm4f/Debug/driverlib-cm4f.lib

Dĩ nhiên là nếu bạn không làm theo các bước hướng dẫn trên khi tạo Lab3
project thì đư ng dẫn này phải được hiểu chỉnh.
Click OK để lưu lại các thay đổi.

Compile, Download and Run the Code


11. Biên dịch và tải ứng dụng bằng cách click vào nút Debug trên menu bar.
Nếu bạn được nhắc nh để lưu các thay đổi thì hãy làm theo. Nếu có bất cứ vấn
đề gì, sữa chữa chúng, và click nút Debug một lần nữa. Sau khi build thành công,
giao diện gỡ lỗi sẽ xuất hiện.
Click nút Resume để chạy chương trình mà được download vào flash memory
của device của bạn. Bạn sẽ thấy LED chớp sang. Nếu bạn muốn chỉnh sửa lại
code để thay đổi th i gian delay và chọn đèn nào được sáng thì cứ tiến hành.

Nếu bạn đang làm việc với code và nhận được thông báo “No source available for

…”, đóng editor tab đó lại. Source code cho hàm đó không nằm trong project. Nó
chỉ xuất hiện như một library file.

Click vào nút Terminal để quay về giao diện CCS Edit.

Examine the Stellaris Pin Masking Feature


Lưu ý rằng các bước sau đây hơi khác so với workshop video.

12. Thay đổi code để tất cả 3 LEDs đều sáng cùng lúc. Làm các thay đổi sau:
Tìm hàng có chứa int PinData= 2; và thay đổi thành int PinData= 14;

Tìm hang có chứa if(PinData … và chỉnh lại đoạn này thành phần ghi chú bằng
cách thêm 2 dâu // vào đầu hang.

Lưu lại thay đổi.

13. Compile và download ứng dụng bằng cách click vào nút Debug trên menu
bar. Click nút Resume để chạy chương trình. Với 3 LEDs cùng sáng một lúc,
bạn sẽ thấy là chúng nhấp nháy một màu gần như là màu trắng.
14. Bây gi ta sẽ sử dụng pin masking feature để sáng LEDs một lúc. Ta sẽ không
phải tr về giao diện CCS Edit để chỉnh sửa code. Ta có thể làm ngay. Trong cửa
sổ code, nhìn hàng đầu tiên có chứa GPIOPinWrite(). Pin mask đây là
GPIO_PIN_1| GPIO_PIN_2| GPIO_PIN_3 , có nghĩa là tất cả 3 trong số các vị
trị bit này, tương ứng với vị trí của LED sẽ được gửi ra GPIO port. Thay đổi bit
mask thành GPIO_PIN_1. Dòng lệnh sẽ giống như sau:
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, PinData);

15. Compile và download ứng dụng bằng cách click vào nút Debug trên menu
bar. Khi được nhắc lưu lại công việc, click OK. Khi bạn được hỏi nếu như muốn
kết thúc debug session, click Yes.
Trước khi click nút Resume, đoán trước LED mà bạn mong đợi sẽ sáng: ____

Click vào nút Resume . Nếu bạn đoán là màu đỏ, bạn đã đúng.

16. Thay đổi bit mask thành GPIO_PIN_2. Dòng lệnh sẽ giống như sau:
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, PinData);

17. Compile và download ứng dụng bằng cách click vào nút Debug trên menu
bar. Khi được nhắc lưu lại công việc, click OK. Khi bạn được hỏi nếu như muốn
kết thúc debug session, click Yes.
Trước khi click nút Resume, đoán trước LED mà bạn mong đợi sẽ sáng: ____

Click vào nút Resume . Nếu bạn đoán là xanh lam, bạn đã đúng.

18. Thay đổi bit mask thành GPIO_PIN_3. Dòng lệnh sẽ giống như sau:
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, PinData);
19. Compile và download ứng dụng bằng cách click vào nút Debug trên menu
bar. Khi được nhắc lưu lại công việc, click OK. Khi bạn được hỏi nếu như muốn
kết thúc debug session, click Yes.
Trước khi click nút Resume, đoán trước LED mà bạn mong đợi sẽ sáng: ____

Click vào nút Resume . Nếu bạn đoán là xanh lục, bạn đã đúng.

20. Homework: Hãy nhìn cách sử dụng của ButtonsPoll() API gọi trong file qs-rgb.c
trong quickstart application (qs-rgb) folder. Viết code để sử dụng hàm API để tắt
m LED sử dụng pushbuttons.
Hoàn thành!
Lab 4: Interrupts and the Timer

I. Mục tiêu:

 Thiết lập chế độ hoạt động của Timer để tạo ra ngắt.

 Viết chương trình sử lý ngắt để nháy led.

I. Các bước tiến hành:

Import Lab4 Project

1. Chúng tôi đã tạo ra cho bạn project lab4 cho bạn một file main.c trống, một file
startup và tất cả các thiết lập cần thiết để build một project. Bạn cần phải hoàn thiện
code c n lại cho project. Để import project click Project → Import Existing CCS
Eclipse Project. Chọn project cần import, bỏ dấu check mục “Copy projects into
workspace” và click finish.

Header Files

2. Sau khi đã import project bạn cần phải chỉnh sửa lại file main.c.
 Trước tiên bạn thêm đoạn code sau vào đầu file main.c để include các file
header cần thiết để truy cập vào các hàm API trong thư viện StellarisWare.
 #include "inc/hw_ints.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"
 Trong đó:
 hw_ints.h: là macros để xác định các ngắt trên thiết bị Stellaris (NVIC)
 hw_memmap.h : là macros để xác định bản đồ bộ nhớ của thiêt bị Stellaris,
nó bao gồm các define thanh ghi địa chỉ bắt đầu của một thiết bị ngoại vi. Ví
dụ như: GPIO_PORTF_BASE.
 hw_types.h : define các kiểu thông thư ng và các macros như tBoolean và
HWREG(x).
 sysctl.h : đây là define và macros các API system control trong driverlib.
đây include các hàm như SysCtlClockSet và SysCtlClockGet.
 interrupt.h : đây là define và macros các API điều khiển NIVC (interrupt)
trong driverlib. đây include các hàm như IntEnable và IntPrioritySet.
 gpio.h : đây là define và macros các API điều khiển GPIO trong driverlib.
đây include các hàm như GPIOPinTypePWM và GPIOPinWrite.
 timer.h : đây là define và macros các API điều khiển Timer trong driverlib.
đây include các hàm như TimerConfigure và TimerLoadSet.

Main() Function

3. Chúng ta sẽ sử dụng biến Period để tính toán độ Timer delays. Chúng ta sẽ tạo hàm
main() cùng với việc tạo một biến unsigned-long Period trong hàm, như sau.
int main(void)
{
unsigned long ulPeriod;
}

Clock setup

4. Configure clock hệ thống chạy với tần số 40Mhz ( y như trong lab 3) với d ng
configure sau:
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16M
HZ|SYSCTL_OSC_MAIN);

GPIO Configuration

5. Cũng như lab trước chúng ta sẽ enable ngoại vi GPIO nối của pin được nối đến Led.
Và cho phép pin với chức năng là output với d ng code sau:
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,
GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);

Timer Configuration

6. Một lần nữa, chúng ta cần phải enable clock cho ngoại vi trong thanh ghi RCGCn
trước khi truy cấp đến các thanh nghi của nó. Nếu không thì hệ thống sẽ báo lỗi Fault
ISR. Trong project này ta sẽ configure cho Timer 0 chạy trong chế độ định thì Timer
32bit, nên nhớ rằng khi Timer 0 chạy trong chế độ 32 bit thì nó sẽ dùng 2 timer 16bit
Timer 0A và Timer 0B. TIMER0_BASE là địa chỉ kh i đầu của Timer 0 trong bản đồ
bộ nhớ. Và đoạn code sau đây sẽ configure cho Timer 0 hoạt động trong chế độ trên:
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);

Calculate Delay

7. Trong project này ta sẽ tiến hành cho Led chớp tắt với tần số 10Hz và với duty cycle
là 50 . Bạn cần phải tạo ra một ngắt tại th i gian mong muốn. Trước tiên bạn cần
phải tính toán số chu kỳ clock cho 10hz bằng cách gọi hàm SysCtlClockGet() và chia
cho tần số clock mong muốn. Tiếp theo là chia 2 số clock để tạo được một ngắt tại
khoảng th i gian mong muốn.
 Sau đó bạn cần phải nạp giá trị số chu kỳ clock này cho thanh ghi Timer’s
Interval Load bằng cách sử dụng hàm TimerLoadSet trong driverlib timer
API. Nên nhớ là bạn cần phải trừ đi một chu kỳ clock tại th i điểm ngắt tại 0.
 Đoạn code sau đây sẽ thực hiện các tính toán trên:
 ulPeriod = (SysCtlClockGet() / 10) / 2;
 TimerLoadSet(TIMER0_BASE, TIMER_A, ulPeriod -1);

Interrupt Enable

8. Tiếp theo chúng ta cần phải cho phép ngắt không những cho từng module mà c n cho
phép ngắt trong NVIC. Hàm IntMasterEnable cho phép ngắt cho toàn bộ hệ thống.
Hàm IntEnable cho phép ngắt của từng module ngoại vi bên trong hệ thống. Hàm
TimerIntEnable cho phép ngắt từng sự kiện xãy ra trên module Timer. đây chúng ta
sẽ set cho Timer 0 ngắt khi xảy ra sự kiện Timeout.
 Bạn cần phải thêm đoạn code dưới đây vào chương trình để cấu hình cho ngắt
Timer:
 IntEnable(INT_TIMER0A);
 TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
 IntMasterEnable();

Timer Enable

9. Cuối cùng chúng ta sẽ kích hoạt cho Timer chạy. Việc này cho phép Timer bắt đàu
chạy và sẽ kích hoạt ngắt timeout.
 Thêm đoạn code sau vào chương trình để cho phép Timer bắt đầu chạy.
 TimerEnable(TIMER0_BASE, TIMER_A);

Main Loop

10. Một v ng lặp vô tận sẽ được thực hiện bằng một lệnh while(1). Việc bật tắt Led sẽ
được thực hiện trong hàm ngắt.
 Thêm một d ng code sau vào sau các d ng code trước:
 while(1)
 {
 }

Timer Interrupt Handler

11. Và tiếp theo ta cần phải viết chương trình ngắt trong Timer để thực hiện vệc bật tắt
Led dựa vào trạng thái Led hiện tại. Trước tiên cần phải kiểm tra nguồn ngắt và xóa
c báo ngắt bằng hàm TimerIntClear(). Kiểm tra trạng thái của pin GPIO bằng hàm
GPIOPinRead(), và bật tắt pin GPIO bằng hàm GPIOPinWrite().
 Thêm đoạn code sau vào sau hàm main():
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);
}
}

12. Click save để save lại code của bạn. Và kết quả đoạn code của bạn sẽ được như sau:
#include "inc/hw_ints.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)
{
unsigned long ulPeriod;

SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16M
HZ|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_32_BIT_PER);

ulPeriod = (SysCtlClockGet() / 10) / 2;


TimerLoadSet(TIMER0_BASE, TIMER_A, ulPeriod -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);
}
}

Startup Code

13. Open startup_ccs.c để chỉnh sửa. Tận tin này sẽ chứa tất cả các bảng vector ngắt mà
chúng ta đã trình thảo luận trước đó. Trong tập tin tìm đến d ng Timer 0 subtimer A.
bạn cần phải c n thận thay thế tên IntDefaultHandler thành tên Timer0IntHandler đây
chính là tên mà bạn đã đặt cho hàm sử lý ngắt Timer 0.


 Bạn cũng cần phải khai báo hàm này với từ khóa extern phía trên để báo cho
trình compiler biết biểu tượng này. Bạn cần tìm đến d ng:
 extern void _c_int00(void);
 và add thêm d ng sau vào ngay bên dưới nó:
 extern void Timer0IntHandler(void);


 Click save.

Compile, Download and Run The Code

14. Để Compile và download ứng dụng của bạn click vào nút Debug trong menu bar.
Nếu bạn thấy bất kỳ một vấn đề gì thì bạn sữa lại chứng và tiến hành compile lại lần
nữa. Sau khi thành công thì giao diện chương trình Debug sẽ xuất hiện.
 Click vào nút Resume để tiến hành chạy chương trình được download
xuống bộ nhớ flash của thiết bị. Lúc này đèn Led màu xanh sẽ được nhấp
nháy trên board launchpad.

 Khi bạn muốn kết thúc, click nút terminate để tắt chức năng Debug.

Exceptions

15. Tìm các d ng enable các thiết bị ngoại vi, và chỉnh sửa nó lại như hình sau.


 Đây là đoạn code truy cập vào thiết bị ngoại vi mà không enable clock. Điều
này sẽ tạo ra một ngoại lệ.

16. Tiến hành compile và download lại chương trình. Click Resume để chạy chương
trình. Xem điều gì xảy ra, chư ng trình này chạy có tốt không đèn Led màu xanh có
nháy không.

17. Click nút terminate để kết thúc chương trình Debug. Rút và cắm lại cáp micro-
USB cable trên kit LaunchPad để cấp nguồn lại. Các thanh ghi sẽ có giá trị default khi
mới cấp nguồn tr lại.
 Code mà bạn đã download xuống đang chạy. Nhưng Led màu xanh không
nhấp nháy.

18. Compile và Download lại chương trình. Click Resume để chạy chương trình.
Không có gì xảy ra. Bạn click nút Suspend để dừng quá trình Debug lại. Bạn sẽ
thấy rằng chương trình sẽ bị mắc kẹt trong FaultISR(). Tất cả các ngoại lệ ISRs được
thực hiện bằng while(1). Điều này là không hề mong muốn trong ứng dụng của bạn.

19. Loại bỏ comment và tiến hành compile, download và chạy lại chương trình một lần
nữa để chắc chắn chương trình của bạn chạy tốt. Khi thực hiện xong bạn click nút
terminate để kết thức trình Debug và tiến hành đóng project lại.

20. Homework Idea: kiểm tra về việc điều chế độ rộng xung của Timer. Chương trình
timer nhấp nháy Led nhanh hơn mắt bạn có thể nhìn thấy. Thư ng là lớn hơn 30Hz,
và sử dụng độ rộng xung để thay đổi cư ng độ sáng nhạnh hơn. Viết một v ng lặp để
thực hiện điều chỉnh cư ng độ khác nhau theo định kỳ.
Hoàn thành!
Lab 5: ADC12

I. Mục tiêu:

Trong lab này, chúng tôi sẽ sử dụng ADC12 và sample sequencers để đo các dữ liệu từ
các cảm biến nhiệt độ trên chip. Chúng tôi sẽ sử dụng code Composer để hiển thị các giá
trị thay đổi.

II. Các bước tiến hành:

Import Lab5 Project

1. Chúng tôi đã tạo ra cho bạn project lab4 cho bạn một file main.c trống, một file
startup và tất cả các thiết lập cần thiết để build một project. Bạn cần phải hoàn thiện
code c n lại cho project. Để import project click Project → Import Existing CCS
Eclipse Project. Chọn project cần import, bỏ dấu check mục “Copy projects into
workspace” và click finish.

Header Files

2. Xóa nội dung hiện tại của file main.c, thêm các d ng dưới đây vào file main.c. Nó
bao gồm các file header để truy cập vào các hàm API trong StellarisWare.
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/sysctl.h"

 adc.h: định nghĩa cho việc sử dụng ADC driver.


#include "driverlib/adc.h"

Driver Library Error Routine

3. Th i gian chạy kiểm tra thông số của các thiết bị ngoại vi Driver Library là khá mau
kể từ khi kiểm tra quá mức sẽ có ảnh hư ng tiêu cực đến tính chu kỳ. Nhưng, trong
quá trình Debug, bạn có thể thấy rằng bạn đã được gọi là một driver library API với
các thông số không chính xác hoặc một thư viện chức năng tạo ra một lỗi vì một lý do
khác. Các mã sau đây sẽ được gọi nếu các driver library gặp một lỗi như. Để code
chạy ta cần thêm vào đoạn code sau.
 #ifdef DEBUG
 void__error__(char *pcFilename, unsigned long ulLine)
 {
 }
 #endif

Main()

4. Thiết lập hàm main() với các d ng sau:


 int main(void)
 {
 }

5. Định nghĩa sau đây sẽ tạo ra một mảng sẽ được sử dụng để lưu trữ các dữ liệu đọc từ
ADC FIFO. Nó phải là lớn FIFO cho các chuỗi được sử dụng. Chúng ta sẽ sử dụng
tuần tự 1 có độ sâu FIFO của 4. Nếu sequencer khác đã được sử dụng với một FIFO
nhỏ hơn hoặc sâu hơn, sau đó kích thước mảng sẽ phải được thay đổi. Ví dụ, se-
quencer 0 có độ sâu 8.
 Thêm d ng khai báo sau vào đầu hàm main():
 unsigned long ulADC0Value[4];

6. Chúng ta sẽ cần một số biến tính nhiệt độ từ các dữ liệu cảm biến. Biến đầu tiên là để
lưu trữ trung bình của nhiệt độ. Các biến còn lại được sử dụng để lưu trữ các giá trị
nhiệt độ C và độ F. Tất cả đều được khai báo là 'volatile’ để mỗi biến sẽ không được
tối ưu hóa b i trình biên dịch và sẽ có sẵn cho các 'Expression' hoặc 'Local'
window(s) tại th i gian chạy. Thêm vào những d ng sau vào cuối :
 volatile unsigned long ulTempAvg;
 volatile unsigned long ulTempValueC;
 volatile unsigned long ulTempValueF;

7. Set up clock hệ thống là 40Mhz. bằng cách thêm vào chương trình d ng lệnh sau:
 SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAI
N|SYSCTL_XTAL_16MHZ);

8. Kích hoạt module ADC0 bằng cách thêm d ng lệnh sau vào d ng kế tiếp:
 SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
9. Trong ví dụ này, chúng ta thiết lập tốc độ lấy mẫu là 250kilo-samples trong mỗi giây.
Hàm API SysCtlADCSpeedSet() có thể set tốc độ lấy mẫy với các tốc độ cụ thể
(125KSPS, 500KSPS and 1MSPS).
 Add thêm vào d ng tiếp theo d ng lệnh sau:
 SysCtlADCSpeedSet(SYSCTL_ADCSPEED_250KSPS);

10. Trước khi cấu hình các thiết lập ADC sequencer. Ta cần phải disable ADC sequencer
1.
 Add thêm vào d ng tiếp theo d ng lệnh sau:
 ADCSequenceDisable(ADC0_BASE, 1);

11. Bây gi chúng ta có thể cấu hình ADC sequencer. Chúng ta muốn sử dụng ADC0,
mẫu sequencer 1, chúng ta muốn các bộ vi xử lý để kích hoạt sequencer và chúng ta
muốn sử dụng ưu tiên cao nhất.
 Add thêm vào d ng tiếp theo d ng lệnh sau:
 ADCSequenceConfigure(ADC0_BASE, 1, ADC_TRIGGER_PROCESSOR, 0);

12. Tiếp theo chúng ta cần phải cấu hình tất cả bốn steps trong sequencer ADC. Cấu hình
các steps 0-2 trên sequencer 1 để lấy mẫu cảm biến nhiệt độ (ADC_CTL_TS). Trong
ví dụ này, chúng ta sẽ đạt trung bình tất cả bốn mẫu dữ liệu cảm biến nhiệt độ trên
sequencer 1 để tính toán nhiệt độ, vì vậy tất cả bốn steps sequencer sẽ đo cảm biến
nhiệt độ. Để biết thêm thông tin về bộ sắp xếp dãy ADC và các steps, tham khảo
datasheet của thiết bị cụ thể.
 Add thêm 3 d ng sau vào d ng tiếp theo d ng lệnh:
 ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_TS);
 ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_TS);
 ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_TS);

13. steps sequencer cuối cùng đ i hỏi một vài thiết lập bổ sung. Mẫu cảm biến nhiệt độ
(ADC_CTL_TS) và cấu hình c ngắt (ADC_CTL_IE) được thiết lập khi mẫu được
thực hiện. Cho logic ADC rằng đây là việc chuyển đổi cuối cùng trên sequencer 1
(ADC_CTL_END).
 Add thêm vào d ng tiếp theo d ng lệnh sau:
 ADCSequenceStepConfigure(ADC0_BASE, 1, 3, ADC_CTL_TS | ADC_CTL_IE |
ADC_CTL_END);

14. Bây gi chúng ta có thể enable ADC sequencer 1.


 Add thêm vào d ng tiếp theo d ng lệnh sau:
 ADCSequenceEnable(ADC0_BASE, 1);

15. Vẫn trong hàm main(), thêm v ng lặp while (1).


 Add thêm 3 d ng code sau vào d ng kế tiếp:
 while(1)
 {
 }

16. Save lại code của bạn. Ta sẽ được đoạn code dưới đây
 #include "inc/hw_memmap.h"
 #include "inc/hw_types.h"
 #include "driverlib/debug.h"
 #include "driverlib/sysctl.h"
 #include "driverlib/adc.h"

 #ifdef DEBUG
 void__error__(char *pcFilename, unsigned long ulLine)
 {
 }
 #endif

 int main(void)
 {
 unsigned long ulADC0Value[4];
 volatile unsigned long ulTempAvg;
 volatile unsigned long ulTempValueC;
 volatile unsigned long ulTempValueF;


SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|
SYSCTL_XTAL_16MHZ);

 SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
 SysCtlADCSpeedSet(SYSCTL_ADCSPEED_250KSPS);
 ADCSequenceDisable(ADC0_BASE, 1);

 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)
 {

 }
 }
 Khi bạn xây dựng code này, bạn có thể nhận được một cảnh báo
“ulADC0Value was declared but never referenced”. Bỏ qua cảnh báo này,
chúng ta sẽ thêm code để sử dụng mảng này sau.

Inside the while(1) Loop


Trong while (1) chúng ta sẽ đọc giá trị của cảm biến nhiệt độ và tính toán nhiệt độ.

17. Các dấu hiệu cho thấy việc chuyển đổi ADC hoàn tất sẽ là lá c tình trạng gián đoạn
ADC. Nó luôn luôn thực hành lập trình tốt để đảm bảo rằng lá c được xóa trước khi
viết mã xử lý nó.
 Thêm đoạn code sau vào d ng đầu tiên trong v ng lặp while(1):
 ADCIntClear(ADC0_BASE, 1);

18. Sau đó chúng ta có thể kích hoạt chuyển đổi ADC bằng phần mềm. Chuyển đổi ADC
cũng có thể được kích hoạt b i nhiều nguồn khác.
 Thêm d ng code sau đây sau vào d ng tiếp theo trong v ng lặp while(1):
 ADCProcessorTrigger(ADC0_BASE, 1);

19. Sau đó, chúng ta cần phải ch đợi cho việc chuyển đổi để hoàn thành. Rõ ràng, một
cách tốt hơn để làm điều này là sử dụng một interrupt, chứ không phải là một lệnh
ch đợi quá trình chuyển đổi kết thúc.
 Thêm d ng code sau đây sau vào d ng tiếp theo trong v ng lặp while(1):
 while(!ADCIntStatus(ADC0_BASE, 1, false))
 {
 }

20. Sau khi đã đợi cho quá trình chuyển đổi hoàn thành, bây gi ta có thể đọc giá trị của
ADC từ ADC Sample Sequencer 1 FIFO. Hàm này có chức năng sao lưu mẫu dữ liệu
chuyển đổi ADC chứa trong ADC Sample Sequencer 1 FIFO vào một bộ đệm trong
bộ nhớ. Điều này chỉ trả lại các dữ liệu đang sẵn có trong ADC Sample Sequencer 1
FIFO, nó có thể trả lại không đầy đủ dữ liệu nếu bạn cố gắng truy cập FIFO khi quá
trình chuyển đổi chưa hoàn tất.
 Thêm d ng code sau đây sau vào d ng tiếp theo trong v ng lặp while(1):
 ADCSequenceDataGet(ADC0_BASE, 1, ulADC0Value);

21. Tiếp theo ta sẽ tiến hành tính toán giá trị trung bình của dữ liệu. Chúng ta sẽ nói về
hoạt động của phép toán floating point sau, vì vậy bây gi nó là phép toán fixed-
point.
 Việc bổ xung thêm 2 là để làm tr n. Từ phép toán 2/4 1/2 0.5, 1.5 sẽ được
làm tr n lên 2 bằng việc bổ xung thêm 0.5, c n trư ng hợp 1.0 khi được thêm
vào 0.5 sẽ thành 1.5, điều này sẽ được làm tr n xuống 1.0 do quy tắc làm tr n
của phép toán nguyên.
 Thêm d ng code sau đây sau vào d ng tiếp theo trong v ng lặp while(1):
 ulTempAvg = (ulADC0Value[0] + ulADC0Value[1] + ulADC0Value[2] +
 ulADC0Value[3] + 2)/4;

22. Bây gi chúng ta đã có được giá trị trung bình của cảm biến nhiệt độ, chúng ta sẽ tiến
hành tính toán giá trị nhiệt độ theo oC bằng công thức dưới đây được đề cập trong
phần 13.3.6 của datasheet LM4F120H5QR. Phép chia được thực hiện cuối cùng để
tránh việc làm tr n trong quá trình tính toán.
 TEMP = 147.5 – ((75 * (VREFP – VREFN) * ADCVALUE) / 4096)
 Chúng ta cần phải nhân tất cả cho 10 bên trong, và sau đó chia cho 10 cuối
cùng để được kết quả đúng, VREFP – VREFN là VDD hoặc 3.3v chúng ta sẽ
nhân nó cho 10 và sau đó nhân tiếp cho 75 để được 2475.
 Thêm d ng code sau đây sau vào d ng tiếp theo trong v ng lặp while(1):
 ulTempValueC = (1475 - ((2475 * ulTempAvg)) / 4096)/10;

23. Sau khi đã có oC việc tính toán oF là hết sức dễ dàng. Phép chia được thực hiện sau để
tránh làm tr n trong quá trình tính toán.
 Chúng ta sẽ dùng công thức sau để chuyển đổi từ oC sang oF: F ( C * 9)/5
+32 điều chỉnh lại một chút ta có: F ((C * 9) + 160) / 5.
 Thêm d ng code sau đây sau vào d ng tiếp theo trong v ng lặp while(1):
 ulTempValueF = ((ulTempValueC * 9) + 160) / 5;

24. Save code của bạn lại, ta sẽ được đoạn code như sau:


#include "inc/hw_memmap.h"


#include "inc/hw_types.h"


#include "driverlib/debug.h"


#include "driverlib/sysctl.h"


#include "driverlib/adc.h"



#ifdef DEBUG


void__error__(char *pcFilename, unsigned long ulLine)


{


}


#endif



int main(void)


{


unsigned long ulADC0Value[4];


volatile unsigned long ulTempAvg;


volatile unsigned long ulTempValueC;


volatile unsigned long ulTempValueF;


SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|


SYSCTL_XTAL_16MHZ);



SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);


SysCtlADCSpeedSet(SYSCTL_ADCSPEED_250KSPS);


ADCSequenceDisable(ADC0_BASE, 1);



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, ulADC0Value);
ulTempAvg = (ulADC0Value[0] + ulADC0Value[1] + ulADC0Value[2] +


ulADC0Value[3] + 2)/4;


ulTempValueC = (1475 - ((2475 * ulTempAvg)) / 4096)/10;


ulTempValueF = ((ulTempValueC * 9) + 160) / 5;


}
}

Add Pre-defined Symbol

25. Click chuột phải vào project Lab5 trong Project Explorer chọn Properties. Bạn click
theo đư ng dẫn sau Build → ARM Compiler → Advanced Options → Predefined
Symbols. Trong phần Pre-define NAME add define DEBUG. Click Ok. Trong các
bài lab tiếp theo define này luôn được xác định.


Build and Run the Code

26. Bạn tiến hành compile và Download ứng dụng của bạn bằng cách click vào biểu

tượng Debug , sau khi quá trinh compile và download kết thúc giao diện Debug
sẽ xuất hiện.

27. Click trong tab Expressions. Xóa tất cả Expressions bằng cách click chuột phải vào
khung và chọn Remove All.
 Tìm đến các biến ulADC0Value, ulTempAvg, ulTempValueC và
ulTempValueF trong bốn d ng cuối cùng của code click đúp chuột vào mỗi
biến để chọn từng biến, click chuột phải vào biến đó và chọn Add Watch
Expression sau đó nhấn Ok. Làm như vậy cho 4 biến. Kết quả ta có như hình
sau:

28. Chúng ta muốn thiết lập cho chương trinh Debug để nó hiển thị kết quả sau mỗi lần
chạy. Vì không có một d ng lệnh nào sau quá trình tính toán, nên ta sẽ đặt 1
Breakpoint trước các lệnh tính toán để hiển thị kết quả tính toán gần nhất.
 Click chuột vào d ng đầu tiên trong v ng lặp while (1)
 ADCIntClear(ADC0_BASE, 1);
 Click chuột phải vào nó, chọn Breakpoint (Code Composer Studio) →
breakpoint để đặt 1 breakpoint ngay hàng đó.


 Click chuột phải lên biểu tượng breakpoint và chọn Breakpoint Properties
…tìm d ng chứa Action và click vào Remain Halted value. Đó là cách bình
thư ng một breakpoint nên hành động, nhưng chúng ta hãy thay đổi nó thành
Update View. Trong hộp thoại dưới đây, lưu ý rằng chỉ có cửa sổ Expressions
sẽ được cập nhật. Bây gi các biến trong cửa sổ Expressions sẽ được cập nhật
và code sẽ tiếp tục thực hiện. Nhấn OK.

29. Click nút Resume để chạy chương trình.


 Bạn sẽ thấy giá trị của biến u1TempAvg thay đổi giao động rất nhỏ. Bạn có
thể dùng ngón tay của mình ma sát lên quần rồi sau đó đặt nó lên thiết bị
LM4F120 trên board launchpad để làm ấm nó. Dùng ngón tay của bạn vào
một thức uống lạnh, sau đó chạm vào thiết bị LM4F120 để làm mát nó. Bạn
nên nhanh chóng xem kết quả biến đổi trên màn hình.


 Ghi nhớ rằng các bộ cảm biến nhiệt độ chưa được hiệu chỉnh, vì vậy các giá
trị hiển thị không chính xác. Không sao trong lab này, vì chúng ta chỉ tìm hiểu
những thay đổi trong việc đo lư ng.
 Lưu ý số lượng biến ulTempAvg đang thay đổi. Chúng ta có thể giảm số
lượng bằng cách sử dụng phần cứng trung bình trong ADC.

Hardware averaging

30. Click nút Teminate để quay tr lại trình chỉnh sửa.


 Tìm đến các d ng cài đặt ADC của bạn như hình dưới đây

 Tạo một d ng mới sau hàm SysCtlADCSpeedSet(). Và add câu lệnh sau vào:
ADCHardwareOversampleConfigure(ADC0_BASE, 64);
 Code của bạn sẽ giống như hình sau:


 Tham số cuối cùng trong các gọi hàm API
ADCHardwareOversampleConfigure() là số lượng mẫu được lấy trung
bình. Con số này có thể là 2, 4, 8, 16, 32 hoặc 64. Lựa chọn của chúng ta có
nghĩa là mỗi mẫu trong ADC FIFO sẽ là kết quả của 64 phép đo trung bình
với nhau.

31. Buil, download và chạy chương trình của bạn trên board launchpad. Quan sát biến
ulTempAvg trong cửa sổ Expressions, bạn sẽ thấy nó sẽ thay đổi với tốc độ chậm hơn
nhiều so với trước.

Calling APIs from ROM

32. Trước khi thực hiện bất kỳ thay đổi, chúng ta xem dung lượng code của chúng ta hiện
tại. Click Teminate để kết thúc quá trình Debug và quay tr về giao diện chỉnh
sửa. Trong Project Explorer, m rộng folder Debug của project Lab5. Click đúp vào
file Lab5.map.

33. Code composer giữ một danh sách các tập tin đã thay đổi kể từ lần build mới nhất.
Khi bạn nhấp vào nút build, CCS compiles và assembles các tập tin vào các tập tin
object. (Bạn có thể buộc CCS hoàn toàn rebuild lại project bằng cách xóa project
hoặc rebuilding lại tất cả). Sau đó, trong một quá trình đa qua, mối liên kết tạo ra các
file output (.out) sử dụng bản đồ bộ nhớ của thiết bị theo defined trong file linker
command (. Cmd). Quá trình build cũng tạo ra một file map (.map). Giải thích độ lớn
các phần của chương trình (.text Code) và chúng được đặt vào chổ nào trong bản đồ
bộ nhớ.
 Trong file Lab5.map, tìm đến SECTION ALLOCATION MAP và tìm d ng
.text như hình dưới đây.

 Chiều dài .text của chúng tôi là 690h. Viết kích thước của bạn vào
đây________

34. Hãy nhớ rằng M4F on-board ROM chứa các Thư viện Driver của thiết bị ngoại vi.
Thay vì thêm những thư viện gọi đến bộ nhớ flash của chúng nó, chúng ta có thể gọi
chúng từ ROM. Điều này sẽ làm giảm kích thước mã của chương trình của chúng ta
trong bộ nhớ flash. Để làm như vậy, chúng ta cần thêm sự hỗ trợ cho ROM trong mã
của chúng ta.
 Trong main.c thêm d ng include sau vào đầu của code:
 #include "driverlib/rom.h"

35. Trong properties lab5 của bạn, click chuột phải trong Lab5 trên Project Explorer chọn
Properties. Trong Build → ARM Compiler → Advanced Options, click trong
Predefined Symbols. Add biểu tượng sau đây vào đầu của sổ.
 TARGET_IS_BLIZZARD_RA1
 Blizzard là tên sản ph m nội bộ cho loạt LM4F của TI. Biểu tượng này sẽ
cung cấp cho các thư viện truy cập vào các API trong ROM. Nhấn OK.

36. Tr lại main.c, thêm ROM_ đến đầu của mỗi gọi hàm của DriverLib như hình dưới
đây.
 #include "inc/hw_memmap.h"
 #include "inc/hw_types.h"
 #include "driverlib/debug.h"
 #include "driverlib/sysctl.h"
 #include "driverlib/adc.h"
 #include "driverlib/rom.h"

 #ifdef DEBUG
 void__error__(char *pcFilename, unsigned long ulLine)
 {
 }
 #endif

 int main(void)
 {
 unsigned long ulADC0Value[4];
 volatile unsigned long ulTempAvg;
 volatile unsigned long ulTempValueC;
 volatile unsigned long ulTempValueF;


ROM_SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC
_MAIN|SYSCTL_XTAL_16MHZ);

 ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
 ROM_SysCtlADCSpeedSet(SYSCTL_ADCSPEED_250KSPS);
 ROM_ADCHardwareOversampleConfigure(ADC0_BASE, 64);
 ROM_ADCSequenceDisable(ADC0_BASE, 1);

 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, ulADC0Value);
 ulTempAvg = (ulADC0Value[0] + ulADC0Value[1] + ulADC0Value[2] +
ulADC0Value[3] + 2)/4;
 ulTempValueC = (1475 - ((2475 * ulTempAvg)) / 4096)/10;
 ulTempValueF = ((ulTempValueC * 9) + 160) / 5;
 }
 }

Build, Download and Run Your Code

37. Click nút Debug để buil và download code tới flash memory LM4F120H5QR.

Khi quá trình hoàn tất, click nút Resume để chạy code của bạn. Khi bạn chắc
chắn rằng tất cả mọi thứ đang làm việc một cách chính xác, click nút Terminate
để quay tr về giao diện chỉnh sửa.

38. Kiểm tra SECTION ALLOCATION MAP trong Lab5.map. Kết quả của chúng ta
được hiển thị dưới đây


 Kích thước mới cho .text Của chúng ta là 3e8h. Nó là nhỏ hơn so với trước
40%. Viết kết quả của bạn đây_____
39. Phương pháp thể hiện trong các bước sau được gọi là " direct ROM calls ". Nó cũng
có thể thực hiện cuộc gọi ROM ánh xạ khi bạn đang sử dụng các thiết bị (như ARM
Cortex-M3 TI) có thể có hoặc không có một ROM. Kiểm tra phần 32,3 trong
Peripheral Driver Library User’s Guide để biết thêm thông tin.

40. Khi bạn đã hoàn thành, đóng project và chương trình Code Composer Studio của bạn
lại.
Hoàn thành!

You might also like