Está en la página 1de 43

Hướng Dẫn Làm Quen Với eZdspF2812

Nguyễn Quốc Đính

Tháng 6, năm 2009

Tóm tắt nội dung

Dòng TMS320C2000 là thế hệ DSP có khả năng tính toán rất cao, được dùng phổ biến để
điều khiển, đặc biệt là điều khiển dộng cơ, chuyển đổi năng lượng và các hệ cảm biến cao cấp.
Đây có thể xem là một đối tượng rất lý tưởng để thực hiện hệ thống nhúng cho các thuật toán
điều khiển với sự hỗ trợ các giao tiếp ngoại vi của MCU.
Tuy nhiên sự tiếp cận với thế hệ này mất khá nhiều thời gian với sự tràn ngập tài liệu liên
quan. Chúng tôi thực hiện bài này với mong muốn giúp đỡ các bạn rút ngắn thời gian trong việc
tiếp cận với dòng DSP này. Các vấn đề thảo luận ở đây được tập trung vào board mạch eZd-
spF28121 . Chúng tôi hoan nghênh mọi thắc mắc hay đóng góp về địa chỉ nqdinhddt@gmail.com.

Mục lục
1 Cài đặt và thiết lập cấu hình cho CCS 3
1.1 Cài đặt CCS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Thiết lập cấu hình cho CCS giao tiếp được với phần cứng. . . . . . . . . . . . . . . . 4

2 Phần Cứng eZdspF2812 6


2.1 Cấu tạo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 Thiết lập chế độ hoạt động của board mạch với các Jumper . . . . . . . . . . . . . . 8
2.2.1 JP4, JP5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.2 JP1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.3 JP7, JP8, JP11, JP12: lựa chọn chế độ Boot . . . . . . . . . . . . . . . . . . 10
2.2.4 JP9, PLL disable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 Onboard LEDs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3 Từng Bước Làm Quen Với TMS320F2000 12


3.1 Làm quen với môi trường làm việc của CCS . . . . . . . . . . . . . . . . . . . . . . . 12
3.2 Debug chương trình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2.1 Add a Break Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2.2 Add a Probe Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.3 Xem một biến . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.4 Debug từng bước . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3 Xây dựng chương trình đầu tiên . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1
Đang được sử dụng tại Bộ môn Điều Khiển Tự Động - Đại Học Bách Khoa Tp. HCM

1
MỤC LỤC 2

3.3.1 Tạo một project mới . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16


3.3.2 Soạn thảo mã nguồn C/C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.3.3 Cấu hình cho việc dịch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.3.4 Linker Command File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3.5 Biên dịch chương trình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.3.6 Vẽ các đồ thị của các biến . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.4 Sử dụng các chương trình viết sẵn cho project của mình . . . . . . . . . . . . . . . . 23

4 Một số mở rộng 24
4.1 Chỉnh sửa linker, nạp chương trình vào flash . . . . . . . . . . . . . . . . . . . . . . 24
4.2 Giới thiệu một số thư viện . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

5 Phụ lục A 27

6 Phụ Lục B 34

7 Phụ Lục C 40
1 Cài đặt và thiết lập cấu hình cho CCS 3

1 Cài đặt và thiết lập cấu hình cho CCS


1.1 Cài đặt CCS
CCS – Code Composer Studio là môi trường soạn thảo IDE của Texas Instrument cho các thế hệ
DSP cũng như MCU của TI, bao gồm việc soạn thảo mã lệnh, dịch, liên kết và debug chương trình.
Ưu điểm rất lớn của CCS là khả năng nhắc tuồng rất hiệu quả như trong môi trừng VB hay
C#. Ngoài ra với khả năng kết nối với phần cứng, debug online, vẽ đồ thị thời gian thực . . . CCS
là sẽ giúp cho quá trình phát triển giải thuật cải thiện đáng kể về thời gian. Tuy nhiên để CCS kết
nối được với phần cứng khác nhau thì cần phải thiếp lập kết nối CCS với phần cứng đó, trong tài
liệu này chúng tôi sử dụng board mạch eZdspF2812 của Spectrum Digital.

Hình 1: Cài đặt Code Composer Studio

Trước tiên chúng ta sẽ cài đặt CCS trong đĩa kèm theo.
Tiếp theo đó, vào trong thư mục ’Spectrum Digital’, chọn thư mục eZdsp2800, chọn setup để
cài đặt phần tiếp theo là eZdsp2800 Emulation Drivers and Target Content.

Hình 2: Cài đặt driver cho eZdspF2812

Chương trình này được xem như là một driver để CCS nhận thấy và giao tiếp được với board
mạch eZdspF2812. Cứ để thiết lập mặc định đến khi hoàn thành việc cài đặt.
1.2 Thiết lập cấu hình cho CCS giao tiếp được với phần cứng. 4

Như vậy việc cài đặt những thành phần cơ bản đã thực hiện xong.

1.2 Thiết lập cấu hình cho CCS giao tiếp được với phần cứng.
Để bắt đầu thiết lập cấu hình để cho CCS nhận thấy và giao tiếp được với board eZdspF2812, chúng
ta cho chạy chương trình SdConfig. Tuy nhiên cần ghi nhớ là phải kết nối board mạch eZdspF2812
với máy tính trước khi thực hiện quá trình config.

Thực hiện chọn các thông số như hình bên dưới, rồi save lại, sau đó chọn biểu tượng reset (chữ
R màu đỏ ), nếu không có gì trở ngại thì sẽ thấy dòng chữ ’emulator is reset’.

Hình 3: Cài đặt thông số cho bộ JTAG

Để kiểm tra thiết lập kết nối, chúng ta vào lệnh ’Emulator Test’, nếu thiết lập đúng thì sẽ hiện
ra thông báo là đã kết nối được với JTAG như hình bên. Nếu chương trình báo lỗi thì hãy làm lại
quá trình trên, chọn lại thông số kết nối.
Tiếp theo chạy chương trình SetupCCStudio, mục đích là để install driver vừa cài đặt vào CCS.
Chúng ta làm như hình vẽ sau:

∙ Chọn board F2812 eZdsp.

∙ Chọn Add.
TÀI LIỆU 5

∙ Save & Quit.

Hình 4: Chọn kết nối CCS với eZdspF2812

Như vậy là chúng ta đã kết nối được CCS với board mạch eZdspF2812. Phần tiếp theo chúng
ta sẽ bắt đầu viết chương trình đâu tiên với họ DSP TMS320C2000, nhưng trước đó chúng ta sẽ
làm quen với phần cứng của board mạch eZdspF2812 trước đã.

Tài liệu
[1] eZdsp for the TMS320C2812, Quick Start Guide. Spectrum Digital.
2 Phần Cứng eZdspF2812 6

2 Phần Cứng eZdspF2812


2.1 Cấu tạo
The eZdspTM F2812 has the following features:

∙ TMS320F2812 Digital Signal Processor

∙ 150 MIPS operating speed

∙ 18K words on-chip RAM

∙ 128K words on-chip Flash memory

∙ 64K words off-chip SRAM memory

∙ 30 MHz. Clock

∙ 2 Expansion Connectors (analog, I/O)

∙ Onboard IEEE 1149.1 JTAG Controller

∙ 5-volt only operation with supplied AC adapter

∙ TI F28xx Code Composer Studio tools driver

∙ On board IEEE 1149.1 JTAG emulation connector

Sơ đồ nguyên lý bằng OrCAD có thể tìm thấy ở phụ lục A, sơ đồ tổng quát của board mạch
như sau (chú ý đến những thành phần được mô tả ở trên):

Hình 5: Block Diagram eZdspF2812

Hình dạng bên ngoài của board mạch với với những chú thích tương ứng với các thành phần
của mạch:
2.1 Cấu tạo 7

Hình 6: Hình dạng của board mạch

Và kết nối của board mạch với PC thông qua bộ JTAG có sẵn (kết nối qua cổng song song):

Hình 7: Kết nối board với PC

Có thể nhận thấy rằng board mạch eZdspF2812 chỉ chứa phần ’nhân’ tức là phần xử lý, bộ
nhớ ngoài, và kết nối JTAG qua cổng máy in mà chưa có các thành phần khác. Tuy nhiên các IO
EXPANTION từ 𝑃 1 → 𝑃 9 cộng với các giao thức như SPI, SCI, I2C, CAN, McBSP và các GPIO
chúng ta có thể mở rộng giao tiếp với nhiều thiết bị khác nhau.
Về chi tiết các IO EXPANTION này, vui lòng xem chi tiết tại [1].
Sau đây là một ví dụ về giao tiếp của board mạch eZdspF2812 với các thiết bị bên ngoài khác
thông qua các cổng mở rộng.
2.2 Thiết lập chế độ hoạt động của board mạch với các Jumper 8

Hình 8: Một ví dụ về mạch mở rộng của eZdspF2812 - Zwickau Adapter Board

Board này được miêu tả như sau:

∙ 8 LED’s for digital output (GPIO B7. . . B0).

∙ 8 switches (GPIO B15. . . B8) and 2 push buttons (GPIO D1, D6) for digital input.

∙ 2 potentiometers (ADCINA0, ADCINB0) for analog input.

∙ 1 loudspeaker for analogue output via PWM - Digisound F/PWC04A.

∙ 1 dual SPI Digital to Analogue Converter (DAC) - Texas Instruments TLV5617A.

∙ 1 SPI EEPROM 1024 x 8 Bit - ST Microelectronics M95080.

∙ 1 CAN Transceiver - Texas Instruments SN 65HVD230 (high speed).

∙ 1 CAN Transceiver - Philips TJA 1054 (low speed).

∙ 1 I2C – Temperature Sensor Dallas Semiconductor DS1621.

∙ 1 SCI-A RS 232 Transceiver – Texas Instruments MAX232D.

∙ 2 dual OpAmp’s Texas Instruments TLV 2462 – analogue inputs.

Sơ đồ nguyên lý của Zwickau Adapter Board có thể được tìm thấy ở phần phụ lục B. Đây có
thể là một tham khảo tốt khi bạn muốn thiết kế riêng cho mình để mở rộng giao tiếp board mạch.

