Mục lục:

LẮP RÁP QUÂN ĐỘI GPIO - T.I. BỘ DỤNG CỤ HỌC TẬP HỆ THỐNG ROBOTICS - LAB 6: 3 Bước
LẮP RÁP QUÂN ĐỘI GPIO - T.I. BỘ DỤNG CỤ HỌC TẬP HỆ THỐNG ROBOTICS - LAB 6: 3 Bước

Video: LẮP RÁP QUÂN ĐỘI GPIO - T.I. BỘ DỤNG CỤ HỌC TẬP HỆ THỐNG ROBOTICS - LAB 6: 3 Bước

Video: LẮP RÁP QUÂN ĐỘI GPIO - T.I. BỘ DỤNG CỤ HỌC TẬP HỆ THỐNG ROBOTICS - LAB 6: 3 Bước
Video: Học lập trình Arduino KHÔNG HỀ KHÓ - Bộ KIT học tập Arduino Uno R3 BLK 2024, Tháng bảy
Anonim
LẮP RÁP QUÂN ĐỘI GPIO - T. I. BỘ DỤNG CỤ HỌC TẬP HỆ THỐNG ROBOTICS - LAB 6
LẮP RÁP QUÂN ĐỘI GPIO - T. I. BỘ DỤNG CỤ HỌC TẬP HỆ THỐNG ROBOTICS - LAB 6

Xin chào, Trong một tài liệu có thể hướng dẫn trước đây về cách học lắp ráp ARM bằng Texas Instruments TI-RSLK (sử dụng vi điều khiển MSP432), hay còn gọi là Lab 3 nếu bạn đang thực hiện T. I. khóa học, chúng ta đã xem qua một số hướng dẫn rất cơ bản như ghi vào thanh ghi và lặp có điều kiện. Chúng tôi đã thực hiện từng bước bằng cách sử dụng IDE Eclipse.

Các chương trình dành cho tuổi teen mà chúng tôi thực hiện không làm gì để tương tác với thế giới bên ngoài.

Nhàm chán.

Hôm nay chúng ta hãy thử thay đổi điều đó một chút bằng cách tìm hiểu một chút về các cổng đầu vào / đầu ra, cụ thể là các chân GPIO kỹ thuật số.

Điều xảy ra là MSP432 này đi kèm với một bảng phát triển đã có hai công tắc nút nhấn, một đèn LED RGB và một đèn LED màu đỏ, tất cả đều được gắn với một số cổng GPIO.

Điều này có nghĩa là khi chúng ta học cách thiết lập và thao tác các chân này thông qua lắp ráp, chúng ta có thể thấy những hiệu ứng đó một cách trực quan.

Thú vị hơn nhiều so với việc chỉ lướt qua trình gỡ lỗi.

(Chúng tôi vẫn đang tiếp tục - đây sẽ là chức năng 'trì hoãn' của chúng tôi):-D

Bước 1: Hãy thử ghi / đọc từ RAM

Trước khi chuyển sang truy cập và kiểm soát GPIO, chúng ta nên thực hiện một bước nhỏ.

Hãy bắt đầu bằng cách chỉ đọc và ghi vào một địa chỉ bộ nhớ chuẩn. Chúng tôi biết từ Hướng dẫn trước (xem hình ảnh ở đó) rằng RAM bắt đầu từ 0x2000 0000, vì vậy hãy sử dụng địa chỉ đó.

Chúng ta sẽ di chuyển dữ liệu giữa thanh ghi lõi (R0) và 0x2000 0000.

Chúng ta bắt đầu với cấu trúc tệp cơ bản hoặc nội dung của một chương trình hợp ngữ. Vui lòng tham khảo Có thể hướng dẫn này để tạo một dự án lắp ráp bằng Code Composer Studio (CCS) của TI và một số dự án mẫu.

.thumb

.text.align 2.global main.thumbfunc main main:.asmfunc; ---------------------------------- -----------------------------------------------; (mã của chúng tôi sẽ ở đây); ------------------------------------------ ---------------------------------------.endasmfunc.end

Tôi muốn thêm một cái gì đó mới vào phần trên cùng, đã có một số khai báo (chỉ thị). Nó sẽ trở nên rõ ràng hơn sau này.

