You are on page 1of 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 eZdspF28121 . 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 1.1 1.2 Cài đặt CCS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Thiết lập cấu hình cho CCS giao tiếp được với phần cứng. . . . . . . . . . . . . . . . 3 3 4 6 6 8 9 9

2 Phần Cứng eZdspF2812 2.1 2.2 Cấu tạo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Thiết lập chế độ hoạt động của board mạch với các Jumper . . . . . . . . . . . . . . 2.2.1 2.2.2 2.2.3 2.2.4 2.3 JP4, JP5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JP1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

JP7, JP8, JP11, JP12: lựa chọn chế độ Boot . . . . . . . . . . . . . . . . . . 10 JP9, PLL disable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

Onboard LEDs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 12

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

Làm quen với môi trường làm việc của CCS . . . . . . . . . . . . . . . . . . . . . . . 12 Debug chương trình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.2.1 3.2.2 3.2.3 3.2.4 Add a Break Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Add a Probe Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Xem một biến . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Debug từng bước . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3.3
1

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

Đ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 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.4

Tạo một project mới . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Soạn thảo mã nguồn C/C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Cấu hình cho việc dịch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Linker Command File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Biên dịch chương trình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Vẽ các đồ thị của các biến . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Sử dụng các chương trình viết sẵn cho project của mình . . . . . . . . . . . . . . . . 23 24 . . . . . . . . . . . . . . . . . . . . . . 24

4 Một số mở rộng 4.1 4.2 Chỉnh sửa linker, nạp chương trình vào flash

Giới thiệu một số thư viện . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 27 34 40

5 Phụ lục A 6 Phụ Lục B 7 Phụ Lục C

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

3

1
1.1

Cài đặt và thiết lập cấu hình cho CCS
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
2.1

Phần Cứng eZdspF2812
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 eZdspF2812, 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 như

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++) 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
3.3.1

Xây dựng chương trình đầu tiên
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 Libraries. 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
4.1

Một số mở rộng
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
D

PRODUCTION RELEASE UPDATE PER SPRS174G

07-June-2002 20-Jan-2003
D

C

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 REVISION STATUS OF SHEETS CHK
A

DATE DATE
A

REV ENGR SH ENGR-MGR REV QA SH MFG REV SH C 1 C 2 B 3 C 4
5

DATE DATE DATE DATE DATE

SPECTRUM DIGITAL
Title TMS320F2812 EzDSP Size B Date:
3 2

C 5

C 6

NEXT ASSY APPLICATION

USED ON RLSE

Document Number 506262 Thursday, February 13, 2003 Sheet
1

Rev C 1 of 6

4

5

4

3

2

1

3.3V GND VDD3VFL

1.8V XA[0..18] XA0 XA1 XA2 XA3 XA4 XA5 XA6 XA7 XA8 XA9 XA10 XA11 XA12 XA13 XA14 XA15 XA16 XA17 XA18 XD[0..15]

31 64 81 114 145

23 37 56 75 100 112 128 143 154

69

U8

VDD3VFL

D

TAIYO YUDEN EMK325F106ZH-T

ADCREFM ADCREFP 10UF CERAMIC LOW ESR C35 10UF CERAMIC LOW ESR C36 R26 24.9K TP3

ADCINA0 ADCINA1 ADCINA2 ADCINA3 ADCINA4 ADCINA5 ADCINA6 ADCINA7 ADCINB0 ADCINB1 ADCINB2 ADCINB3 ADCINB4 ADCINB5 ADCINB6 ADCINB7

174 173 172 171 170 169 168 167 2 3 4 5 6 7 8 9 11 10 16 12 13 175 164

ADCINA0 ADCINA1 ADCINA2 ADCINA3 ADCINA4 ADCINA5 ADCINA6 ADCINA7 ADCINB0 ADCINB1 ADCINB2 ADCINB3 ADCINB4 ADCINB5 ADCINB6 ADCINB7 ADCREFP ADCREFM ADCRESEXT AVSSREFBG AVDDREFBG ADCLO ADCBGREFIN

VDDIO1 VDDIO2 VDDIO3 VDDIO4 VDDIO5

VDD2 VDD3 VDD4 VDD5 VDD6 VDD7 VDD8 VDD9 VDD10

XA0 XA1 XA2 XA3 XA4 XA5 XA6 XA7 XA8 XA9 XA10 XA11 XA12 XA13 XA14 XA15 XA16 XA17 XA18