2.2 Thiết lập chế độ hoạt động của board mạch với các Jumper
Bên cạnh các Expantion để kết nối thêm các ngoại vi khác, trên board eZdspF2812 có một số
jumper để người dùng có thể thiết lập các chế độ hoạt động thích hợp cho DSP.
2.2 Thiết lập chế độ hoạt động của board mạch với các Jumper 9

Ngoại trừ JP4 và JP5, tất cả các Jumper còn lại phải được kết nối hoặc ở vị trí 1 – 2
hoặc 2 - 3
Vị trí của các Jumper trên board mạch như hình vẽ bên dưới:

Hình 9: Vị trí của các Jumper trên eZdspF2812

2.2.1 JP4, JP5

Mục đích của các Jumper P4, P5 này là để cung cấp nguồn +3.3V/5V ra các cổng mở rộng P8-P4
và P2 tương ứng.
Tuy nhiên nhà sản xuất chưa gắn Jumper này vào, nếu người sử dụng muốn đưa nguồn ra ngoài
để sử dụng thì cần phải hàn jumper này vào. Cần phải xem xét khả năng cung cấp công suất của
nguồn ổn áp trong mạch eZdspF2812 với yêu cầu của tải bên ngoài. Theo ý kiến của chúng tôi thì
chúng ta không nên sử dụng những nguồn này mà nên cung cấp nguồn riêng khi mở rộng giao tiếp
bên ngoài.
Chúng ta phải chú ý là khi giao tiếp với các port của DSP TMS320C2000, thì mức điện
áp không được vượt ra khỏi tầm 0-3.3V. Tuyệt đối không cung cấp nguồn 5V trực tiếp
vào các pin của DSP.

2.2.2 JP1

Lựa chọn chế độ hoạt động cho DSP:


2.2 Thiết lập chế độ hoạt động của board mạch với các Jumper 10

Đặt Jumper ở vị trí 2 – 3 để chọn chế độ Microcomputer.

2.2.3 JP7, JP8, JP11, JP12: lựa chọn chế độ Boot

Các Jumper JP7, 8,11 & 12 được dùng để xác định chế độ mà DSP sẽ khởi động sau khi cung cấp
nguồn. Để có tín hiệu ’High’, đặt jumper ở vị trí 1 – 2, còn trạng thái ’Low’ sẽ đạt được khi đặt
jumper ở vị trí 2 – 3.

Thông thường chúng tôi đặt chế độ boot ở trạng thái ’FLASH’ hoặc ’H0’:

∙ Ở chế độ FLASH, chương trình được nạp vào bộ nhớ Flash (ở dòng F) hoặc Rom (ở dòng
C), chúng ta chỉ nên đặt boot ở chế độ Flash khi chương trình đã hoàn thiện hoặc muốn cho
hệ thống chạy ở chế độ ’Stand Alone’.

∙ Ở chế độ H0, chương trình được đổ vào bộ nhớ RAM nội hoặc ngoại của board mạch eZd-
spF2812, chế độ này thích hợp cho việc phát triển chương trình. Tuy nhiên khi khởi động lên,
chương trình phải được nạp từ Host (tức là PC) vì bộ nhớ RAM không lưu giữ được dữ liệu
khi nguồn mất đi.

Ưu điểm của chế độ boot từ H0 là hệ thống hoạt động ở tốc độ cao nhất (khoảng 150MIPS),
so với chế độ Flash (khoảng 120 – 130MISP).
Vấn đề chọn chế độ boot khá quan trọng, nên sẽ được đề cập đến trong các phần sau nữa.

2.2.4 JP9, PLL disable

JP9 cho phép / không cho phép mức logic PLL trong DSP.
2.3 Onboard LEDs 11

Nếu chế độ PLL không được chọn, DSP sẽ hoạt động với tần số bằng tần số thạch anh bên
ngoài, là 30Mhz. Trường hợp chế độ PLL được chọn, tần số DSP hoạt động phụ thuộc vào cài đặt
PLL ở chương trình, nhưng không được vượt quá 150Mhz.
Theo mặc định, chúng ta sẽ chọn chế độ cho phép PLL.
Như vậy trước khi thực hiện chương trình trên board mạch, chúng ta phải chú ý đến việc thiết
lập Jumper trước tiên. Việc thiết lập jumper sai có thể dẫn đến chương trình chạy không đúng
mục đích.

2.3 Onboard LEDs


Board eZdspF2812 có sẵn hai LED.

∙ LED DS1 được dùng để báo trạng thái của nguồn, thường được phát sáng khi cung cấp nguồn
cho mạch.

∙ LED DS2 được điều khiển bởi chương trình, được gắn với chân XF (GPIOF14). Chúng ta có
thể dùng DS2 để debug chương trình.

Trong phần tới chúng ta sẽ sử dụng DS2 để bắt đầu chương trình đầu tiên là chớp đèn LED.
Ở đây chúng tôi chỉ giới thiệu rất cơ bản những phần có liên quan đến các chương kế tiếp.
Để hiểu rõ hơn hơn về board mạch này, chúng tôi đề nghị các bạn đọc các tài liệu liên quan của
Spectrum Digital, ví dụ như [1]. Đây là tài liệu rất đầy đủ miêu về eZdspF2812, tài liệu này có thể
tải trên internet hoặc trong CD kèm theo board mạch.

Tài liệu
[1] eZdspTM F2812 Technical Reference. Rev. F. September 2003. Spectrum Digital.
3 Từng Bước Làm Quen Với TMS320F2000 12

3 Từng Bước Làm Quen Với TMS320F2000


Mục tiêu của chương này là để giúp bạn làm quen với môi trường CCS, từ đó bắt đầu một project
đơn giản. Phần này cũng sẽ giúp bạn bắt nhịp với các phương thức debug của CCS, đồng thời các
cách thức phát triển chương trình trực quan như vẽ đồ thị, hay lưu trữ các giá trị thời gian thực
vào file trên máy tính để phân tích hay lưu trữ cũng sẽ được bàn đến.

3.1 Làm quen với môi trường làm việc của CCS
CCS là một IDE phát triển riêng để phát triển các chương trình cho họ DSP và MCU của TI.
Việc làm quen với CCS sẽ giúp cho chúng ta tiết kiệm được nhiều thời gian hơn khi phát triển các
project trên môi trường này.
Môi trường làm việc của CCS được tóm gọn như sau:

Hình 10: Sơ bộ về các phần của CCS

Để cho sự bắt đầu một cách thuận tiện chúng ta sẽ sử dụng các ví dụ, chính xác hơn là một
công cụ để cho việc tiếp cận dòng C281x được dễ dàng hơn, đó là C281x C/C++ Header Files and
Peripheral Examples của TI, có thể tải về và sử dụng miễn phí tại địa chỉ http://focus.ti.com/
docs/toolsw/folders/print/sprc097.html. Theo mặc định chương trình sẽ được cài đặt vào địa
chỉ C:∖tidcs∖c28∖DSP281x∖v111.
Chúng ta hãy mở project đầu tiên và bắt đầu làm quen với môi trường làm việc: project
𝑔𝑝𝑖𝑜_𝑡𝑜𝑔𝑔𝑙𝑒 tại địa chỉ C:∖tidcs∖c28∖DSP281x∖v111∖DSP281x_examples.
Chú ý: đặt chế độ boot của DSP là H0, như đã đề cập đến ở phần 2, để chạy các ví dụ sau.
Để mở project này, từ Project ⇒ Open, rồi chỉ đến mục gpio_toggle, mở file Example_281xGpioToggle.pjt.
Quan sát cửa sổ bên tay trái, bạn sẽ thấy các thành phần sau của project:

- Source: C và Assembly.
3.2 Debug chương trình 13

- Libraries (hiện tại chưa có trong project này).

- DSP/BIOS config., dùng để tạo nhân điều hành cho chương trình (hiện tại chưa có trong
project này).

- Linker command file: F2812_EzDSP_RAM_lnk.cmd và DSP281x_Headers_BIOS.cmd, hai


file này dùng để cấu hình cho việc phân chia bộ nhớ và dịch mã nguồn.

Project này có thể được dịch và nạp vào DSP, để hiểu rõ hơn về chức năng của các thành phần
cũng như cấu tạo của project, đề nghị các bạn đọc tài liệu DSP281x_HeaderFiles_QuickStart_Readme.pdf
nằm trong file zip tải về.
Để nạp chương trình vào DSP và cho chạy chương trình này, chúng ta làm như sau:

- Kết nối CCS với phần cứng: ⇒ Debug ⇒ 𝐶𝑜𝑛𝑛𝑒𝑐𝑡. Bạn sẽ thấy có một cửa sổ bong bóng
hiện ra báo là đã kết nối được với phần cứng.

- Dịch chương trình: ⇒ Project ⇒ Build (F7). Nếu không có lỗi nào, mục Status Window sẽ
báo là không có lỗi biên dịch chương trình.

- Nạp chương trình vào phần cứng: ⇒ File ⇒ Load Program, chọn thư mục Debug, rồi chọn
file Example_281xGpioToggle.out.

- Chạy chương trình: ⇒ Debug ⇒ Run, bạn sẽ thấy LED DS2 bớt sáng đi một chút. ⇒ Debug
⇒ Hall, bạn sẽ thấy LED DS2 hoặc là sáng hoặc là tắt. Đọc chương trình chúng ta có thể
hiểu được điều này dễ dàng.

Để thuận tiện hơn trong khi làm việc với CCS, chúng tôi khuyến khích các bạn học cách sử
dụng các phím tắt cho các thao tác có thể lặp đi lặp lại nhiều lần, ví dụ như các thao tác trong
quá trình trên.
Ngoài ra một số quá trình sau cũng thường được sử dụng:

- Dừng lại quá trình chạy real time: Debug → Halt.

- Có thể reset lại CPU bằng cách vào Debug → Reset CPU, Debug → Restart.

- Nhảy lại đầu chương trình: Debug → Go Main

3.2 Debug chương trình


Debug là công việc thường xuyên khi viết chương trình, vì vậy tìm hiểu môi trường debug của CCS
là cần thiết.
CCS cung cấp một hệ thống các công cụ giúp cho công việc debug diễn ra thuận lợi. Chúng ta
cũng sẽ sử dụng project ở phần 1 để tiếp cận các phương thức debug của CCS.