ACONST. Bộ 0x20000000; chúng tôi sẽ sử dụng điều này hơn nữa (nó là một hằng số)

; rõ ràng, '0x' biểu thị những gì sau đây là một giá trị hex.

Vì vậy, nội dung tệp bắt đầu của chúng tôi bây giờ trông giống như sau:

.thumb

.text.align 2 ACONST.set 0x20000000; chúng tôi sẽ sử dụng điều này tiếp tục xuống (nó là một hằng số); rõ ràng, '0x' biểu thị những gì sau đây là một giá trị hex..global main.thumbfunc main main:.asmfunc; --------------------------------------- ------------------------------------------; (mã của chúng tôi sẽ ở đây); ------------------------------------------ ---------------------------------------.endasmfunc.end

Bây giờ chúng ta đã có những điều trên, hãy thêm mã vào giữa các đường đứt nét.

Chúng tôi bắt đầu với việc ghi vào một vị trí RAM. Đầu tiên, chúng ta sẽ thiết lập mẫu dữ liệu, một giá trị, mà chúng ta sẽ ghi vào RAM. Chúng tôi sử dụng một thanh ghi cốt lõi để thiết lập giá trị hoặc dữ liệu đó.

Lưu ý: hãy nhớ rằng trong mã, bất kỳ dòng nào có dấu chấm phẩy (';') có nghĩa là tất cả đều là nhận xét sau dấu chấm phẩy đó.

;-----------------------------------------------------------------------------------------------

; VIẾT;------------------------------------------------ ----------------------------------------------- MOV R0, # 0x55; thanh ghi lõi R0 sẽ chứa dữ liệu mà chúng ta muốn ghi vào vị trí RAM.; rõ ràng, '0x' biểu thị những gì sau đây là một giá trị hex.

Tiếp theo, chúng ta hãy xem xét các câu lệnh mà DONT hoạt động.

; MOV MOV không thể sử dụng để ghi dữ liệu vào vị trí RAM.

; MOV chỉ dành cho dữ liệu ngay lập tức vào thanh ghi,; hoặc từ sổ đăng ký này sang sổ đăng ký khác; tức là MOV R1, R0.; STR phải sử dụng STR.; STR R0, = ACONST; Thuật ngữ xấu trong biểu thức ('='); STR R0, 0x20000000; Chế độ địa chỉ bất hợp pháp cho hướng dẫn cửa hàng; STR R0, CHÍNH XÁC; Chế độ địa chỉ bất hợp pháp cho hướng dẫn cửa hàng

Không giải thích quá nhiều, chúng tôi đã cố gắng sử dụng 'ACONST' ở trên. Về cơ bản, nó là một giá trị đứng hoặc hằng số thay vì sử dụng một giá trị theo nghĩa đen như 0x20000000.

Chúng tôi không thể ghi để ghi vào vị trí RAM bằng cách sử dụng ở trên. Hãy thử một cái gì đó khác.

; Có vẻ như chúng ta phải sử dụng một thanh ghi khác có chứa vị trí RAM trong

; để lưu vào vị trí RAM đó MOV R1, # 0x20000000; đặt vị trí RAM (không phải nội dung của nó mà là vị trí) vào R1.; rõ ràng, '0x' biểu thị những gì sau đây là một giá trị hex. STR R0, [R1]; ghi những gì trong R0 (0x55) vào RAM (0x20000000) bằng cách sử dụng R1.; chúng tôi sử dụng một thanh ghi khác (R1) có địa chỉ vị trí RAM; để ghi vào vị trí RAM đó.

Một cách khác để thực hiện điều trên, nhưng sử dụng 'ACONST' thay vì giá trị địa chỉ theo nghĩa đen:

; chúng ta hãy làm lại điều trên, nhưng hãy sử dụng một biểu tượng thay vì một giá trị vị trí RAM theo nghĩa đen.

; chúng tôi muốn sử dụng 'ACONST' làm dự phòng cho 0x20000000.; chúng ta vẫn phải thực hiện dấu '#' để biểu thị một giá trị tức thì,; vì vậy (xem ở trên cùng), chúng tôi phải sử dụng chỉ thị '.set'.; Để chứng minh điều này, hãy thay đổi mẫu dữ liệu trong R0. MOV R0, # 0xAA; được rồi, chúng tôi đã sẵn sàng ghi vào RAM bằng ký hiệu thay vì giá trị địa chỉ theo nghĩa đen MOV R1, #ACONST STR R0, [R1]