18 43 80 85 103 108 111 118 121 125 130 132 138 141 144 148 152 156 158

AGND

XD0 XD1 XD2 XD3 XD4 XD5 XD6 XD7 XD8 XD9 XD10 XD11 XD12 XD13 XD14 XD15 XZCS0AND1n XZCS2n XZCS6AND7n XWEn XRDn XRnW XREADY XMP/MCn XHOLDn XHOLDAn XRSn X1/XCLKIN X2 XCLKOUT TESTSEL TEST1 TEST2 TRSTn TCK TMS TDI TDO EMU0 EMU1 GPIOF0-SPISIMOA GPIOF1-SPISOMIA GPIOF2-SPICLKA GPIOF3-SPISTEA GPIOF8-MCLKXA GPIOF9-MCLKRA GPIOF10-MFSXA GPIOF11-MFSRA GPIOF12-MDXA GPIOF13-MDRA

21 24 27 30 33 36 39 54 65 68 73 74 96 97 139 147 44 88 133 84 42 51 161 17 159 82 160 77 76 119 134 67 66 135 136 126 131 127 137 146 40 41 34 35 28 25 26 29 22 20 155 157 90 91 87 89 140

XD0 XD1 XD2 XD3 XD4 XD5 XD6 XD7 XD8 XD9 XD10 XD11 XD12 XD13 XD14 XD15 RN2A RN2B RN2C RN2D RN2E RN2F

D

VDD CORE - 1.8V

FLASH - 3.3V

VDD I/0 -3.3V

VDDA1 ADCBGREFIN

C

1 2 3 4 5 6

TP

A A A A A A

16 B 33 15 B 33 14 B 33 13 B 33 12 B 33 11 B 33

VREFLO

PWM1 PWM2 PWM3 PWM4 PWM5 PWM6 T1PWM_T1CMP T2PWM_T2CMP CAP1_QEP1 CAP2_QEP2 CAP3_QEPI1 TDIRA TCLKINA C1TRIPn C2TRIPn C3TRIPn PWM7 PWM8 PWM9 PWM10 PWM11 PWM12 T3PWM_T3CMP T4PWM_T4CMP CAP4_QEP3 CAP5_QEP4 CAP6_QEPI2 TDIRB TCLKINB C4TRIPn C5TRIPn C6TRIPn T1CTRIP_PDPINTAn T2CTRIPn_EVASOCn T3CTRIP_PDPINTBn T4TRIPn_EVBSOCn XINT1n_XBIOn XINT2n_ADCSOC XNMIn_XINT3

92 93 94 95 98 101 102 104 106 107 109 116 117 122 123 124 45 46 47 48 49 50 53 55 57 59 60 71 72 61 62 63 110 115 79 83 149 151 150

GPIOA0-PWM1 GPIOA1-PWM2 GPIOA2-PWM3 GPIOA3-PWM4 GPIOA4-PWM5 GPIOA5-PWM6 GPIOA6-T1PWM_T1CMP GPIOA7-T2PWM_T2CMP GPIOA8-CAP1_QEP1 GPIOA9-CAP2_QEP2 GPIOA10-CAP3_QEPI1 GPIOA11-TDIRA GPIOA12-TCLKINA GPIOA13-C1TRIPn GPIOA14-C2TRIPn GPIOA15-C3TRIPn GPIOB0-PWM7 GPIOB1-PWM8 GPIOB2-PWM9 GPIOB3-PWM10 GPIOB4-PWM11 GPIOB5-PWM12 GPIOB6-T3PWM_T3CMP GPIOB7-T4PWM_T4CMP GPIOB8-CAP4_QEP3 GPIOB9-CAP5_QEP4 GPIOB10-CAP6_QEPI2 GPIOB11-TDIRB GPIOB12-TCLKINB GPIOB13-C4TRIPn GPIOB14-C5TRIPn GPIOB15-C6TRIPn GPIOD0-T1CTRIP_PDPINTAn GPIOD1-T2CTRIPn_EVASOCn GPIOD5-T3CTRIP_PDPINTBn GPIOD6-T4CTRIPn_EVBSOCn 14 VDDA1 166 VDDA2 15 VSSA1 165 VSSA2 GPIOE0-XINT1_XBIOn GPIOE1-XINT2_ADCSOC GPIOE2-XNMI_XINT13

XZCS0AND1n XZCS2n XZCS6AND7n XWEn XRDn XRnW XREADY XMP_MCn XHOLDn XHOLDAn XRSn X1_CLKIN XCLKOUT XTESTSEL

C

C28_TRSTn C28_TCK C28_TMS C28_TDI C28_TDO C28_EMU0 C28_EMU1 SPISIMOA SPISOMIA SPICLKA SPISTEA MCLKXA MCLKRA MFSXA MFSRA MDXA MDRA SCITXDA SCIRXDA SCITXDB SCIRXDB CANTXA CANRXA XF_XPLLDISn

B

B

SINGLE POINT CONNECTION

1

TP2 AGND

L4 1.8V BLM21P221SN C2 1uF C58 .1uF C56 .001uF

ADC

GPIOF4-SCITXDA GPIOF5-SCIRXDA GPIOG4-SCITXDB GPIOG5-SCIRXDB

( 1.8V )

VDD1

1.8V

1 VDDAIO 176 VSSAIO

GPIOF6-CANTXA GPIOF7-CANRXA VSS2 VSS3 VSS4 VSS5 VSS6 VSS7 VSS8 VSS9 VSS10 VSS11 VSS12 VSS13 VSS14 VSS15 VSS16 GPIOF14-XF-XPLLDISn

A

19 32 38 52 58 70 78 86 99 105 113 120 129 142 153

3.3V

L3

162 VDD1 163 VSS1

( 3.3V )
BLM21P221SN C3 1uF C57 .1uF C38 .1uF

VDDA1 C37 .001uF

TMS320F2812PGF

A

DSP
Title TMS320F2812 EzDSP Size B Date: Document Number 506262 Thursday, February 13, 2003 Sheet
1

LOCATE NEAR DSP

Rev C 2 of 6

5

4

3

2

5

4

3

2

1

D

D

XA[0..18]
C

XD[0..15]

C

3.3V

ASRAM
11 33 U4 XD0 XD1 XD2 XD3 XD4 XD5 XD6 XD7 XD8 XD9 XD10 XD11 XD12 XD13 XD14 XD15 VDD1 VDD2

3.3V C22 0.1uF 7 8 9 10 13 14 15 16 29 30 31 32 35 36 37 38 C10 0.1uF

B

XA0 XA1 XA2 XA3 XA4 XA5 XA6 XA7 XA8 XA9 XA10 XA11 XA12 XA13 XA14 XA15 XA16 XA17 XZCS6AND7n XWEn XRDn

1 2 3 4 5 18 19 20 21 24 25 26 27 42 43 44 22 23 6 17 41 40 39

A0 A1 A2 A3 A4 A5 A6 A7 A8 A11 A12 A13 A14 A15 A16 A17 A9 A10 CS WE OE

D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15

B

NC

28

64Kx16 and 256Kx16 Compatible

A

12 34

IS61LV6416-12T

VSS1 VSS2

BHE BLE

A

Title TMS320F2812 EzDSP GND Size B Date:
5 4 3 2

Document Number 506262 Thursday, February 13, 2003 Sheet
1

Rev B 3 of 6

8

7

6

5

4

3

2

1

JP5 3.3V B 3 C A 1 JUMPER3_SMT 2 +5V

B

Make a solder connection on JP4 and/or JP5 to the appropriate power supply.

3.3V 3

JP4 +5V C A 1 JUMPER3_SMT 2

P2 XD0 XD2 XD4 XD6 XD8 XD10 XD12 XD14 XA0 XA2 XA4 XA6 XA8 XA10 XA12 XA14 XZCS0AND1n XREADY XRnW XWEn 3.3V DSP_RSn DSP_RSn
C

D

XA16 XA18 XHOLDAn

1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59

2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60

P8 XD1 XD3 XD5 XD7 XD9 XD11 XD13 XD15 XA1 XA3 XA5 XA7 XA9 XA11 XA13 XA15 ISn STRBn XZCS2n XRDn XNMIn_XINT3 SCITXDA XINT1n_XBIOn CAP2_QEP2 PWM1 PWM3 PWM5 T1PWM_T1CMP TDIRA 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 SCIRXDA CAP1_QEP1 CAP3_QEPI1 PWM2 PWM4 PWM6 T2PWM_T2CMP TCLKINA

SPISIMOA SPICLKA CANTXA XCLKOUT PWM8 PWM10 PWM12 T1CTRIP_PDPINTAn

XINT1n_XBIOn SPISOMIA SPISTEA CANRXA PWM7 PWM9 PWM11 CAP4_QEP3 T3CTRIP_PDPINTBn

TMS320F2812 supports 3.3V input/output levels which are NOT 5V tolerant. Connecting the eZdsp to a system with 5V input/output levels will damage the TMS320F2812. If the eZdsp is connected to another target then the eZdsp must be powered up first and powered down last to prevent latchup conditions.

XF_XPLLDISn
PLLDISn

3.3V

R42 R41

10K 2.2K

1 3

JP9 2

3.3V DS2 LTST-C150GKT GREEN C62 .1uF 5

D

JUMPER3B 3.3V U12

R43 SN74AHC1G14 4 220 XF

2
XF

3.3V
XTESTSEL

3

XTESTSEL XA17 XHOLDn XINT2n_ADCSOC MCLKXA MCLKRA MFSXA MFSRA MDXA MDRA ADCINA0 ADCINA1 ADCINA2 ADCINA3 ADCINA4 ADCINA5 ADCINA6 ADCINA7 VREFLO CAP5_QEP4 CAP6_QEPI2 T3PWM_T3CMP T4PWM_T4CMP TDIRB TCLKINB XF_XPLLDISn SCITXDB SCIRXDB P4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 P7 1 2 3 4 5 6 7 8 9 10 C1TRIPn C2TRIPn C3TRIPn T2CTRIPn_EVASOCn C4TRIPn C5TRIPn C6TRIPn T4TRIPn_EVBSOCn 1 3 JUMPER3B R39 R36 10K 2.2K 1 3 JUMPER3B
BOOT MODE
C

JP1 XMPNMC 2

XMP_MCn

HEADER 30X2

JP12 2

BOOT-0

SPICLKA

P9 1 3 5 7 9 11 13 15 17 19 2 4 6 8 10 12 14 16 18 20

R38 R35

10K 2.2K

1 3

JP11 2

BOOT-1

SPISTEA

JUMPER3B R40 R37 10K 2.2K 1 3 JUMPER3B JP8 2
BOOT-2

MDXA

B

P5 1 2 3 4 5 6 7 8 9 10 ADCINB0 ADCINB1 ADCINB2 ADCINB3 ADCINB4 ADCINB5 ADCINB6 ADCINB7 ADCREFM ADCREFP

Connect VREFLO to AGND or to VREFLO of target system for proper ADC operation.

B

R31 R30 L1 3.3V

10K 2.2K

1 3

JP7 2

BOOT-3

SCITXDA

JUMPER3B

1.8V BLM21P221SN C43 U14 5 0.1uF U11 8 2 JP3 C 3 100 C42 33 pF
SMT/4PIN DIP

BOOT-3 SCITXDA

BOOT-2 MDXA

BOOT-1 SPISTEA

BOOT-0 SPICLKA

MODE

1 0

X 1 0 0 0 0

X X 1 1 0 0

X X 1 0 1 0

FLASH SPI SCI H0 OTP PARALLEL
A

Tie off unused F24xx compatible signals.
R6 ISn 10K
A

R1 X1_CLKIN 4 100

SN74LVC1G14 2 R29 5 1

VCC CLK

OFFn GND

1 4

0 0 0 0

3.3V R5

3

A

JUMPER3_SMT

B

NO-POP

STRBn 10K GND GND

Schematic change from version A/B to C. F2812 clkin is 1.8V input.
MCLK AGND

OPTIONAL
Title TMS320F2812 EzDSP Size B Document Number 506262
2 Thursday, February 13, 2003

Rev C Sheet 4
1

8

7

6

5

4

3

Date:

of

6

5

4

3

2

1

R16 U5 XPPD7 XPPD6 XPPD5 XPPD4 XPPD3 XPPD2 XPPD1 XPPD0 RN4A RN4B RN4C RN4D RN4E RN4F RN4G RN4H 1 2 3 4 5 6 7 8 A A A A A A A A B B B B B B B B 16 15 14 13 12 11 10 9 33 33 33 33 33 33 33 33 PPBUSENn PPBUSDIR 2 3 4 5 6 7 8 9 19 1 A1 A2 A3 A4 A5 A6 A7 A8 G DIR B1 B2 B3 B4 B5 B6 B7 B8 VCC GND
D

18 17 16 15 14 13 12 11 20 10

RN3A RN3B RN3C RN3D RN3E RN3F RN3G RN3H 5V C50

1 2 3 4 5 6 7 8

A A A A A A A A

B B B B B B B B

16 15 14 13 12 11 10 9

33 33 33 33 33 33 33 33

C52 33pf C54 33pf C33 C53 33pf

R14 R13

10K 10K 10K

C55 33pf C32 33pf C29 33pf P3 DB25_SHIELD PPSLCT PPPE PPBSY PPACKn PPD7 PPD6 13 25 12 24 11 23 10 22 9 21 8 20 7 19 6 18 5 17 4 16 3 15 2 14 1 A PPTRSTn P1 PPTMS PPTDI 5V PPTDO PPTCK PPEMU0 1 3 5 7 9 11 13 2 4 6 8 10 12 14 3.3V R17 10K EMUOFF
D

C51 .001uF

33pf C31 33pf

.1uF 74ABT245PW U2 XPPS4 XPPS5 XPPS7n XPPS3 2 3 4 5 6 7 8 9 5V 19 1 A1 A2 A3 A4 A5 A6 A7 A8 G DIR B1 B2 B3 B4 B5 B6 B7 B8 VCC GND 74ABT245PW 18 17 16 15 14 13 12 11 20 10

RN1A RN1B RN1C RN1D RN1E RN1F RN1G RN1H 5V C27

1 2 3 4 5 6 7 8

A A A A A A A A

B B B B B B B B

16 33 15 33 14 33 13 33 12 33 11 33 10 33 9 33

HEADER 7X2 PPEMU1 XDS510PP EMULATION HEADER

C28 PPD5 .001uF PPD4 PPD3 PPSELn PPD2 PPINITn PPD1 PPERRn PPD0 PPALEn PPSTRBn

.1uF

PPEMU0/1 CONNECT DIRECTLY TO F2812 FOR EMULATOR WAIT-IN-RESE T SUPPORT

XPPC3n XPPC2 XPPC1n XPPC0n

PONRSnIN B XTRSTn PLACE NEAR EACH MOUNTING HOLE 3.3V XTDO R19 R47 C16 1M .001uF 1M C67 .001uF R11 R12 10K 10K R22 10K TPOWLOSSn XTCK XEVNT0 XEVNT1 XTMS XTDI

PONRSnIN C28_TRSTn C28_TMS C28_TDO C28_TDI C28_TCK
C

CROSS COUPLE IN T O OUT

C

C28_EMU0 C28_EMU1

R20 100 R25 100 R24 100 R15 R8 R10 R9 33 33 33 XTCK PPTCK PPTDO R18 100 100 C34 33pf C30 33pf C15 33pf C17 33pf 3.3V

100 XEVNT0 99 98 XTRSTn 97 PPTRSTn 96 IPPTCK 95 XTDI 94 93 IPPTDO 92 GND 91 FPGA_VCCA 90 VCCR 89 XTCKI 88 GND 87 JCLK 86 XTMS 85 PPTMS 84 XTDO 83 3.3V 82 PPTDI 81 80 79 78 77 EMUOFF 76

C14 0.1uF

C25 0.1uF

C26 0.1uF

C49 0.1uF

Locate R7,R54, C70 at the DSP XRSn pin for best EMI/ESD noise immunity. 3.3V 3.3V U6 XRSn is logical AND of PONRSnIN and emulator controlled reset. Power on default is PONRnIN controls XRSn. R54 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 DSP_RSn GND GND 3.3V GND GND FPGA_VCCA C70 22nF
OPEN-DRAIN

R49 0 U13 1 2 IN GND EN NC/FB 4 41.2K 1% OUT 5 FPGA_VCCA R50 C45 0.1uF C23 0.1uF C24 0.1uF C11 0.1uF C68 1uF

RSV13_TCK_IO XEVNT0 PPEMU0 XTRSTn PPTRSTn PPTCK XTDI PPTDO RSV11_PRA_IO GND VCCA VCCR_NC XTCKI RSV10 JCLK XTMS PPTMS XTDO VCCI PPTDI ODEMU0n ODEMU1n ODEMU0_SRC ODEMU1_SRC EMUOFF_1

R7 1.5K 100

B

B

GND 3.3V R23 10K 3.3V GND XPPD0 XPPD1 XPPD2 XPPD3 XPPD4 XPPD5 XPPD6 XPPD7 3.3V XPPS3 XPPS4 XPPS5 XPPS7n 3.3V XEVNT1

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

PPBUSENn RSV6 PPBUSDIR RSV7 XPPC3n XPPC2 XPPC1n XPPC0n RSV8_PRB_IO VCCA GND VCCR_NC ALT_MCLK HCLK RSV9 PONRSn TPOWLOSSn VFUNC_EN VCCI EXT_VER7 EXT_VER6 EXT_VER5 EXT_VER4 EXT_VER3 EXT_VER2

GND RSV1_TDI_IO EMUOFF XEVNT1 PPEMU1 RSV2 RSV3_TMS_IO VCCI GND XPPD0 XPPD1 XPPD2 XPPD3 XPPD4 XPPD5 XPPD6 XPPD7 RSV4 RSV5 VCCI XPPS3 XPPS4 XPPS5 XPPS6 XPPS7n

SPECTRUM DIGITAL INC. EMBEDDED PP JTAG CONTROLLER 506053-0001B
EXT_VER 0011 0-001

DSP_RSn MCLKOUT MCLKOUTEN MCLKOUT2 MCLKOUT2EN EXTERN_RSTn GND GND VCCA XBITOUT0 XBITOUT1 XBITOUT2 XBITOUT3 XBITIN0 XBITIN1 XBITIN2 XBITIN3 VCCI VCCA VBUS_ENn VPOWER_BLEED VPOWER_ONn EXT_VER0 EXT_VER1 GND

XRSn IF U13 IS INSTAL LED THEN REMOVE R49 AN D R48.

3

TPS72201

R51 DSP_RSn To/from expansio n header +5V 40.2K 1%

GND GND GND GND 3.3V FPGA_VCCA

R48 VCCR 0 C47 0.1uF C13 0.1uF

3.3V GND GND

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

L2 506053-0001B

3.3V

FPGA_VCCA GND VCCR ALT_MCLK MCLK

PPBUSENn

A

PONRSnIN TPOWLOSSn GND 3.3V GND GND 3.3V 3.3V GND GND

PPBUSDIR

XPPC3n XPPC2 XPPC1n XPPC0n

BLM21P221SN C48 0.1uF 5V 3.3V GND 1 4 Title TMS320F2812 EzDSP C46 30 MHz Size C Date:
3 2

A

+5V 3.3V

U10 8 R32 MCLK 5 33 CLK GND VCC OFFn

GND

NO-POP CBLV-3C-30 .000
5 4

Document Number 506262 Thursday, February 13, 2003
1

Rev C Sheet 5 of 6

5

4

3

2

1

+5V P6 5 6 C66 +5V Max R44 220 + CT2 47uF 1.8VONn 0.1uF 3
D

U9 1IN 1IN 1EN 1GND 22 1RESET 1OUT 1OUT 1FB/SENSE 28 23 24 25

18.2K 1.899V 16.9K 1.848V 15.0K 1.773V 13.7K 1.722V

4

1.8V R33 16.9K, 1% R45 30.1K, 1% 3.3V C64 + CT3 22uF 0.1uF
D

DS1 LTST-C150GKT GREEN

11 12 C65 10 0.1uF R46 10K 3.3V 9 1 2 7 8 13 14 D Q3 BSS138

2IN 2IN 2EN 2GND THERMAL_PAD NC NC NC NC NC NC TPS767D301

2RESET 2OUT 2OUT 2SENSE

17 18 19 C63 + CT4 22uF 0.1uF R52 0 3.3V C1 1uF C7 .1uF VDD3VFL

U16 1 2 CT VDD GND RESETn 3
C

R53 5 1.5K 1% 4 R34 2.0K 1% G S

NC NC NC NC NC NC

15 16 20 21 26 27

R2 10K TIE TPS767D301 POWER PAD TO GND PLANE (TI-SLMA002) PONRSnIN
C

MRn TPS3838K33DBV

RESETn of TPS3838 is open-drain. U16 was added for testing but not populated on production boards.

1.8V + +

CT6 22uF

CT5 22uF

C19 0.1uF

C18 0.1uF

C5 0.1uF

C8 0.1uF

C21 0.1uF

C41 0.1uF

C40 0.1uF

C61 0.1uF

C59 0.1uF

3.3V
B B

+

CT1 22uF

C20 0.1uF

C6 0.1uF

C9 0.1uF

C39 0.1uF

C60 0.1uF 1 TP1 GND GND

POWER ON SEQUENCE NOTES 3.3V THEN 1.8V PONRSnIN, GOES HIGH > 200ms AFTER ALL POWER IS STABLE. SET Q3 TO TURN ON WHEN 3.3V SUPPLY IS GREATER THEN 2.2 VOLTS. REGULATOR TURN ON DELAY AND RAMP RATE WILL ENSURE THAT 3.3V SUPPLY IS AT 2.5 VOLTS OR HIGHER BEFORE THE 1.8V SUPPLY REACHES 0.3 VOLTS. U16 WILL TURN OFF THE 1.8V SUPPLY WHEN INPUT POWER FALLS BELOW 2.94V. THIS SPEEDS UP THE 1.8V SUPPLY TURN OFF. PONRSnIN 3.3V SUPPLY, VDDIO VDD3VFL, VDDA1,VDDA2 2.2V Q3

TPS767D301 RATINGS MAX Iout PER CHANNEL IS 1A TPS767D301 PD = (Vin-Vout)*Iout VOLTAGE SUPPLY 1.8V SUPPLY 1.8V 3.3V 140ms-280ms PD(max) = (Tj(max) - Ta)/Rja Title = (125 - 35)/27.9 = 3255mW Size B Date:
2

MAX CURRENT 333mA 307mA

TPS767D301 PD 1065mW 521mW 1586mW Total
A

A

TMS320F2812 EzDSP Document Number 506262 Thursday, February 13, 2003 Sheet
1

Rev C 6 of 6

5

4

3

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 C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 D1 IC1 IC2 IC3 IC4 IC5 IC6 IC7 IC8 IC9 IC10 IC11 IC12 JP1 JP2 JP3 JP4 JP5 JP6 JP7 JP8 P2 P4 P5 P7 P8 P9 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 Value 100n 10 µ 1µ 1µ 100n 100n 100n 100n 100n 100n 100n LED8 Device C-SMD1206 ELKO-SMDC ELKO-SMDA ELKO-SMDA C-SMD1206 C-SMD1206 C-SMD1206 C-SMD1206 C-SMD1206 C-SMD1206 C-SMD1206 LED8 2937IMP-3,3 TLV2462 TLV2462ID SN74LVT244BDW SN74LVT244BDW MAX232 MAX232 TLV5617A TLV5617A M95080 M95080 DS1621 DS1621 SN65HVD230D SN65HVD230D 74LCX14 74LCX14 TJA1054A TJA1054A LD1117S33C TLV2462 TLV2462ID JP2E JP2E JP1E JP2E JP2E JP2E JP1E JP1E FE30-2FE30-2MIR FE20-1FE20R FE10-1FE10R FE10-1FE10R FE20-2FE20-2MIR FE10-2FE10-2MIR 10k TRIM_EU-RS3 10k TRIM_EU-RS3 1k R-EU_R1206 1k R-EU_R1206 150 R-EU_R1206 150 R-EU_R1206 100k R-EU_R1206 2,2k R-EU_R1206 100k R-EU_R1206 2,2k R-EU_R1206 Package Description C1206 SMD-Capacitor CT6032-C Tantal-SMD-Elko CT3216-A Tantal-SMD-Elko CT3216-A Tantal-SMD-Elko C1206 SMD-Capacitor C1206 SMD-Capacitor C1206 SMD-Capacitor C1206 SMD-Capacitor C1206 SMD-Capacitor C1206 SMD-Capacitor C1206 SMD-Capacitor LZR188 ZAQS0807 SOT223 Voltage Regulator 3,3V SO08 Dual OPAMP SOIC20 8x LED driver SO16 Transceiver RS 2312 SO08 Dual 10-Bit-DAC SO08 serial EEPROM SO08 temperature sensor SO08 CAN-High-speed SO14 Schmitt- Trigger CAN-H SO14 CAN – Low speed SOT223 Voltage Regulator 3.3V SO08 Dual OPAMP JP2 JUMPER JP2 JUMPER JP1 JUMPER JP2 JUMPER JP2 JUMPER JP2 JUMPER JP1 JUMPER JP1 JUMPER FE30-2MIR FEMALE HEADER FE20-ROUND FEMALE HEADER FE10-ROUND FEMALE HEADER FE10-ROUND FEMALE HEADER FE20-2MIR FEMALE HEADER FE10-2MIR FEMALE HEADER RS3 POTENTIOMETER RS3 POTENTIOMETER R1206 RESISTOR R1206 RESISTOR R1206 RESISTOR R1206 RESISTOR R1206 RESISTOR R1206 RESISTOR R1206 RESISTOR R1206 RESISTOR

R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 RN1 RN2 RN3 RN4 S1 S2 S3 SP1 U$1 V1 X1 X2 X3

4,7k 10k 10k 47k 4,7k 1k 22 100 100 120 4,7k 1,2k 4,7k 520 520 82 100k 2,2k 100K

F/PMW04A SMD-SO20 BC849 RS232 CAN-H CAN-L

R-EU_R1206 R-EU_R1206 R-EU_R1206 R-EU_R1206 R-EU_R1206 R-EU_R1206 R-EU_R1206 R-EU_M1206 R-EU_M1206 R-EU_R1206 R-EU_M1206 R-EU_M1206 R-EU_M1206 R-EU_M1206 R-EU_M1206 G08R G08R G08R G08R BUTTON BUTTON DS08 F/PMX04 SMD-SO20 BC849SMD F09HP M09HP MDSSV-BC04

R1206 R1206 R1206 R1206 R1206 R1206 R1206 M1206 M1206 R1206 M1206 M1206 M1206 M1206 M1206 SIL9 SIL9 SIL9 SIL9 TA TA DS-08 F/PMX04A SO20 SOT23-BEC F09HP M09HP SSV-BC04

RESISTOR RESISTOR RESISTOR RESISTOR RESISTOR RESISTOR RESISTOR RESISTOR RESISTOR RESISTOR RESISTOR RESISTOR RESISTOR RESISTOR RESISTOR SIL RESISTOR SIL RESISTOR SIL RESISTOR SIL RESISTOR DIL/CODE SWITCH SPEAKER NPN Transistor SUB-D SUB-D YAMAICHICONNECTOR

7 Phụ Lục C

40

7

Phụ Lục C
File định nghĩa lcd.h

Chương trình giao tiếp với LCD, thông qua giao tiếp 4bit.

#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 #define lcd_en_clr ( ) GpioDataRegs .GPACLEAR. a l l |= LCD_EN #define lcd_rs_data ( ) GpioDataRegs .GPASET. a l l |= LCD_RS #define l c d _ r s _ i n s ( ) GpioDataRegs .GPACLEAR. a l l |= LCD_RS /* 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 ) // #define lcd_cursor_home ( ) l c d _ w r i t e _ c o n t r o l ( 0 x02 ) // #define lcd_display_on ( ) l c d _ w r i t e _ c o n t r o l ( 0 x0E ) // #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 ) // #define lcd_display_blink_on ( ) l c d _ w r i t e _ c o n t r o l ( 0 x0F ) #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 ) #define lcd_cursor_on ( ) l c d _ w r i t e _ c o n t r o l ( 0 x0E ) // #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 ) // #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 ) // #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 ) // #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 ) // #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 ) //

// // // //

EN EN RS RS

= = = =

1 0 1 0

( Enable ) ( Disable ) ( Select Instructio ( S e l e c t Data mode )

Clear Display S e t Cursor = 0 LCD D i s p l a y Enable LCD D i s p l a y D i s a b l e // S e t Cursor = B l i n k // S e t Cursor = B l i n k Enable LCD Cursor D i s a b l e LCD Cursor S h i f t L e f t Cursor S h i f t R i g h t Cursor S h i f t Left Display 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 ) ; 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 ) ; l c d _ w r i t e _ c o n t r o l ( 0 x0E ) ; l c d _ w r i t e _ c o n t r o l ( 0 x01 ) ; 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 ; // Function S e t (8 b i t ) // Function S e t (DL=1 4−Bit ,N=1 2 Line , F=0 5X7) // D i s p l a y on C o n t r o l ( Cursor on , Cursor not B l i n k ) // Entry Mode S e t ( I /D=1 Increment , S=0 Cursor S h i f t )

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 −−;} } void delay_4ms ( void ) { unsigned long i= 1 0 0 0 0 0 ; while ( i −− ) ; }

// Loop Decrease Counter