3.2.1 Add a Break Point

Các bước sau sẽ đặt một Break Point vào vị trí thích hợp.

∙ Tìm đến hàm void delay_loop() , ở dòng lệnh for (i = 0;i < 30000;i++) , nhấn chuột phải
rồi chọn Toggle Software Break Point.
3.2 Debug chương trình 14

∙ Dòng lệnh này sẽ xuất hiện một chấm đỏ ở bên trái chứng tỏ đã đặt một Break Point vào
dòng lệnh này.
Tiếp đó chúng ta cho chạy chương trình (nhấn F5), DSP sẽ được dừng lại khi nhảy đến dòng
lệnh ở trên. Cho chạy chương trình tiếp tục, chúng ta sẽ thấy kết quả.
Bạn hãy thử gỡ bỏ Break Point rồi chạy chương trình lại, xem kết quả như thế nào. Tiếp đó
hãy thử đặt Break Point tại điểm khác, quan sát kết quả.

3.2.2 Add a Probe Point

Có một sự khác biệt nhỏ giữa Break Point và Probe Point là: Break Point đặt CPU vào tình thế
dừng (hall) vĩnh viễn, trong khi Probe Point chỉ dừng CPU tạm thời rồi chạy tiếp tục. Thời gian
chờ tạm thời này được dùng để trao đổi dữ liệu giữa PC và bộ JTAG.
Quá trình cài đặt Probe Point cũng tương tự như Break Point, chỉ khác ở chổ thay vì chọn
Break Point, chúng ta chọn Probe Point.
Có thể nhận thấy đây là một phương thức debug rất cao cấp để giao tiếp với DSP trong hệ
thời gian thực gọi là ’Real Time Debug’. Phương thức này sẽ được dùng cho mục đích vẽ đồ thị
thời gian thực hay lưu giá trị biến vào file như đề cập ở các phần dưới.

3.2.3 Xem một biến

Dùng Break Point để cho chương trình dừng lại tại dòng lệnh for (i = 0; i < 30000; i++) như
trên.
Sau đó click chuột phải vào biến i, chọn Add to Watch Windows.
Kết quả sẽ hiện ra như sau:

Hình 11: Xem giá trị biến trong quá trình quá trình debug

Lúc này bạn thử nhấn nút F11 (Step into) để xem biến i tăng dần, cho dù Break Point tại điểm
này đã bị remove hay không.
3.2 Debug chương trình 15

Nếu quan sát kĩ phần hiển thị giá trị của biến, bạn sẽ thấy có hai phần là Watch Locals và
Watch1, Watch2 . . . Phần Watch Locals chỉ hiển thị những biến địa phương trong chương trình
con mà con trỏ hiện thời đang trỏ đến. Phần Watch1/2/3... hiển thị những biến mà bạn add vào, kể
cả biến địa phương hay biến toàn cục. Tuy nhiên biến địa phương sẽ không cho giá trị nào cả trong
phần Watch1/2/3... nếu con trỏ hiện thời không chỉ đến chương trình con chứa biến địa phương
đó.

Hình 12: Màn hình xem giá trị các biến

3.2.4 Debug từng bước

Như đã đề cập ở trên, một trong những tiện ích của debug là chỉ xem một phần nhỏ đoạn code.
Điều này có thể thực hiện được thông qua việc debug từng bước.
Xem hình sau để có một cái nhìn tổng thể về vấn đề này.

Hình 13: Debug từng bước

Đến đây chúng tôi khuyến khích các bạn đọc các ví dụ còn lại, tập trung vào các phần như
phần xử lý GPIO, ADC và Timer.
3.3 Xây dựng chương trình đầu tiên 16

Phần tiếp theo chúng ta sẽ làm quen với việc bắt đầu xây dựng một project.

3.3 Xây dựng chương trình đầu tiên


3.3.1 Tạo một project mới

→ 𝑃 𝑟𝑜𝑗𝑒𝑐𝑡 → 𝑁 𝑒𝑤

Hình 14: Tạo một project mới

3.3.2 Soạn thảo mã nguồn C/C++

→ 𝐹 𝑖𝑙𝑒 → 𝑁 𝑒𝑤 → 𝑆𝑜𝑢𝑟𝑐𝑒𝐹 𝑖𝑙𝑒


Rồi copy chương trình sau vào. Rồi save lại với tên bạn muốn, ví dụ main.c

#include <s t d i o . h>


float fk ;
unsigned int i k ;
void main ( )
{
int i ;
while ( 1 )
{
for ( i= −5; i < 5 ; i ++)
{
ik = i * i ;
f k = rand ( ) / 3 2 7 6 8 . 0 ;
}
}
}

Lúc này file main.c đã được lưu vào ổ cứng của bạn, nhưng chưa là một thành phần của
project. Muốn file này là một phần của project, chúng ta phải add nó vào như sau: → 𝑃 𝑟𝑜𝑗𝑒𝑐𝑡 →
𝐴𝑑𝑑𝐹 𝑖𝑙𝑒𝑠𝑡𝑜𝑃 𝑟𝑜𝑗𝑒𝑐𝑡 . . . Chọn file main.c.
Đến lúc này màn hình có thể như sau:
3.3 Xây dựng chương trình đầu tiên 17

Hình 15: Màn hình project hiện tại

3.3.3 Cấu hình cho việc dịch

Đưa thư viện ’C – Runtime – Library’ vào project: → Project → Build Options → Include Li-
braries. Bạn tìm đến nguồn của file rts2800_ml.lib. Copy toàn bộ đường dẫn này (ví dụ như
D:∖CCStudio_v3.1∖C2000∖cgtools∖lib∖rts2800_ml.lib) vào tab này.
Chọn kích thước cho stack là 0x400, đây là kích thước mặc định cho stack. Tuy nhiên chúng ta
có thể thay đổi kích thước cho phù hợp với từng ứng dụng.
3.3 Xây dựng chương trình đầu tiên 18

Hình 16: Cấu hình cho quá trình biên dịch

3.3.4 Linker Command File

Linker liên kết tất cả các phần chúng ta xây dựng cho hệ thống, điều này được thực hiện thông
qua ’Linker Command File’. File này sẽ được dùng để kết nối hệ thống bộ nhớ phần cứng của DSP
với những sections (phần phân bổ bộ nhớ) mà chúng ta tạo ra trong chương trình phần mềm.
Với board mạch eZdsp2812, chúng ta có một số linker được viết sẵn, được tìm thấy trong thư
mục C:∖tidcs∖c28∖DSP281x∖v111∖DSP281x_common∖cmd. Chúng ta có thể sử dụng các linker
này, sau khi đã hiểu rõ cấu trúc của phần cứng bộ nhớ rồi thì có thể sửa lại cho thích hợp với từng
ứng dụng của mình.
Một điều đáng lưu ý là chúng ta có thể tham chiếu đến cùng một file cho nhiều project khác
nhau, tuy nhiên việc dùng chung như vậy có thể dẫn đến nhiều nhược điểm như:

∙ Khi chỉnh sửa trong project này thì file đó đã bị thay đổi, dẫn đến project khác cũng bị thay
đổi theo. Cá nhân chúng tôi nhiều lần vấp phải vấn đề này, dẫn đến mất nhiều thời gian sửa
lỗi.

∙ Khi copy đến máy khác thì phải chỉnh lại đường dẫn.

Vì vậy, cách tốt nhất là hãy copy những mã nguồn này vào cùng trong một thư mục của project.
Chúng ta copy 2 file . . . DSP281x_common∖cmd∖F2812_EzDSP_RAM_lnk.cmd và
. . . DSP281x_headers∖cmd∖DSP281x_Headers_nonBIOS.cmd vào trong thư mục của project hiện
3.3 Xây dựng chương trình đầu tiên 19

thời. File thứ nhất là file Linker Command, file thứ hai là file định nghĩa các vùng bộ nhớ trên
DSP.

Hình 17: Cấu trúc của quá trình liên kết các thành phần trong project

3.3.5 Biên dịch chương trình

Lựa chọn cách thức để dịch chương trình:

Hình 18: Lựa chọn cách thức để dịch chương trình

Có hai cách thức để dịch chương trình:

∙ Debug: là cách thức mặc định. Cách thức này không được tối ưu về mã lệnh khi dịch. Được
dùng khi đang phát triển project.

∙ Release: cách thức dịch này sẽ mang lại sự tối ưu về thời gian thực thi cũng như kích thước
của file .out. Được dùng khi project đã hoàn thành.

Đến lúc này chúng ta có thể biên dịch, nạp vào DSP và xem kết quả. Có thể dùng các phương
thức debug ở trên để xem xét các biến.

3.3.6 Vẽ các đồ thị của các biến

Như đã bàn ở trên, CCS cung cấp một công cụ rất mạnh là vẽ đồ thị real – time rất hiệu quả.
Chúng ta dùng để quan sát các biến fk là biến ngẫu nhiên trong khoảng [0,1], biến ik là một hàm
3.3 Xây dựng chương trình đầu tiên 20

parabol.

∙ Click chuột phải vào biế fk trong dòng lệnh fk = rand()/32768.0; , rồi chọn Insert Graph.

∙ Chúng ta sẽ vẽ giá trị fk, nên chọn các thông số như sau:

– Start Address: là địa chỉ của biến cần vẽ, chọn &fk.
– Acquisition Buffer Size: chỉ số các giá trị sẽ cập nhật vào đồ thị kể từ biến có địa chỉ
định trên Start Adress. Vì ở đây chúng ta chỉ cập nhật 1 biến là fk nên chỉ chọn thông
số bằng 1. Trong trường hợp các giá trị cần hiển thị lên đồ thị là một mảng thì Start
Address là địa chỉ của phần tử đầu tiên của mảng, còn Acquisition Buffer Size là số
phần tử của mảng đó.
– Display Data Size: số các phần tử (lượng tử) sẽ được cập nhật lên trên đồ thị. Trong
trường hợp này ta chọn là 50, có nghĩa là chỉ vẽ 50 giá trị gần nhất cho đến thời điểm
hiện tại.
– DSP Data Type: fk được định nghĩa là float nên chọn là 32-bit floating point.
– Sampling Rate: ảnh hưởng đến hiển thị thời gian trên trục tung, giá trị này không phải
là tốc độ lấy mẫu để vẽ đồ thị. Đồ thị chỉ được cập nhật khi chương trình chạy đến đòng
lệnh được đánh dấu Probe Point mà thôi.

Sau khi thực hiện xong ta sẽ thấy bên phải của dòng lệnh xuất hiện một biểu thị chứng tỏ
tại dòng lệnh này đã được đặt một Probe Point. Tại sao lại xuất hiện Probe Point? Như vậy
việc click chuột phải để Insert Graph ảnh hưởng như thế nào đến thời điển cập nhật các biến
lên trên đồ thị?

Hình 19: Chọn điểm để cập nhật đồ thị


3.3 Xây dựng chương trình đầu tiên 21

Hình 20: Chọn các thông số để cập nhật giá trị fk

∙ Tương tự chúng ta cũng tại dòng lệnh này, chọn để vẽ đồ thị của biến ik.
3.3 Xây dựng chương trình đầu tiên 22

Hình 21: Chọn các thông số để cập nhật giá trị ik

∙ Khi cho chạy một lúc, chúng ta sẽ thấy kết quả như sau

Hình 22: Đồ thị ik và fk theo thời gian

Như vậy chúng ta đã biết được cách xây dựng và cấu hình cho một project trong CCS rồi đấy!
3.4 Sử dụng các chương trình viết sẵn cho project của mình 23

3.4 Sử dụng các chương trình viết sẵn cho project của mình
Thông thường khi xây dựng một project lớn chúng ta không phải viết từ đầu đến cuối mà sử dụng
những thu viện hay những section đã được viết sẵn. Chúng ta có nhu cầu sử dụng lại những source
code có sẵn.
Khi làm việc với MCU hay DSP thì giao tiếp với IO port là một công việc thường xuyên, lúc
đó chúng tôi khuyến khích các bạn sử dụng những chương trình trong gói C281x C/C++ Header
Files and Peripheral Examples đã được đề cập ở trên.
Theo kinh nghiệm của chúng tôi, thì chúng ta không nên tham khảo chéo các file được đặt
trong thư mục khi cài đặt gói chương trình này, bởi vì có thể chúng ta sẽ tác động lên mã nguồn
các file này (do các code này không phải là thư viện), khi đó sẽ gây bất tiện khi làm việc với nhiều
project khác nhau. Chúng tôi thường copy các mã nguồn (file .c, .asm và .h tương ứng) vào trong
thư mục chứa project đang làm việc. Việc làm này có thể gây khó khăn trong thời điểm ban đầu
vì bản thân các nguồn này cũng được liên kết đến với nhau, gây báo lỗi thiếu tham chiếu khi dịch,
nhưng khi đã quen rồi thì bạn sẽ thấy được tác dụng của nó.

Tài liệu
[1] DSP281x HeaderFiles QuickStart Readme. Texas Instruments.

[2] TMS320F2810, TMS320F2811, TMS320F2812, TMS320C2810, TMS320C2811,


TMS320C2812, Digital Signal Processors Data Manual. Texas Instruments.
4 Một số mở rộng 24

4 Một số mở rộng
4.1 Chỉnh sửa linker, nạp chương trình vào flash
Tất cả các ví dụ ở trên được nạp vào RAM để chạy, đông nghĩa với việc khi cung cấp nguồn ta
phải nạp lại chương trình.
Vì nhiều lý do ta có thể muốn chương trình của mình được nạp trược tiếp vào Flash luôn. Một
chương trình sau khi được viết thành công ở chế độ boot H0 muốn chuyển qua chế độ boot Flash
thì cần phải thực hiện những bước sau:

- Cấu hình lại linker cho phù hợp.

- Nạp vào Flash.

- Debug lại.

Có nhiều cách thức cấu hình lại cho linker trong trường hợp này. Để hiểu rõ hơn về linker chúng
tôi khuyến khích bạn đọc 2 tài liêu tham khảo [1] và [2].
Để nạp chương trình vào flash, chúng ta cần cài đặt flash plugin. Plugin này có thể tìm thấy
tại đĩa CD kèm theo eZdspF2812.

Hình 23: Cài đặt flash plugin cho CCS

Sau khi cài đặt thì trong CCS xuất hiện thêm một công cụ trong menu Tools.
4.2 Giới thiệu một số thư viện 25

Hình 24: On-Chip Flash Plugin trong CCS

Có thể sử dụng tính năng help trong plugin này để lựa chọn các thông số.
Và cuối cùng là . . . debug lại chương trình!, chương trình chạy tốt trong RAM nhưng có thể sẽ
gặp vấn đề trong FLASH, và bạn cũng sẽ sớm nhận ra việc debug trong Flash cũng sẽ khác trong
RAM, xem tài liệu [1] và [2] để biết thêm.

4.2 Giới thiệu một số thư viện


Một trong những điểm mạnh của dòng DSP của TI là hỗ trợ rất nhiều những công cụ tính toán xử
lý số và tính toán thời gian thực. Một số thư viện DSP của TI cho dòng C281x có thể kể đến như:

Trong lĩnh vực điều khiển, thì một số phần thiên về xử lý tín hiệu số có thể sẽ không cần thiết.
Nhưng những phần sau đáng để tham khảo khi viết chương trình:
TÀI LIỆU 26

∙ IQMath Library: cung cấp một môi trường ảo cho việc tính toán số thực với các phép toán
trên số thực. Thư viện được viết bằng ASM nên tốc độ rất nhanh so với những hàm thư viện
của C.

∙ Communication Driver. Trong gói C281x C/C++ Header Files and Peripheral Examples có
các chương trình để giao tiếp thông qua các phương thức giao tiếp trên DSP như SCI, I2C,
SPI . . . Tuy nhiên các chương trình mẫu này sẽ chỉ rất tốt để tham khảo cách thức hoạt
động, còn để giao tiếp với thế giới bên ngoài thì thư viện Communication Driver mang lại sự
’thỏa mái’ và ’trong sáng’ hơn cho chương trình của chúng ta.

∙ Signal Generator và STB: dùng để giả lập trực tiếp trên DSP khi chúng ta không kết nối trực
tiếp với phần cứng thông qua việc tạo các hàm input và output.

Chúc các bạn thành công.

Tài liệu
[1] Application Report SPRA958D, Running an Application from Internal Flash Memory on the
TMS320F281x DSP. September 2004, Texas Instruments.

[2] Application Report SPRAAU8, Copying Compiler Sections From Flash to RAM on the
TMS320F28xxx DSCs. March 2008, Texas Instruments.
5 Phụ lục A 27

5 Phụ lục A
Sơ đồ nguyên lý của board mạch eZdspF2812
5 4 3 2 1

REVISIONS

REV DESCRIPTION DATE APPROVED

A PROTOTYPES 04-April-2002

B PRODUCTION RELEASE 07-June-2002

D D
C UPDATE PER SPRS174G 20-Jan-2003

C C

The TM S320F2812 EzDSP design is based on


preliminary information(SPRS174G) for the
TM S320F2812 device. This schematic is subject to
change without notification. Spectrum Digital Inc.
assumes no liability for applications assistance,
customer product design or infringement of patents
described herein.
B B

DWN DATE
REVISION STATUS OF SHEETS
CHK DATE
A A
REV
ENGR DATE
SH SPECTRUM DIGITAL
ENGR-MGR DATE
REV
QA DATE Title
SH TMS320F2812 EzDSP
MFG DATE
REV C C B C C C NEXT ASSY USED ON Size Document Number Rev
RLSE DATE B 506262 C
SH 1 2 3 4 5 6 APPLICATION
Date: Thursday, February 13, 2003 Sheet 1 of 6
5 4 3 2 1
5 4 3 2 1

3.3V
1.8V
GND XA[0..18]
VDD3VFL

XA10
XA11
XA12
XA13
XA14
XA15
XA16
XA17
XA18
XD[0..15]

XA0
XA1
XA2
XA3
XA4
XA5
XA6
XA7
XA8
XA9
AGND

114
145

100
112
128
143
154

103
108
111
118
121
125
130
132
138
141
144
148
152
156
158
U8

69

31
64
81

23
37
56
75

18
43
80
85

XA10
XA11
XA12
XA13
XA14
XA15
XA16
XA17
XA18
XA0
XA1
XA2
XA3
XA4
XA5
XA6
XA7
XA8
XA9
VDD10
VDD2
VDD3
VDD4
VDD5
VDD6
VDD7
VDD8
VDD9
VDD3VFL

VDDIO1
VDDIO2
VDDIO3
VDDIO4
VDDIO5
ADCINA0 174
D
ADCINA0 XD0
D

ADCINA1 173 21
ADCINA1 XD0 XD1
ADCINA2 172 24
ADCINA2 XD1 XD2
ADCINA3 171 27
ADCINA3 XD2 XD3
ADCINA4 170 30
ADCINA4 XD3 XD4
169 33

VDD CORE - 1.8V


FLASH - 3.3V
ADCINA5 ADCINA5 XD4 XD5

VDD I/0 -3.3V


ADCINA6 168 36
TAIYO YUDEN EMK325F106ZH-T ADCINA6 XD5 XD6
ADCINA7 167 39
ADCINA7 XD6 XD7
ADCINB0 2 54
ADCINB0 XD7 XD8
ADCREFM ADCINB1 3 65
ADCINB1 XD8 XD9
ADCREFP ADCINB2 4 68
ADCINB2 XD9 XD10
ADCINB3 5 73
ADCINB3 XD10 XD11
ADCINB4 6 74
10UF CERAMIC LOW ESR ADCINB4 XD11 XD12
ADCINB5 7 96
C35 ADCINB5 XD12 XD13
ADCINB6 8 97
ADCINB6 XD13 XD14
ADCINB7 9 139
ADCINB7 XD14 XD15
147
10UF CERAMIC LOW ESR XD15
11
C36 ADCREFP
10
ADCREFM RN2A
16 44 1 16 XZCS0AND1n
R26 ADCRESEXT XZCS0AND1n RN2B A B
12 88 2 33 15
AVSSREFBG XZCS2n A B XZCS2n
24.9K VDDA1 13 133 RN2C 3 33 14
AVDDREFBG XZCS6AND7n A B XZCS6AND7n
TP3 175 84 RN2D 4 33 13
ADCLO XWEn A B XWEn
ADCBGREFIN 164 42 RN2E 5 33 12
ADCBGREFIN XRDn A B XRDn
51 RN2F 6 33 11
C
XRnW A B XRnW C
TP 161 33
XREADY XREADY
17 XMP_MCn
XMP/MCn
159 XHOLDn
XHOLDn
PWM1 92 82 XHOLDAn
GPIOA0-PWM1 XHOLDAn
PWM2 93 160 XRSn
GPIOA1-PWM2 XRSn
PWM3 94
GPIOA2-PWM3
PWM4 95 77 X1_CLKIN
GPIOA3-PWM4 X1/XCLKIN
PWM5 98 76
GPIOA4-PWM5 X2
PWM6 101 119 XCLKOUT
GPIOA5-PWM6 XCLKOUT
T1PWM_T1CMP 102
VREFLO GPIOA6-T1PWM_T1CMP
T2PWM_T2CMP 104 134 XTESTSEL
GPIOA7-T2PWM_T2CMP TESTSEL
CAP1_QEP1 106 67
GPIOA8-CAP1_QEP1 TEST1
CAP2_QEP2 107 66
GPIOA9-CAP2_QEP2 TEST2
CAP3_QEPI1 109
GPIOA10-CAP3_QEPI1
TDIRA 116 135 C28_TRSTn
GPIOA11-TDIRA TRSTn
TCLKINA 117 136 C28_TCK
GPIOA12-TCLKINA TCK
C1TRIPn 122 126 C28_TMS
GPIOA13-C1TRIPn TMS
C2TRIPn 123 131 C28_TDI
GPIOA14-C2TRIPn TDI
C3TRIPn 124 127 C28_TDO
GPIOA15-C3TRIPn TDO
137 C28_EMU0
EMU0
PWM7 45 146 C28_EMU1
GPIOB0-PWM7 EMU1
PWM8 46
GPIOB1-PWM8
PWM9 47 40 SPISIMOA
GPIOB2-PWM9 GPIOF0-SPISIMOA
PWM10 48 41 SPISOMIA
B
GPIOB3-PWM10 GPIOF1-SPISOMIA B

PWM11 49 34 SPICLKA
GPIOB4-PWM11 GPIOF2-SPICLKA
PWM12 50 35 SPISTEA
GPIOB5-PWM12 GPIOF3-SPISTEA
T3PWM_T3CMP 53
GPIOB6-T3PWM_T3CMP
T4PWM_T4CMP 55 28 MCLKXA
GPIOB7-T4PWM_T4CMP GPIOF8-MCLKXA
CAP4_QEP3 57 25 MCLKRA
SINGLE POINT CONNECTION GPIOB8-CAP4_QEP3 GPIOF9-MCLKRA
CAP5_QEP4 59 26 MFSXA
TP2 GPIOB9-CAP5_QEP4 GPIOF10-MFSXA
CAP6_QEPI2 60 29 MFSRA
1 GPIOB10-CAP6_QEPI2 GPIOF11-MFSRA
TDIRB 71 22 MDXA
AGND GPIOB11-TDIRB GPIOF12-MDXA
TCLKINB 72 20 MDRA
GPIOB12-TCLKINB GPIOF13-MDRA
C4TRIPn 61
GPIOB13-C4TRIPn
C5TRIPn 62 155 SCITXDA
GPIOB14-C5TRIPn GPIOF4-SCITXDA
C6TRIPn 63 157 SCIRXDA
GPIOB15-C6TRIPn GPIOF5-SCIRXDA
ADC

L4 110 90
GPIOD0-T1CTRIP_PDPINTAn GPIOG4-SCITXDB SCITXDB
T1CTRIP_PDPINTAn 115 91
GPIOD1-T2CTRIPn_EVASOCn GPIOG5-SCIRXDB SCIRXDB
1.8V ( 1.8V ) VDD1 T2CTRIPn_EVASOCn 79
GPIOD5-T3CTRIP_PDPINTBn
1.8V

T3CTRIP_PDPINTBn 83 87
GPIOD6-T4CTRIPn_EVBSOCn GPIOF6-CANTXA CANTXA
BLM21P221SN T4TRIPn_EVBSOCn 89
GPIOF7-CANRXA CANRXA
VDDAIO
VSSAIO

C2 C58 C56 149


VDDA1
VDDA2
VSSA1
VSSA2

VSS10
VSS11
VSS12
VSS13
VSS14
VSS15
VSS16

1uF GPIOE0-XINT1_XBIOn
VDD1
VSS1

VSS2
VSS3
VSS4
VSS5
VSS6
VSS7
VSS8
VSS9

.1uF .001uF XINT1n_XBIOn 151 140


GPIOE1-XINT2_ADCSOC GPIOF14-XF-XPLLDISn XF_XPLLDISn
XINT2n_ADCSOC 150
XNMIn_XINT3 GPIOE2-XNMI_XINT13
3.3V L3
166

165

162
163

176

105
113
120
129
142
153
14

15

19
32
38
52
58
70
78
86
99
1

A A
( 3.3V ) VDDA1 TMS320F2812PGF
DSP
BLM21P221SN
C3 C57 C38 C37
1uF .1uF .1uF .001uF
Title
TMS320F2812 EzDSP

Size Document Number Rev


LOCATE NEAR DSP B 506262 C

Date: Thursday, February 13, 2003 Sheet 2 of 6


5 4 3 2 1
5 4 3 2 1

D D

XA[0..18]

C XD[0..15] C

3.3V

3.3V
ASRAM
11
33

U4 C22 C10
0.1uF 0.1uF
VDD1
VDD2

XA0 1 7 XD0
XA1 A0 D0 XD1
2 8
XA2 A1 D1 XD2
3 9
XA3 A2 D2 XD3
4 10
XA4 A3 D3 XD4
5 13
XA5 A4 D4 XD5
18 14
XA6 A5 D5 XD6
19 15
XA7 A6 D6 XD7
20 16
XA8 A7 D7 XD8
21 29
XA9 A8 D8 XD9
B 24 30 B
XA10 A11 D9 XD10
25 31
XA11 A12 D10 XD11
26 32
XA12 A13 D11 XD12
27 35
XA13 A14 D12 XD13
42 36
XA14 A15 D13 XD14
43 37
XA15 A16 D14 XD15
44 38
XA16 A17 D15
22
XA17 A9
23
A10
28
NC
XZCS6AND7n 6
CS
XWEn 17
64Kx16 and 256Kx16 WE
XRDn 41
OE
Compatible
40
BHE
VSS1
VSS2

39
BLE

IS61LV6416-12T
12
34

A A

Title
TMS320F2812 EzDSP
GND
Size Document Number Rev
B 506262 B

Date: Thursday, February 13, 2003 Sheet 3 of 6


5 4 3 2 1
8 7 6 5 4 3 2 1

JP5 Make a solder connection on


TMS320F2812 supports 3.3V
3.3V +5V JP4
JP4 and/or JP5 to the 3.3V +5V
3 1
C A
B

appropriate power supply.


input/output levels which are
3 1
C A

B
JUMPER3_SMT
JUMPER3_SMT
2

NOT 5V tolerant. Connecting


2
P2
the eZdsp to a system with 5V
XF_XPLLDISn
P8
1 2 PLLDISn
input/output levels will damage
XD0 3 4 XD1 1 2
D XD2 5 6 XD3 SCITXDA 3 4 SCIRXDA 3.3V D
R42 10K 1 JP9
XD5 CAP1_QEP1 3.3V
the TMS320F2812. If the eZdsp
XD4 7 8 XINT1n_XBIOn 5 6
XD6 XD7 CAP2_QEP2 CAP3_QEPI1 2
9 10 7 8 R41 2.2K DS2
XD9 PWM2 3
XD8 11 12 PWM1 9 10
is connected to another target
LTST-C150GKT
XD10 13 14 XD11 PWM3 11 12 PWM4 GREEN
JUMPER3B
XD12 15 16 XD13 PWM5 13 14 PWM6
XD14
XA0
17
19
18
20
XD15
XA1
T1PWM_T1CMP
TDIRA
15
17
16
18
T2PWM_T2CMP
TCLKINA
then the eZdsp must be 3.3V
C62
.1uF
XA2
XA4
21
23
22
24
XA3
XA5
19
21
20
22 XINT1n_XBIOn powered up first and powered
U12 R43
XA7 SPISOMIA
down last to prevent latchup

5
XA6 25 26 SPISIMOA 23 24 SN74AHC1G14 XF
XA8 27 28 XA9 SPICLKA 25 26 SPISTEA 220

conditions.
XA10 29 30 XA11 CANTXA 27 28 CANRXA
XA13 PWM7 2 4
XA12 31 32 XCLKOUT 29 30
XA14 33 34 XA15 PWM8 31 32 PWM9
35 36 PWM10 33 34 PWM11 XF
XZCS0AND1n 37 38 XZCS2n PWM12 35 36 CAP4_QEP3
ISn

3
XREADY 39 40 T1CTRIP_PDPINTAn 37 38 T3CTRIP_PDPINTBn
STRBn
XRnW 41 42 39 40 3.3V
XWEn 43 44 XRDn
3.3V 45 46 XNMIn_XINT3
DSP_RSn XTESTSEL
DSP_RSn 47 48
49 50 XTESTSEL
51 52
C 53 54 XA17 C
XA16 P4 P7
55 56 XHOLDn
XA18 1 JP1 XMPNMC
57 58 1 1 C1TRIPn
XHOLDAn 2
59 60 XINT2n_ADCSOC 2 2 C2TRIPn XMP_MCn
MCLKXA C3TRIPn 3
3 3 JUMPER3B
HEADER 30X2 MCLKRA T2CTRIPn_EVASOCn
4 4
MFSXA 5 5 C4TRIPn BOOT-0
R39 10K 1 JP12
MFSRA 6 6 C5TRIPn
MDXA C6TRIPn 2 SPICLKA
7 7 R36 2.2K
MDRA T4TRIPn_EVBSOCn 3
8 8
P9
9 9 JUMPER3B
1 2 ADCINA0 10 10
3 4 ADCINA1 CAP5_QEP4 11 BOOT-1
R38 10K 1 JP11
ADCINA2 CAP6_QEPI2

BOOT MODE
5 6 12
ADCINA3 T3PWM_T3CMP 2
7 8 13 R35 2.2K SPISTEA
ADCINA4 T4PWM_T4CMP 3
9 10 14
11 12 ADCINA5 TDIRB 15 JUMPER3B
13 14 ADCINA6 TCLKINB 16
15 16 ADCINA7 XF_XPLLDISn 17 BOOT-2
R40 10K 1 JP8
17 18 VREFLO SCITXDB 18
SCIRXDB 2 MDXA
19 20 19 R37 2.2K 3
20
Connect VREFLO to AGND or JUMPER3B
B P5 to VREFLO of target system B
R31 10K 1 JP7 BOOT-3
1 ADCINB0 for proper ADC operation.
ADCINB1 2 SCITXDA
2 R30 2.2K
ADCINB2 3
3
4 ADCINB3
JUMPER3B
5 ADCINB4
L1 3.3V
6 ADCINB5
7 ADCINB6
8 ADCINB7 BOOT-3 BOOT-2 BOOT-1 BOOT-0 MODE
1.8V
9 ADCREFM SCITXDA MDXA SPISTEA SPICLKA
BLM21P221SN
10 ADCREFP
C43

1 X X X FLASH
U14
0.1uF
5

0 1 X X SPI
R1 SN74LVC1G14 U11
Tie off unused F24xx
4 2 8 1 0 0 1 1 SCI
compatible signals. X1_CLKIN 100 VCC OFFn
2

JP3 R29 0 0 1 0 H0
R6 1 3 5 4
B

ISn A C 100 CLK GND 0 0 0 1 OTP


3

3.3V
10K JUMPER3_SMT C42 NO-POP 0 0 0 0 PARALLEL
A R5 Schematic change from version A
33 pF
STRBn
A/B to C. F2812 clkin is 1.8V SMT/4PIN DIP
10K input.
GND
MCLK OPTIONAL
GND
AGND Title
TMS320F2812 EzDSP

Size Document Number Rev


B 506262 C

8 7 6 5 4 3 Date: Thursday,
2 February 13, 2003 Sheet 4 1 of 6
5 4 3 2 1

R16
U5
XPPD7 RN4A 33 RN3A 33 R14 10K
1 16 2 18 1 16
XPPD6 RN4B 2 A B 15 33 3 A1 B1 17 RN3B 2 A B 15 33 C52
XPPD5 RN4C A B 33 A2 B2 RN3C A B 33
3 14 4 16 3 14 33pf 10K
XPPD4 RN4D A B 33 A3 B3 RN3D A B 33 C53 R13
4 13 5 15 4 13
XPPD3 RN4E A B 33 A4 B4 RN3E A B 33
5 12 6 14 5 12 33pf
XPPD2 RN4F A B 33 A5 B5 RN3F A B 33 C54
6 11 7 13 6 11 10K
XPPD1 RN4G A B 33 A6 B6 RN3G A B 33
7 10 8 12 7 10
A B A7 B7 A B 33pf C55
XPPD0 RN4H 8 9 33 9 11 RN3H 8 9 33
A B A8 B8 A B PPTRSTn
C33 33pf
PPBUSENn 19 20 5V 3.3V
PPBUSDIR G VCC P1 R17
1 33pf
DIR 10 C50 C51 C32 PPTMS
GND PPTDI 1 2
C31 33pf 3 4 10K
.1uF .001uF 5V
74ABT245PW PPTDO 5 6 EMUOFF
D
33pf C29 7 8 D

P3 PPTCK
9 10
U2 33pf DB25_SHIELD PPEMU0 11 12
XPPS4 RN1A 13 14
2 18 1 16 33 PPSLCT 13
XPPS5 3 A1 B1 17 RN1B 2
A B
15 33 25
A2 B2 A B HEADER 7X2
XPPS7n 4 16 RN1C 3 14 33 PPPE 12
XPPS3 A3 B3 RN1D A B
5 15 4 13 33 24 PPEMU1
A4 B4 RN1E A B
6 14 5 12 33 PPBSY 11
7 A5 B5 13 RN1F 6 A B 11 33 23
A6 B6 RN1G A B
8 12 7 10 33 PPACKn 10 XDS510PP EMULATION HEADER
A7 B7 RN1H A B
9 11 8 9 33 22
A8 B8 A B PPD7 9
19 20 5V 21
5V 1 G VCC PPD6 8
DIR C27 C28
10 20
GND PPD5 7
.1uF .001uF 19
74ABT245PW PPD4 6 PPEMU0/1 CONNECT DIRECTLY TO F2812 FOR
18 EMULATOR WAIT-IN-RESE T SUPPORT
PPD3 5
PPSELn 17
PPD2 4
PPINITn 16
PPD1 3
XPPC3n PPERRn 15
PPD0 2 PONRSnIN
PONRSnIN
XPPC2 PPALEn 14
PPSTRBn 1 B
XPPC1n XTRSTn
C28_TRSTn
A

XPPC0n PLACE NEAR EACH MOUNTING HOLE XTMS


C28_TMS
XTDI
C28_TDO
3.3V CROSS COUPLE IN T O OUT
XTDO
C28_TDI
R19 R47 XTCK C28_TCK
C C16 C67 C

R11 XEVNT0
C28_EMU0
1M .001uF 1M .001uF
R12 10K
XEVNT1
R20 C28_EMU1
R25 C34 10K
100
100 33pf R22 TPOWLOSSn
R24 C30 10K

100 33pf
R15 C15
R8 33 XTCK
100 33pf
R10 33 PPTCK R18 C17
100 33pf
R9 33 PPTDO 3.3V

C14 C25 C26 C49


FPGA_VCCA

0.1uF 0.1uF 0.1uF 0.1uF


PPTRSTn

EMUOFF
XEVNT0

XTRSTn

PPTMS
XTCKI

PPTDI
IPPTCK

XTMS

XTDO
VCCR
93 IPPTDO

JCLK
XTDI

3.3V
GND

Locate R7,R54, C70 at the DSP XRSn pin


GND

for best EMI/ESD noise immunity.


3.3V
3.3V R49
100
99
98
97
96
95
94

92
91
90
89
88
87
86
85
84
83
82
81
80
79
78
77
76

U6 0
XRSn is logical AND of PONRSnIN and
PPTRSTn
XTRSTn

PPTCK
XEVNT0

XTCKI

PPTDI
PPTMS
XTDI

XTMS
PPTDO

JCLK
VCCA

XTDO
RSV10

VCCI
PPEMU0
RSV13_TCK_IO

RSV11_PRA_IO
GND

VCCR_NC

U13
ODEMU0n
ODEMU1n

EMUOFF_1
ODEMU0_SRC
ODEMU1_SRC

emulator controlled reset. Power on default


is PONRnIN controls XRSn. 1 5 FPGA_VCCA
R7 IN OUT
1.5K 2
B
R54 GND R50 B

GND 1 75 DSP_RSn OPEN-DRAIN 3 4 C45 C23 C24 C11 C68


GND DSP_RSn XRSn EN NC/FB 0.1uF 0.1uF 0.1uF 0.1uF 1uF
2 74 100 41.2K 1%
3.3V RSV1_TDI_IO MCLKOUT GND
3 73 IF U13 IS INSTAL LED THEN TPS72201
3.3V XEVNT1 EMUOFF MCLKOUTEN C70
4 72 REMOVE R49 AN D R48.
XEVNT1 MCLKOUT2 GND 22nF
5 71
PPEMU1 MCLKOUT2EN 3.3V
6 70
R23 RSV2 EXTERN_RSTn GND R51
7 69
3.3V RSV3_TMS_IO GND GND
10K 8 68
GND VCCI GND FPGA_VCCA 40.2K 1%
9 67
GND VCCA DSP_RSn
XPPD0 10 SPECTRUM DIGITAL INC. 66
XPPD1 XPPD0 XBITOUT0
11 65 To/from expansio n header
XPPD2 12 XPPD1 XBITOUT1 64
XPPD2 EMBEDDED PP JTAG CONTROLLER XBITOUT2
XPPD3 13 63 +5V
XPPD4 XPPD3 XBITOUT3 GND R48
14
XPPD4 506053-0001B XBITIN0
62
XPPD5 15 61 GND VCCR
XPPD6 XPPD5 XBITIN1 GND 0
16 EXT_VER 0011 0-001 60
XPPD7 XPPD6 XBITIN2 GND
17 59
XPPD7 XBITIN3 3.3V
18 58
19 RSV4 VCCI 57 FPGA_VCCA C47 C13
3.3V RSV5 VCCA 0.1uF 0.1uF
20 56
XPPS3 VCCI VBUS_ENn
21 55
XPPS4 XPPS3 VPOWER_BLEED
22 54
XPPS5 XPPS4 VPOWER_ONn 3.3V
23 53
XPPS5 EXT_VER0 GND
24 52
XPPS7n XPPS6 EXT_VER1 GND
25 51
XPPS7n GND
RSV8_PRB_IO

TPOWLOSSn
PPBUSENn

VFUNC_EN

EXT_VER7
EXT_VER6
EXT_VER5
EXT_VER4
EXT_VER3
EXT_VER2
PPBUSDIR

ALT_MCLK
VCCR_NC

PONRSn
XPPC3n

XPPC1n
XPPC0n
XPPC2

VCCA
RSV6

RSV7

HCLK
RSV9

VCCI
GND

L2 3.3V
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

506053-0001B
FPGA_VCCA
PPBUSENn

BLM21P221SN
TPOWLOSSn
PPBUSDIR

VCCR

A A
GND

GND
3.3V

C48
GND
GND
3.3V
3.3V
GND
GND
PONRSnIN
ALT_MCLK
XPPC3n

XPPC1n
XPPC0n
XPPC2

MCLK

0.1uF +5V 5V

3.3V 3.3V
U10 GND
GND
8 1
VCC OFFn
R32
5 4
MCLK 33 CLK GND Title
TMS320F2812 EzDSP
C46 30 MHz
Size Document Number Rev
NO-POP CBLV-3C-30 .000 C 506262 C

Date: Thursday, February 13, 2003 Sheet 5 of 6


5 4 3 2 1
5 4 3 2 1

+5V
18.2K 1.899V
P6 U9 16.9K 1.848V
5 28 15.0K 1.773V
1IN 1RESET 13.7K 1.722V
6
C66 1IN
R44 + CT2 1.8VONn 4 23
+5V Max 220 47uF 1EN 1OUT 1.8V
0.1uF 24
1OUT R33 C64
25
1FB/SENSE 16.9K, 1% + CT3
3
1GND 22uF 0.1uF
D D
R45 30.1K, 1%
DS1 11 22
LTST-C150GKT 2IN 2RESET
12
GREEN C65 2IN 3.3V
10 17
2EN 2OUT
0.1uF 18
2OUT
19
2SENSE C63
9
R46 2GND + CT4
10K 22uF 0.1uF
THERMAL_PAD

1 15
3.3V NC NC R52
2 16
NC NC
7 20 VDD3VFL
NC NC 0
8 21
U16 NC NC
13 26
R53 NC NC 3.3V C1 C7
1 14 27
CT NC NC 1uF
5 .1uF
D

VDD 1.5K 1% TPS767D301


2 Q3
GND BSS138
4 G
RESETn R2
S

3 10K
MRn R34
TIE TPS767D301 POWER PAD TO GND
C
TPS3838K33DBV 2.0K 1% C

PLANE (TI-SLMA002)
PONRSnIN
RESETn of TPS3838 is open-drain.
U16 was added for testing but not
populated on production boards.

1.8V

+ CT6 + CT5 C19 C18 C5 C8 C21 C41 C40 C61 C59


22uF 22uF 0.1uF 0.1uF 0.1uF 0.1uF 0.1uF 0.1uF 0.1uF 0.1uF 0.1uF

3.3V

B B

+ CT1
22uF C20 C6 C9 C39 C60
0.1uF 0.1uF 0.1uF 0.1uF 0.1uF
TP1
1
GND

GND

POWER ON SEQUENCE NOTES TPS767D301 RATINGS

3.3V THEN 1.8V 3.3V SUPPLY, VDDIO MAX Iout PER CHANNEL IS 1A
VDD3VFL, VDDA1,VDDA2
PONRSnIN, GOES HIGH > 200ms AFTER ALL POWER TPS767D301 PD = (Vin-Vout)*Iout
IS STABLE. 2.2V Q3
VOLTAGE SUPPLY MAX CURRENT TPS767D301 PD

SET Q3 TO TURN ON WHEN 3.3V SUPPLY IS 1.8V SUPPLY 1.8V 333mA 1065mW
A
GREATER THEN 2.2 VOLTS. REGULATOR A

TURN ON DELAY AND RAMP RATE WILL 3.3V 307mA 521mW


ENSURE THAT 3.3V SUPPLY IS AT 2.5 VOLTS 1586mW Total
OR HIGHER BEFORE THE 1.8V SUPPLY 140ms-280ms
REACHES 0.3 VOLTS. PD(max) = (Tj(max) - Ta)/Rja
Title
U16 WILL TURN OFF THE 1.8V SUPPLY WHEN PONRSnIN = (125 - 35)/27.9 TMS320F2812 EzDSP
INPUT POWER FALLS BELOW 2.94V. THIS SPEEDS
UP THE 1.8V SUPPLY TURN OFF. = 3255mW Size Document Number Rev
B 506262 C

Date: Thursday, February 13, 2003 Sheet 6 of 6


5 4 3 2 1
6 Phụ Lục B 34

6 Phụ Lục B
Sơ đồ nguyên lý và miêu tả board mạch Zwickau Adapter Board, một tham khảo cho mở rộng đối
với eZdspF2812.
Zwickau University ‘c28x Development Board

This document outlines the ‘c28x adaptor board developed by Zwickau University

Description

The Zwickau University adptor board is designed to be used with the Spectrum Digital
TMS320F2812 ‘eZdsp’ board. The peripheral expansion sockets on the eZdsp board can be fitted
with header plugs which allow it to be connected to the Zwickau board. The adaptor includes the
following features…

• 8x LED’s connected to GPIOB7..B0


• 8x DIP switches connected to GPIOB15..B8
• 2x momentary pushbuttons connected to GPIOD6 & D1
• Loudspeaker connected to T1PWM output
• 2x potentiometers allowing 0-3V to be applied to ADC channels A0 & B0
• CAN port: link selectable between high-speed (SN65HVD230D) and low speed
(TJA1054A) transceivers, each with separate connector
• SCI-A port connected to RS232 transceiver and 9-pin ‘D’ socket
• SPI output connected to serial EEPROM (M95080) ( Note : chip select GPIO-D5) and
serial DAC (TLV5617A) (Note: chip select by GPIOD0 pin)
• I2C temperature sensor connected to GPIOG5 & G4 pins
The adaptor board was designed by Dr. Frank Bormann of the University of Zwickau. Boards can
be obtained by

University of Applied Sciences Zwickau


Department of Electrical Engineering
Mr. Frank Bormann
Dr. – Friedrichs – Ring 2A
08056 Zwickau
Germany

The board is supplied with a description , a hardware configuration file and sample programs to
test all parts of the peripherals. The cost per adaptor board will be 299 Euro.

DSK (eZdsp) Starter Kit Information

U.S. Part number: TMDX3P761128


European Part number: TMDX3P761128E
TI price: $305.00
Web link: TMS320F2812 eZdsp Kit (DSK)
17.03.2004 09:06:54 f=0.68 E:/Forschung/Daughterboard eZdspF2812/V2/F2812-ADD_B.sch (Sheet: 1/1)
BOM for Zwickau Adapter Board

Part Value Device Package Description


C1 100n C-SMD1206 C1206 SMD-Capacitor
C2 10 µ ELKO-SMDC CT6032-C Tantal-SMD-Elko
C3 1µ ELKO-SMDA CT3216-A Tantal-SMD-Elko
C4 1µ ELKO-SMDA CT3216-A Tantal-SMD-Elko
C5 100n C-SMD1206 C1206 SMD-Capacitor
C6 100n C-SMD1206 C1206 SMD-Capacitor
C7 100n C-SMD1206 C1206 SMD-Capacitor
C8 100n C-SMD1206 C1206 SMD-Capacitor
C9 100n C-SMD1206 C1206 SMD-Capacitor
C10 100n C-SMD1206 C1206 SMD-Capacitor
C11 100n C-SMD1206 C1206 SMD-Capacitor
D1 LED8 LED8 LZR188 ZAQS0807
IC1 2937IMP-3,3 SOT223 Voltage Regulator 3,3V
IC2 TLV2462 TLV2462ID SO08 Dual OPAMP
IC3 SN74LVT244BDW SN74LVT244BDW SOIC20 8x LED driver
IC4 MAX232 MAX232 SO16 Transceiver RS 2312
IC5 TLV5617A TLV5617A SO08 Dual 10-Bit-DAC
IC6 M95080 M95080 SO08 serial EEPROM
IC7 DS1621 DS1621 SO08 temperature sensor
IC8 SN65HVD230D SN65HVD230D SO08 CAN-High-speed
IC9 74LCX14 74LCX14 SO14 Schmitt- Trigger CAN-H
IC10 TJA1054A TJA1054A SO14 CAN – Low speed
IC11 LD1117S33C SOT223 Voltage Regulator 3.3V
IC12 TLV2462 TLV2462ID SO08 Dual OPAMP
JP1 JP2E JP2 JUMPER
JP2 JP2E JP2 JUMPER
JP3 JP1E JP1 JUMPER
JP4 JP2E JP2 JUMPER
JP5 JP2E JP2 JUMPER
JP6 JP2E JP2 JUMPER
JP7 JP1E JP1 JUMPER
JP8 JP1E JP1 JUMPER
P2 FE30-2FE30-2MIR FE30-2MIR FEMALE HEADER
P4 FE20-1FE20R FE20-ROUND FEMALE HEADER
P5 FE10-1FE10R FE10-ROUND FEMALE HEADER
P7 FE10-1FE10R FE10-ROUND FEMALE HEADER
P8 FE20-2FE20-2MIR FE20-2MIR FEMALE HEADER
P9 FE10-2FE10-2MIR FE10-2MIR FEMALE HEADER
R1 10k TRIM_EU-RS3 RS3 POTENTIOMETER
R2 10k TRIM_EU-RS3 RS3 POTENTIOMETER
R3 1k R-EU_R1206 R1206 RESISTOR
R4 1k R-EU_R1206 R1206 RESISTOR
R5 150 R-EU_R1206 R1206 RESISTOR
R6 150 R-EU_R1206 R1206 RESISTOR
R7 100k R-EU_R1206 R1206 RESISTOR
R8 2,2k R-EU_R1206 R1206 RESISTOR
R9 100k R-EU_R1206 R1206 RESISTOR
R10 2,2k R-EU_R1206 R1206 RESISTOR
R11 4,7k R-EU_R1206 R1206 RESISTOR
R12 10k R-EU_R1206 R1206 RESISTOR
R13 10k R-EU_R1206 R1206 RESISTOR
R14 47k R-EU_R1206 R1206 RESISTOR
R15 4,7k R-EU_R1206 R1206 RESISTOR
R16 1k R-EU_R1206 R1206 RESISTOR
R17 22 R-EU_R1206 R1206 RESISTOR
R18 100 R-EU_M1206 M1206 RESISTOR
R19 100 R-EU_M1206 M1206 RESISTOR
R20 120 R-EU_R1206 R1206 RESISTOR
R21 4,7k R-EU_M1206 M1206 RESISTOR
R22 1,2k R-EU_M1206 M1206 RESISTOR
R23 4,7k R-EU_M1206 M1206 RESISTOR
R24 520 R-EU_M1206 M1206 RESISTOR
R25 520 R-EU_M1206 M1206 RESISTOR
RN1 82 G08R SIL9 SIL RESISTOR
RN2 100k G08R SIL9 SIL RESISTOR
RN3 2,2k G08R SIL9 SIL RESISTOR
RN4 100K G08R SIL9 SIL RESISTOR
S1 BUTTON TA
S2 BUTTON TA
S3 DS08 DS-08 DIL/CODE SWITCH
SP1 F/PMW04A F/PMX04 F/PMX04A SPEAKER
U$1 SMD-SO20 SMD-SO20 SO20
V1 BC849 BC849SMD SOT23-BEC NPN Transistor
X1 RS232 F09HP F09HP SUB-D
X2 CAN-H M09HP M09HP SUB-D
X3 CAN-L MDSSV-BC04 SSV-BC04 YAMAICHICONNECTOR
7 Phụ Lục C 40

7 Phụ Lục C
Chương trình giao tiếp với LCD, thông qua giao tiếp 4bit.
File định nghĩa lcd.h
#i f n d e f _LCD_H
#define _LCD_H

/* ********************************************************
LCD
PortA
******************************************************** */
#define LCD_D0 1<<0
#define LCD_D1 1<<1
#define LCD_D2 1<<2
#define LCD_D3 1<<3
#define LCD_RS 1<<4
#define LCD_EN 1<<5
#define LCD_LED 1<<6
#define LCD_BUS LCD_D0 | LCD_D1 | LCD_D2 | LCD_D3
#define lcd_en_set ( ) GpioDataRegs .GPASET. a l l |= LCD_EN // EN = 1 ( Enable )
#define lcd_en_clr ( ) GpioDataRegs .GPACLEAR. a l l |= LCD_EN // EN = 0 ( Disable )
#define lcd_rs_data ( ) GpioDataRegs .GPASET. a l l |= LCD_RS // RS = 1 ( Select Instructio
#define l c d _ r s _ i n s ( ) GpioDataRegs .GPACLEAR. a l l |= LCD_RS // RS = 0 ( S e l e c t Data mode )

/* D e f i n e cac t h a o t a c co ban v o i LCD */


//#d e f i n e l c d _ c l e a r ( ) l c d _ w r i t e _ c o n t r o l (0 x01 ) // Clear Display
#define lcd_cursor_home ( ) l c d _ w r i t e _ c o n t r o l ( 0 x02 ) // S e t Cursor = 0
#define lcd_display_on ( ) l c d _ w r i t e _ c o n t r o l ( 0 x0E ) // LCD D i s p l a y Enable
#define l c d _ d i s p l a y _ o f f ( ) l c d _ w r i t e _ c o n t r o l ( 0 x08 ) // LCD D i s p l a y D i s a b l e
#define lcd_display_blink_on ( ) l c d _ w r i t e _ c o n t r o l ( 0 x0F ) // S e t Cursor = B l i n k
#define l c d _ d i s p l a y _ b l i n k _ o f f ( ) l c d _ w r i t e _ c o n t r o l ( 0 x0E ) // S e t Cursor = B l i n k
#define lcd_cursor_on ( ) l c d _ w r i t e _ c o n t r o l ( 0 x0E ) // Enable LCD Cursor
#define l c d _ c u r s o r _ o f f ( ) l c d _ w r i t e _ c o n t r o l ( 0 x0C ) // D i s a b l e LCD Cursor
#define l c d _ c u r s o r _ l e f t ( ) l c d _ w r i t e _ c o n t r o l ( 0 x10 ) // S h i f t L e f t Cursor
#define l c d _ c u r s o r _ r i g h t ( ) l c d _ w r i t e _ c o n t r o l ( 0 x14 ) // S h i f t R i g h t Cursor
#define l c d _ d i s p l a y _ s l e f t ( ) l c d _ w r i t e _ c o n t r o l ( 0 x18 ) // S h i f t Left Display
#define l c d _ d i s p l a y _ s r i g h t ( ) l c d _ w r i t e _ c o n t r o l ( 0 x1C ) // S h i f t Right Display

/* p r o t o t y p e */
void l c d _ w r i t e _ c o n t r o l ( char ) ; // Write I n s t u c t i o n t o LCD
void l c d _ w r i t e _ a s c i i ( char ) ; // Write LCD D i s p l a y ( ASCII )
void l c d _ c o n f i g ( void ) ; // I n i t i a l LCD
void lcd_goto_xy ( char row , char c o l l u m ) ;
void l c d _ p r i n t ( char * ) ; // P r i n t D i s p l a y t o LCD
void d e l a y 1 s ( void ) ; // Delay Function
// v o i d delay_160us ( v o i d ) ;
void delay_4ms ( void ) ;
void l c d _ c l e a r ( void ) ;
7 Phụ Lục C 41

/* −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− */
#endif

File chứa mã nguồn lcd.c


/* l c d . c
*/

#include " l c d . h"

int busy_lcd ( void ) ; // Read Busy LCD S t a t u s


// v o i d e n a b l e _ l c d ( v o i d ) ; // Enable P u l s e
void lcd_out_data4 ( char ) ;
void lcd_write_byte ( char ) ;
/* **************************************************** */
/* I n i t i a l LCD : 8 b i t ,2− l i n e d i s p l a y , 5 x7 d o t c h a r a t e r */
/* **************************************************** */
void l c d _ c o n f i g ( )
{
EALLOW;
// s e t t h o s e p i n s as i n p u t / ouput
GpioMuxRegs .GPAMUX. a l l &= ~( LCD_D0 | LCD_D1 | LCD_D2 | LCD_D3 | LCD_EN | LCD_RS ) ;
GpioMuxRegs .GPAMUX. a l l &= ~( LCD_LED ) ;
// s e t t i n g t h o s e p i n s as o u t p u t
GpioMuxRegs .GPADIR. a l l |= ( LCD_D0 | LCD_D1 | LCD_D2 | LCD_D3 | LCD_EN | LCD_RS ) ;
GpioMuxRegs .GPADIR. a l l |= ( LCD_LED ) ;
GpioDataRegs .GPASET. a l l |= (LCD_LED) ;
EDIS ;

l c d _ w r i t e _ c o n t r o l ( 0 x30 ) ; // Function S e t (8 b i t )
l c d _ w r i t e _ c o n t r o l ( 0 x02 ) ;
l c d _ w r i t e _ c o n t r o l ( 0 x28 ) ; // Function S e t (DL=1 4−Bit ,N=1 2 Line , F=0 5X7)

l c d _ w r i t e _ c o n t r o l ( 0 x0E ) ; // D i s p l a y on C o n t r o l ( Cursor on , Cursor not B l i n k )


l c d _ w r i t e _ c o n t r o l ( 0 x01 ) ; // Entry Mode S e t ( I /D=1 Increment , S=0 Cursor S h i f t )
lcd_clear ( ) ;

/* ********************** */
/* S e t c u r s o r p o s i t i o n */
/* ********************** */

void lcd_goto_xy ( char row , char c o l l u m )


{
unsigned char pos ;
pos = c o l l u m ;
pos |= 0 x80 ;
7 Phụ Lục C 42

i f ( row == 2 )
pos |= 0 x40 ; // S e t DD−RAM Address Command
l c d _ w r i t e _ c o n t r o l ( pos ) ;
// delay_4ms ( ) ;
}

/* ************************** */
/* S t r o b e 4−B i t Data t o LCD */
/* ************************** */
void lcd_out_data4 ( char v a l )
{
GpioDataRegs .GPACLEAR. a l l |= (LCD_BUS) ; // R e s e t 4−B i t Pin Data
GpioDataRegs .GPASET. a l l |= ( v a l ) ; // 0 0 0 0 : 0 0 0 0 : dddd : RS ,RW,EN, 0 : 0 0 0 0 : 0 0 0 0 : 0 0 0 0 : 0 0 0 0
}

/* ************************** */
/* Write Data 1 Byte t o LCD */
/* ************************** */
void lcd_write_byte ( char v a l )
{
unsigned int i ; // Delay Count
lcd_out_data4 ( ( val >>4)&0x0F ) ; // S t r o b e 4−B i t High−N i b b l e t o LCD
lcd_en_set ( ) ;
f o r ( i =0; i <5000; i ++); // Wait Command Ready
lcd_en_clr ( ) ;
lcd_out_data4 ( v a l&0x0F ) ; // S t r o b e 4−B i t Low−N i b b l e t o LCD
lcd_en_set ( ) ;
f o r ( i =0; i <5000; i ++); // Wait Command Ready
lcd_en_clr ( ) ;
}

/* **************************** */
/* Write c o n s t r u c t i o n t o LCD */
/* **************************** */
void l c d _ w r i t e _ c o n t r o l ( char v a l )
{
lcd_rs_ins ( ) ;
lcd_write_byte ( v a l ) ;
}

/* ******************************* */
/* Write a s c i i c h a r a c t e r t o LCD */
/* ****************************** */
void l c d _ w r i t e _ a s c i i ( char v a l )
{
lcd_rs_data ( ) ;
lcd_write_byte ( v a l ) ;
7 Phụ Lục C 43

/* ********************************** */
/* P r i n t D i s p l a y Data ( ASCII ) t o LCD */
/* ********************************** */
void l c d _ p r i n t ( char* s t r )
{
unsigned char i ;
f o r ( i =0; i < 18 && s t r [ i ] ! = 0 ; i ++) // 16 i n t a c t e r P r i n t
{
lcd_write_ascii ( str [ i ] ) ; // P r i n t Byte t o LCD
}
}

/* ********************************************

*********************************************** */
void l c d _ c l e a r ( void )
{
l c d _ w r i t e _ c o n t r o l ( 0 x01 ) ;
delay_4ms ( ) ;
}

/* ********************* */
/* Delay Time Function */
/* 1 −4294967296 */
/* ********************* */

void d e l a y 1 s ( void )
{
unsigned long count1 = 6 0 0 0 0 0 0 ;
while ( count1 > 0 ) { count1 −−;} // Loop Decrease Counter
}

void delay_4ms ( void )


{
unsigned long i= 1 0 0 0 0 0 ;
while ( i −− ) ;
}