Video đi vào một số chi tiết hơn, cũng như hướng dẫn đọc từ vị trí bộ nhớ.

Bạn cũng có thể xem tệp.asm nguồn đính kèm.

Bước 2: Một số thông tin cơ bản về cổng

Image
Image
Một số thông tin cơ bản về cổng
Một số thông tin cơ bản về cổng
Một số thông tin cơ bản về cổng
Một số thông tin cơ bản về cổng

Bây giờ chúng ta đã có một ý tưởng tốt về cách ghi vào / đọc từ vị trí RAM, điều này sẽ giúp chúng ta hiểu rõ hơn về cách điều khiển và sử dụng chân GPIO

Vậy làm thế nào để chúng ta tương tác với các chân GPIO? Từ cái nhìn trước đó của chúng tôi về bộ vi điều khiển này và các lệnh ARM của nó, chúng tôi biết cách xử lý các thanh ghi bên trong của nó và chúng tôi biết cách tương tác với các địa chỉ bộ nhớ (RAM). Nhưng chân GPIO?

Điều đó xảy ra là các chân đó được ánh xạ bộ nhớ, vì vậy chúng ta có thể coi chúng giống như địa chỉ bộ nhớ.

Điều này có nghĩa là chúng ta cần biết những địa chỉ đó là gì.

Dưới đây là các địa chỉ bắt đầu cổng. Nhân tiện, đối với MSP432, "cổng" là một tập hợp các chân chứ không chỉ một chân. Nếu bạn đã quen với Raspberry Pi, tôi tin rằng điều đó khác với tình huống ở đây.

Các vòng tròn màu xanh trong hình trên hiển thị chữ viết trên bảng cho hai công tắc và đèn LED. Các đường màu xanh lam trỏ đến các đèn LED thực tế. Chúng tôi sẽ không phải chạm vào jumper tiêu đề.

Tôi đã in đậm các cổng mà chúng tôi quan tâm dưới đây.

  • GPIO P1: 0x4000 4C00 + 0 (địa chỉ chẵn)
  • GPIO P2: 0x4000 4C00 + 1 (địa chỉ lẻ)
  • GPIO P3: 0x4000 4C00 + 20 (địa chỉ chẵn)
  • GPIO P4: 0x4000 4C00 + 21 (địa chỉ lẻ)
  • GPIO P5: 0x4000 4C00 + 40 (địa chỉ chẵn)
  • GPIO P6: 0x4000 4C00 + 41 (địa chỉ lẻ)
  • GPIO P7: 0x4000 4C00 + 60 (địa chỉ chẵn)
  • GPIO P8: 0x4000 4C00 + 61 (địa chỉ lẻ)
  • GPIO P9: 0x4000 4C00 + 80 (địa chỉ chẵn)
  • GPIO P10: 0x4000 4C00 + 81 (địa chỉ lẻ)

Chúng tôi vẫn chưa hoàn thành. Chúng tôi cần thêm thông tin.

Để kiểm soát một cổng, chúng ta cần một số địa chỉ. Đó là lý do tại sao trong danh sách trên, chúng ta thấy "địa chỉ chẵn" hoặc "địa chỉ lẻ".

Các khối địa chỉ đăng ký I / O

Chúng tôi sẽ cần các địa chỉ khác, chẳng hạn như:

  • Địa chỉ thanh ghi đầu vào cổng 1 = 0x40004C00
  • Địa chỉ thanh ghi đầu ra cổng 1 = 0x40004C02
  • Địa chỉ thanh ghi hướng cổng 1 = 0x40004C04
  • Cổng 1 Chọn 0 Địa chỉ đăng ký = 0x40004C0A
  • Cổng 1 Chọn 1 Địa chỉ đăng ký = 0x40004C0C

Và chúng ta có thể cần những người khác.

Ok, bây giờ chúng ta đã biết phạm vi địa chỉ thanh ghi GPIO để điều khiển đèn LED đơn màu đỏ.

Một lưu ý rất quan trọng: Mỗi Cổng I / O trên bo mạch MSP432 LaunchPad là một tập hợp của một số chân hoặc đường (thường là 8) và mỗi chân có thể được đặt riêng làm đầu vào hoặc đầu ra.

Điều này có nghĩa là, ví dụ, nếu bạn đang đặt giá trị cho "Địa chỉ thanh ghi hướng cổng 1", bạn cần quan tâm đến bit (hoặc các bit) mà bạn đang thiết lập hoặc thay đổi tại địa chỉ đó. Thêm về điều này sau.

Trình tự lập trình cổng GPIO

Phần cuối cùng mà chúng ta cần, là một quy trình hoặc thuật toán để sử dụng, để điều khiển đèn LED.

Khởi tạo một lần:

  • Định cấu hình P1.0 (P1SEL1REG: Thanh ghi P1SEL0REG) <--- 0x00, 0x00 cho chức năng GPIO thông thường.
  • Đặt bit thanh ghi hướng 1 của P1DIRREG làm đầu ra, hoặc CAO.

Vòng:

Ghi CAO đến bit 0 của thanh ghi P1OUTREG để bật đèn LED Đỏ

  • Gọi hàm trì hoãn
  • Ghi LOW đến bit 0 của thanh ghi P1OUTREG để tắt đèn LED Đỏ
  • Gọi hàm trì hoãn
  • Lặp lại vòng lặp

Chức năng đầu vào / đầu ra nào (Cấu hình SEL0 và SEL1)

Nhiều chân cắm trên LaunchPad có nhiều mục đích sử dụng. Ví dụ, cùng một chân có thể là GPIO kỹ thuật số tiêu chuẩn, hoặc nó cũng có thể được sử dụng trong giao tiếp nối tiếp UART hoặc I2C.

Để sử dụng bất kỳ chức năng cụ thể nào cho mã pin đó, bạn cần chọn chức năng đó. Bạn cần phải cấu hình chức năng của pin.

Có một hình ảnh ở trên cho bước này cố gắng giải thích khái niệm này dưới dạng trực quan.

Địa chỉ SEL0 và SEL1 tạo thành một tổ hợp cặp hoạt động như một số loại lựa chọn chức năng / tính năng.

Đối với mục đích của chúng tôi, chúng tôi muốn GPIO kỹ thuật số tiêu chuẩn cho bit 0. Điều đó có nghĩa là chúng tôi cần bit 0 cho SEL0 và SEL1 là THẤP.

Trình tự lập trình cổng (Một lần nữa)

1. Ghi 0x00 vào thanh ghi P1 SEL 0 (địa chỉ 0x40004C0A). Điều này đặt LOW cho bit 0

2. Ghi 0x00 vào thanh ghi P1 SEL 1 (địa chỉ 0x40004C0C). Điều này đặt LOW cho bit 0, cài đặt cho GPIO.

3. Ghi 0x01 vào P1 DIR Register (địa chỉ 0x40004C04). Điều này đặt CAO cho bit 0, nghĩa là OUTPUT.

4. Bật đèn LED bằng cách ghi một thanh ghi OUTPUT 0x01 đến P1 (địa chỉ 0x40004C02)

5. Thực hiện một số loại trì hoãn (hoặc chỉ thực hiện một bước trong khi gỡ lỗi)

6. Tắt đèn LED bằng cách ghi thanh ghi OUTPUT 0x00 đến P1 (địa chỉ 0x40004C02)

7. Thực hiện một số loại trì hoãn (hoặc chỉ thực hiện một bước trong khi gỡ lỗi)

8. Lặp lại các bước từ 4 đến 7.

Video được liên kết cho bước này sẽ đưa chúng ta qua toàn bộ quá trình trong một bản demo trực tiếp, khi chúng ta thực hiện từng bước một và nói qua mọi hướng dẫn lắp ráp và hiển thị hoạt động của đèn LED. Xin miễn chiều dài của video.

Bước 3: Bạn có bắt được một sai sót trong video không?

Trong video hướng dẫn toàn bộ quá trình lập trình và chiếu sáng đèn LED, có một bước bổ sung trong vòng lặp chính, có thể đã được chuyển lên bước khởi tạo một lần.

Cảm ơn bạn đã dành thời gian xem qua Tài liệu hướng dẫn này.

Phần tiếp theo mở rộng về những gì chúng tôi đã bắt đầu ở đây.

Đề xuất: