Mục lục:

PHẦN 2 - LẮP RÁP GPIO ARM - RGB - CHỨC NĂNG GỌI - Công tắc: 6 bước
PHẦN 2 - LẮP RÁP GPIO ARM - RGB - CHỨC NĂNG GỌI - Công tắc: 6 bước

Video: PHẦN 2 - LẮP RÁP GPIO ARM - RGB - CHỨC NĂNG GỌI - Công tắc: 6 bước

Video: PHẦN 2 - LẮP RÁP GPIO ARM - RGB - CHỨC NĂNG GỌI - Công tắc: 6 bước
Video: [STM32 cơ bản] Bài 3: GPIO output. Cấu hình sử dụng Clock ngoại (HSE) và Clock nội (HSI). 2024, Tháng bảy
Anonim
PHẦN 2 - LẮP RÁP GPIO ARM - RGB - CHỨC NĂNG GỌI - Công tắc
PHẦN 2 - LẮP RÁP GPIO ARM - RGB - CHỨC NĂNG GỌI - Công tắc

Trong Phần 1, chúng ta đã học cách chuyển đổi một đèn LED Đỏ duy nhất trên bảng phát triển MSP432 LaunchPad từ Texas Instruments, sử dụng assembly thay vì C / C ++.

Trong phần Có thể hướng dẫn này, chúng ta sẽ thực hiện một việc tương tự - điều khiển một đèn LED RGB cũng nằm trên cùng một bảng đó.

Trong quá trình này, chúng tôi hy vọng sẽ nâng cao kiến thức của mình về cách lắp ráp ARM, và không chỉ vui vẻ với việc thắp sáng một số đèn LED.

Bước 1: Hãy bắt đầu ngay

Thực sự, video đầu tiên đã nói lên tất cả. Không còn nhiều thứ để thêm vào.

Điểm chính của nó là thúc đẩy ý tưởng rằng mỗi cổng I / O trên MSP432 bao gồm một khối địa chỉ "thanh ghi", lần lượt bao gồm một số bit mỗi cổng.

Hơn nữa, các bit được nhóm theo cách trực giao. Nghĩa là, bit 0 của mỗi địa chỉ thanh ghi tham chiếu đến cùng một chân I / O bên ngoài.

Chúng tôi lặp lại ý tưởng rằng cần một số địa chỉ đăng ký cho cổng đó, để thực hiện điều gì đó thậm chí chỉ với một bit hoặc một pin.

Nhưng trong trường hợp này, vì chúng ta đang xử lý đèn LED RGB, chúng ta cần xử lý ba bit cho mỗi địa chỉ thanh ghi.

Chúng tôi củng cố rằng chúng tôi cần một số thanh ghi: thanh ghi DIR, thanh ghi SEL0, thanh ghi SEL1 và thanh ghi OUTPUT. Và ba bit mỗi lần.

Bước 2: Cải thiện mã - Thêm chức năng

Image
Image

Như bạn đã thấy ở Bước trên, vòng lặp chương trình chính có rất nhiều mã lặp lại, cụ thể là khi chúng ta tắt đèn LED.

Vì vậy, chúng ta có thể thêm một hàm vào chương trình. Chúng ta vẫn phải gọi hàm đó mỗi khi chúng ta muốn tắt đèn LED, nhưng nó khiến một số mã thu gọn thành một câu lệnh duy nhất.

Nếu mã tắt đèn LED của chúng tôi được tham gia nhiều hơn với nhiều hướng dẫn hơn, thì đây sẽ là một trình tiết kiệm bộ nhớ thực sự.

Một phần của lập trình nhúng và bộ điều khiển vi mô đang nhận thức được nhiều hơn về kích thước chương trình.

Video giải thích.

Về cơ bản, chúng tôi thêm một câu lệnh phân nhánh vào mã chính của chúng tôi và chúng tôi có một khối mã khác là hàm mà chúng tôi phân nhánh. Và sau đó khi chúng ta thực hiện xong hoặc khi kết thúc hàm, chúng ta sẽ rẽ nhánh trở lại câu lệnh tiếp theo trong chương trình chính.

Bước 3: Thêm thời gian trễ vòng lặp bận

Trong phần Khai báo của mã, hãy thêm một hằng số để giúp bạn dễ dàng tìm kiếm thời gian mong muốn:

; bất kỳ từ nào sau dấu chấm phẩy (';') bắt đầu nhận xét.

; mã trong phần này gán tên cho một giá trị.; bạn cũng có thể đã sử dụng '.equ' nhưng chúng hơi khác một chút.; '.equ' (tôi nghĩ) không thể thay đổi được, trong khi '.set' có nghĩa là bạn có thể; thay đổi giá trị của 'DLYCNT' sau này trong mã nếu bạn muốn.; 'DLYCNT' sẽ được sử dụng làm giá trị đếm ngược trong chương trình con trì hoãn. DLYCNT.set 0x30000

Thêm một chức năng trì hoãn mới:

trì hoãn:.asmfunc; phần bắt đầu của chương trình con hoặc hàm 'trì hoãn'.

MOV R5, #DLYCNT; tải thanh ghi cpu lõi R5 với giá trị được gán cho 'DLYCNT'. dlyloop; điều này đánh dấu sự bắt đầu của vòng lặp trễ. trình hợp dịch xác định địa chỉ. SUB R5, # 0x1; trừ 1 từ giá trị hiện tại trong thanh ghi cpu lõi R5. CMP R5, # 0x0; so sánh giá trị hiện tại trong R5 đến 0. BGT dlyloop; rẽ nhánh nếu giá trị trong R5 lớn hơn 0, thành nhãn (địa chỉ) 'dlyloop'. BX LR; nếu chúng ta đến đây, nghĩa là giá trị R5 là 0. trả về từ chương trình con..endasmfunc; đánh dấu kết thúc chương trình con.

Sau đó, trong phần thân chính, trong vòng lặp chính, gọi hoặc gọi hàm trì hoãn đó:

; đây là một đoạn mã, của nội dung chính hoặc chức năng chính (xem tệp 'main.asm').

; đây là một vòng lặp trong 'main' và cho thấy cách chúng tôi gọi hoặc sử dụng hàm 'delay' mới đó.; '#REDON' và '#GRNON' cũng là các khai báo (hằng số) (xem phần trên cùng của 'main.asm').; chúng chỉ là một cách dễ dàng để đặt màu được chỉ định của đèn LED RGB. loop MOV R0, #REDON; Red - đặt thanh ghi cpu lõi R0 với giá trị được gán cho 'REDON'. STRB R0, [R4]; thanh ghi lõi R4 trước đây đã được thiết lập với địa chỉ đầu ra GPIO.; viết những gì trong R0, vào địa chỉ được chỉ định bởi R4. BL delay; rẽ nhánh đến chức năng 'delay' mới. BL ledsoff; nhánh với chức năng 'ledsoff' đã có từ trước. Độ trễ BL; ditto MOV R0, #GRNON; Màu xanh lá cây - ditto STRB R0, [R4]; và như thế. BL chậm trễ BL ledsoff BL chậm trễ

Video đi vào chi tiết.

Bước 4: Tiêu chuẩn cuộc gọi quy trình kiến trúc ARM (AAPCS)

Có lẽ đây là thời điểm thích hợp để giới thiệu một điều gì đó. Đó là một quy ước hợp ngữ. Còn được gọi là Tiêu chuẩn cuộc gọi thủ tục cho Kiến trúc ARM.

Có rất nhiều điều về điều này, nhưng nó chỉ là một tiêu chuẩn. Nó không ngăn chúng ta học lập trình lắp ráp và chúng ta có thể áp dụng các phần của tiêu chuẩn đó khi chúng ta tiếp tục, một khi chúng ta cảm thấy thoải mái với một số khái niệm mà chúng ta đang học.

Nếu không, chúng ta có thể cảm thấy như đang uống từ một vòi nước khổng lồ. Quá nhiều thông tin.

Thanh ghi cốt lõi

Vì chúng ta đã quen với các thanh ghi cốt lõi của MSP432, nên bây giờ chúng ta hãy thử áp dụng một số tiêu chuẩn này. Chúng tôi sẽ tuân theo điều này khi chúng tôi viết chức năng tiếp theo (bật / tắt đèn LED).

1) Chúng ta phải sử dụng R0 như một tham số hàm. Nếu chúng ta muốn chuyển một giá trị vào hàm (chương trình con), chúng ta nên sử dụng R0 để làm như vậy.

2) Chúng tôi sử dụng Link Register cho mục đích đã định của nó - nó giữ địa chỉ cho biết nơi quay trở lại sau khi chương trình con hoàn tất.

Bạn sẽ thấy cách chúng tôi áp dụng những điều này.

Bước 5: Hàm với tham số - Các hàm lồng nhau

Chúng ta có thể dọn dẹp mã của mình và giảm dung lượng bộ nhớ mà nó chiếm bằng cách kết hợp các phần lặp lại thành một hàm duy nhất. Sự khác biệt duy nhất trong phần thân của vòng lặp chính là chúng ta cần một tham số để chúng ta có thể chuyển các màu khác nhau mà chúng ta muốn thấy của đèn LED RGB.

Hãy xem video để biết chi tiết. (xin lỗi vì độ dài)

Bước 6: Đầu vào GPIO - Thêm công tắc

Hãy làm cho nó thú vị hơn. Đã đến lúc thêm một số điều khiển chuyển đổi vào chương trình lắp ráp của chúng ta.

Có thể hướng dẫn này có các hình ảnh cho thấy cách hai công tắc trên bo mạch được kết nối với MSP432.

Về cơ bản: Công tắc 1 (SW1 hoặc S1) được kết nối với P1.1 và Công tắc 2 (SW2 hoặc S2) được kết nối với P1.4.

Điều này làm cho mọi thứ trở nên thú vị một chút không chỉ vì chúng ta đang xử lý đầu vào thay vì đầu ra, mà còn vì hai công tắc này chiếm hoặc chiếm hai bit của cùng một khối địa chỉ thanh ghi cũng như đèn LED màu đỏ duy nhất là đầu ra.

Chúng tôi đã xử lý việc bật tắt đèn LED đơn màu đỏ trong Có thể hướng dẫn này, vì vậy chúng tôi chỉ cần thêm mã để xử lý các công tắc.

Khối địa chỉ đăng ký cổng 1

Hãy nhớ rằng chúng tôi đã đề cập đến những điều này trong Có thể hướng dẫn trước đó, nhưng chúng tôi phải bao gồm một cái mới:

  • Đị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
  • Kích hoạt điện trở cổng 1 Địa chỉ đăng ký = 0x40004C06
  • Cổng 1 Chọn 0 Địa chỉ đăng ký = 0x40004C0A
  • Cổng 1 Chọn 1 Địa chỉ đăng ký = 0x40004C0C

Khi sử dụng các cổng làm đầu vào, nên sử dụng điện trở kéo lên hoặc kéo xuống bên trong của MSP432.

Vì bảng phát triển Launchpad đã nối hai công tắc xuống đất (THẤP khi được nhấn), điều đó có nghĩa là chúng ta nên sử dụng điện trở kéo LÊN để đảm bảo chúng ta có điện trở CAO vững chắc khi chúng không được nhấn.

Kéo lên / kéo điện trở xuống

Cần hai địa chỉ thanh ghi Cổng 1 khác nhau để buộc các đầu vào chuyển mạch đó với điện trở kéo lên.

1) Sử dụng thanh ghi cho phép điện trở cổng 1 (0x40004C06) để chỉ ra rằng bạn muốn có điện trở (cho hai bit đó), 2) và sau đó sử dụng thanh ghi Đầu ra Cổng 1 (0x40004C02) để đặt các điện trở là kéo lên hoặc kéo xuống. Có vẻ khó hiểu khi chúng ta đang sử dụng thanh ghi Đầu ra trên các đầu vào. Thanh ghi đầu ra gần giống như một mục đích kép.

Vì vậy, để tái trạng thái theo cách khác, thanh ghi Đầu ra có thể gửi mức CAO hoặc THẤP đến một đầu ra (chẳng hạn như đèn LED đơn màu đỏ) và / hoặc nó được sử dụng để đặt điện trở kéo lên hoặc kéo xuống cho đầu vào, NHƯNG CHỈ nếu tính năng đó đã được bật qua thanh ghi Kích hoạt điện trở.

Điều quan trọng ở trên - khi gửi / đặt LOW hoặc HIGH cho bất kỳ bit đầu ra nào, bạn sẽ cần duy trì trạng thái kéo lên / kéo xuống của các bit đầu vào đồng thời.

(video cố gắng giải thích)

Đọc một bit đầu vào cổng

  • Đặt SEL0 / SEL1 cho chức năng GPIO
  • Đặt thanh ghi DIR làm đầu vào cho các bit chuyển đổi, nhưng là đầu ra cho đèn LED (đồng thời trong cùng một byte)
  • Kích hoạt điện trở
  • Đặt chúng làm điện trở kéo lên
  • Đọc cổng
  • Bạn có thể muốn lọc giá trị đã đọc để chỉ tách các bit bạn cần (chuyển đổi 1 và 2)

Đề xuất: