Mục lục:

Bare Metal Raspberry Pi 3: Đèn LED nhấp nháy: 8 bước
Bare Metal Raspberry Pi 3: Đèn LED nhấp nháy: 8 bước

Video: Bare Metal Raspberry Pi 3: Đèn LED nhấp nháy: 8 bước

Video: Bare Metal Raspberry Pi 3: Đèn LED nhấp nháy: 8 bước
Video: Baremetal Assembly Raspberry Pi Programming | Direct to Register Blink LED, No Operating System 2024, Tháng bảy
Anonim
Bare Metal Raspberry Pi 3: Đèn LED nhấp nháy
Bare Metal Raspberry Pi 3: Đèn LED nhấp nháy

Theo moldypizzaFollow More của tác giả:

Nút nhấn Raspberry Pi có đèn LED Kim loại trần
Nút nhấn Raspberry Pi có đèn LED Kim loại trần
Nút nhấn Raspberry Pi có đèn LED Kim loại trần
Nút nhấn Raspberry Pi có đèn LED Kim loại trần
Thùng
Thùng
Thùng
Thùng
Làm thế nào để thực hiện một chạm khắc cứu trợ cho ngày cựu chiến binh
Làm thế nào để thực hiện một chạm khắc cứu trợ cho ngày cựu chiến binh
Làm thế nào để thực hiện một chạm khắc cứu trợ cho ngày cựu chiến binh
Làm thế nào để thực hiện một chạm khắc cứu trợ cho ngày cựu chiến binh

Giới thiệu:.oO0Oo. Thông tin thêm về moldypizza »

Chào mừng bạn đến với hướng dẫn LED nhấp nháy BARE METAL pi 3!

Trong hướng dẫn này, chúng ta sẽ đi qua các bước, từ đầu đến cuối, để có được đèn LED nhấp nháy bằng cách sử dụng Raspberry PI 3, bảng mạch, điện trở, đèn LED và thẻ SD trống.

Vậy BARE METAL là gì? BARE METAL không phải là một chương trình rườm rà. Kim loại trần có nghĩa là chúng ta hoàn toàn kiểm soát được những gì máy tính sẽ làm. Vì vậy, về cơ bản có nghĩa là mã sẽ được viết hoàn toàn bằng assembly, sử dụng tập lệnh Arm. Cuối cùng, chúng tôi sẽ tạo một chương trình sẽ nhấp nháy đèn LED bằng cách truy cập địa chỉ vật lý của một trong các chân GPIO của Raspberry Pi và định cấu hình nó để xuất rồi bật và tắt nó. Thực hiện dự án này, là một cách tuyệt vời để bắt đầu với lập trình nhúng và hy vọng cung cấp hiểu biết tốt hơn về cách hoạt động của máy tính.

Bạn cần gì?

Phần cứng

  • Raspberry PI 3
  • Thẻ SD được tải sẵn với một hình ảnh có thể khởi động
  • Breadboard
  • Dây nhảy nam Nữ
  • Nam dây nhảy nam
  • DẪN ĐẾN
  • Điện trở 220 ohm (không nhất thiết phải chính xác là 220 ohms, hầu hết mọi điện trở sẽ hoạt động)
  • thẻ sd mini
  • thẻ sd mini được tải sẵn hệ điều hành raspberry pi (thường đi kèm với pi)

Phần mềm

  • Trình biên dịch GCC
  • Chuỗi công cụ nhúng GNU
  • trình soạn thảo văn bản
  • định dạng thẻ sd

Được rồi, hãy BẮT ĐẦU!

Bước 1: THIẾT LẬP THINGS / STUFF UP

THIẾT LẬP THINGS / STUFF UP
THIẾT LẬP THINGS / STUFF UP

Được rồi, vậy… bước đầu tiên là sử dụng phần cứng. Bạn có thể mua các bộ phận riêng biệt hoặc có một bộ đi kèm với nhiều bộ phận. LIÊN KẾT

Bộ này đi kèm với mọi thứ cần thiết để thiết lập raspberry pi 3 và hơn thế nữa! Thứ duy nhất không có trong bộ này là một thẻ sd nhỏ bổ sung. Đợi đã! Đừng mua một cái khác chỉ được nêu ra. Nếu bạn không có kế hoạch sử dụng cài đặt linux được tải sẵn trên thẻ thì bạn chỉ cần sao chép nội dung của thẻ sd mini đi kèm để sử dụng sau và định dạng lại thẻ (sẽ nói thêm về điều đó sau). LƯU Ý QUAN TRỌNG: hãy đảm bảo rằng bạn giữ các tệp trên thẻ đi kèm mà bạn sẽ CẦN chúng để sử dụng sau này!

Tiếp theo, đã đến lúc thiết lập phần mềm. Hướng dẫn này sẽ không bao gồm hướng dẫn chi tiết về cách cài đặt phần mềm. Có rất nhiều tài nguyên và hướng dẫn trực tuyến về cách cài đặt những thứ này:

NGƯỜI DÙNG WINDOWS:

Tải xuống và cài đặt gcc

Tiếp theo, tải xuống và cài đặt chuỗi công cụ nhúng ARM GNU

LINUX / MAC

  • Các bản phân phối Linux được cài đặt sẵn gcc
  • Tải xuống và cài đặt chuỗi công cụ nhúng ARM GNU.

Được rồi, nếu mọi việc suôn sẻ thì bạn có thể mở terminal (linux / mac) hoặc dòng cmd (windows) và thử nhập

arm-none-eabi-gcc

Kết quả đầu ra sẽ tương tự như hình ảnh đầu tiên. Điều này chỉ để xác minh rằng nó được cài đặt chính xác.

Được rồi, bây giờ các điều kiện tiên quyết đã hết, đã đến lúc bắt đầu với những thứ thú vị.

Bước 2: MẠCH

MẠCH
MẠCH
MẠCH
MẠCH
MẠCH
MẠCH

Giờ mạch! Mạch cho điều này là đơn giản. Chúng tôi sẽ kết nối một led với GPIO 21 (chân 40) trên pi (xem hình 2 và 3). Một điện trở cũng được mắc nối tiếp để tránh cho led bị hỏng. Điện trở sẽ được kết nối với cột âm trên breadboard sẽ được kết nối với GND (chân 39) trên pi. Khi kết nối đèn led, hãy chắc chắn để kết nối đầu ngắn với mặt âm. Xem bức tranh cuối cùng

Bước 3: BẮT BUỘC Mini SD

BOOTABLE Mini SD
BOOTABLE Mini SD
BOOTABLE Mini SD
BOOTABLE Mini SD
BOOTABLE Mini SD
BOOTABLE Mini SD

Có ba bước để pi 3 của bạn nhận ra thẻ sd nhỏ trống của bạn. Chúng ta cần tìm và sao chép bootcode.bin, start.elf và fixup.dat. Bạn có thể lấy các tệp này trên thẻ sd mini đi kèm nếu bạn mua canakit hoặc tạo thẻ sd có thể khởi động cho pi 3 bằng bản phân phối linux. Dù bằng cách nào thì những tệp này cũng cần thiết để cho phép pi nhận dạng thẻ sd như một thiết bị có thể khởi động. Tiếp theo, định dạng mini sd thành fat32 (hầu hết các thẻ mini sd đều có định dạng fat32. Tôi đã sử dụng thẻ sd mini giá rẻ của sandisk), di chuyển bootcode.bin, start.elf, fixup.dat vào thẻ sd. Và bạn đã hoàn thành! Được rồi một lần nữa và theo thứ tự của hình ảnh, các bước là:

  1. Tìm bootcode.bin, start.elf, fixup.dat.
  2. Đảm bảo rằng thẻ sd của bạn được định dạng thành fat32.
  3. Di chuyển bootcode.bin, start.elf và fixup.dat vào thẻ sd đã định dạng.

Đây là cách tôi tìm ra điều này, liên kết.

Bước 4: KIỂM TRA Mini SD

KIỂM TRA Mini SD
KIỂM TRA Mini SD
KIỂM TRA Mini SD
KIỂM TRA Mini SD

Được rồi, chúng tôi có thẻ sd mini có thể khởi động và hy vọng rằng bạn có pi 3 tại thời điểm này. Vì vậy, bây giờ chúng ta nên kiểm tra nó để đảm bảo rằng pi 3 đang nhận dạng thẻ sd mini là có thể khởi động được.

Trên pi, gần cổng usb mini có hai đèn led nhỏ. Một màu đỏ. Đây là chỉ báo nguồn. Khi pi nhận nguồn, đèn này sẽ sáng. Vì vậy, nếu bạn cắm pi của mình ngay bây giờ mà không có thẻ sd mini, nó sẽ sáng đỏ. Được rồi, bây giờ hãy rút pi của bạn và đặt thẻ sd mini có thể khởi động của bạn đã được tạo ở bước trước và cắm pi vào. Bạn có thấy đèn khác không? Phải có một đèn màu xanh lá cây, ngay bên cạnh đèn màu đỏ, cho biết rằng nó đang đọc thẻ sd. Led này được gọi là led ACT. Nó sẽ sáng khi có thẻ sd khả thi được lắp vào. Nó sẽ nhấp nháy khi nó đang truy cập thẻ sd mini của bạn.

Được rồi, hai điều sẽ xảy ra sau khi bạn lắp thẻ sd mini có thể khởi động và cắm pi vào:

  1. Đèn LED màu đỏ sẽ được chiếu sáng cho biết đã nhận nguồn điện
  2. Đèn LED màu xanh lá cây sẽ được chiếu sáng cho biết rằng nó đã khởi động vào thẻ sd mini

Nếu có sự cố, hãy thử lặp lại các bước trước đó hoặc nhấp vào liên kết bên dưới để biết thêm thông tin.

Liên kết ở đây là một tài liệu tham khảo tốt.

Bước 5: CODE1

Dự án này được viết bằng hợp ngữ ARM. Hiểu biết cơ bản về lắp ráp ARM được giả định trong hướng dẫn này, nhưng đây là một vài điều bạn nên biết:

.equ: gán giá trị cho một ký hiệu, tức là abc.equ 5 abc bây giờ đại diện cho năm

  • ldr: tải từ bộ nhớ
  • str: ghi vào bộ nhớ
  • cmp: so sánh hai giá trị bằng cách thực hiện một phép trừ. Đặt cờ.
  • b: nhánh để dán nhãn
  • add: thực hiện số học

Nếu bạn chưa có bất kỳ kinh nghiệm nào về lắp ráp Cánh tay, hãy xem video này. Nó sẽ cung cấp cho bạn một sự hiểu biết tốt về hợp ngữ Arm.

Được rồi, ngay bây giờ chúng ta có một mạch được kết nối với raspberry pi 3 của chúng ta và chúng ta có thẻ sd mà pi nhận dạng được, vì vậy nhiệm vụ tiếp theo của chúng ta là tìm cách tương tác với mạch bằng cách tải pi bằng một chương trình thực thi. Nói chung, những gì chúng ta cần làm là yêu cầu số pi xuất ra một điện áp từ GPIO 21 (chân kết nối với dây màu đỏ). Sau đó, chúng ta cần một cách để chuyển đổi đèn led để làm cho nó nhấp nháy. Để làm điều này, chúng tôi cần thêm thông tin. Tại thời điểm này, chúng tôi không biết làm thế nào để yêu cầu GPIO 21 xuất ra, đó là lý do tại sao chúng tôi phải đọc biểu dữ liệu. Hầu hết các bộ điều khiển vi mô đều có bảng dữ liệu chỉ định chính xác cách mọi thứ hoạt động. Thật không may, pi 3 không có tài liệu chính thức! Tuy nhiên, có một bảng dữ liệu không chính thức. Đây là hai liên kết đến nó:

  1. github.com/raspberrypi/documentation/files…
  2. web.stanford.edu/class/cs140e/docs/BCM2837…

Được rồi, tại thời điểm này, bạn nên dành vài phút trước khi chuyển sang bước tiếp theo để xem qua bảng dữ liệu và xem bạn có thể tìm thấy thông tin nào.

Bước 6: CODE2: Turn_Led_ON

CODE2: Turn_Led_ON
CODE2: Turn_Led_ON
CODE2: Turn_Led_ON
CODE2: Turn_Led_ON
CODE2: Turn_Led_ON
CODE2: Turn_Led_ON

Raspberry pi 3 53 đăng ký để điều khiển các chân đầu ra / đầu vào (thiết bị ngoại vi). Các chân được nhóm lại với nhau và mỗi nhóm được gán cho một thanh ghi. Đối với GPIO, chúng ta cần có thể truy cập vào thanh ghi SELECT, thanh ghi SET và thanh ghi CLEAR. Để truy cập các thanh ghi này, chúng ta cần địa chỉ vật lý của các thanh ghi này. Khi bạn đang đọc bảng dữ liệu, bạn chỉ muốn ghi chú độ lệch của địa chỉ (lo byte) và thêm nó vào địa chỉ cơ sở. Bạn phải làm điều này vì biểu dữ liệu đang liệt kê địa chỉ ảo linux về cơ bản là các giá trị mà hệ điều hành gán. Chúng tôi không sử dụng hệ điều hành vì vậy chúng tôi cần truy cập trực tiếp vào các thanh ghi này bằng cách sử dụng địa chỉ vật lý. Để làm được điều này, bạn cần những thông tin sau:

  • Địa chỉ cơ sở của thiết bị ngoại vi: 0x3f200000. Bản pdf (trang6) cho biết địa chỉ cơ sở là 0x3f000000, tuy nhiên, địa chỉ này sẽ không hoạt động. Sử dụng 0x3f200000
  • Phần bù của FSEL2 (SELECT) không phải là địa chỉ đầy đủ của thanh ghi. Bản pdf liệt kê FSEL2 tại 0x7E20008 nhưng địa chỉ này đề cập đến địa chỉ ảo linux. Sự bù đắp sẽ giống nhau vì vậy đó là những gì chúng tôi muốn lưu ý. 0x08
  • Phần bù của GPSET0 (SET): 0x1c
  • Phần bù GPCLR0 (CLEAR): 0x28

Vì vậy, bạn có thể nhận thấy rằng bảng dữ liệu liệt kê 4 thanh ghi CHỌN, 2 thanh ghi SET và 2 thanh ghi CLEAR vậy tại sao tôi lại chọn những thanh ghi mà tôi đã làm? Điều này là do chúng tôi muốn sử dụng GPIO 21 và FSEL2 điều khiển GPIO 20-29, SET0 và CLR0 điều khiển GPIO 0-31. Các thanh ghi FSEL chỉ định ba bit cho mỗi chân GPIO. Vì chúng tôi đang sử dụng FSEL2 có nghĩa là các bit 0-2 điều khiển GPIO 20 và các bit 3-5 điều khiển GPIO 21, v.v. Thanh ghi Set và CLR chỉ định một bit cho mỗi chân. Ví dụ, bit 0 trong SET0 và CLR0 điều khiển GPIO 1. Để điều khiển GPIO 21, bạn sẽ đặt bit 21 trong SET0 và CLR0.

Được rồi, chúng ta đã nói về cách truy cập các thanh ghi này, nhưng tất cả nghĩa là gì?

  • Thanh ghi FSEL2 sẽ được sử dụng để đặt GPIO 21 thành đầu ra. Để thiết lập một chân để xuất ra, bạn cần đặt bit thứ tự lo của ba bit thành 1. Vì vậy, nếu bit 3-5 điều khiển GPIO 21, điều đó có nghĩa là chúng ta cần đặt bit đầu tiên, bit 3 thành 1. Điều này sẽ cho pi mà chúng tôi muốn sử dụng GPIO 21 làm đầu ra. Vì vậy, nếu chúng ta xem xét 3 bit cho GPIO 21, chúng sẽ trông như thế này sau khi chúng ta đặt nó thành đầu ra, b001.
  • GPSET0 yêu cầu pi bật chân cắm (xuất ra điện áp). Để làm điều này, chúng tôi chỉ cần chuyển đổi bit tương ứng với chân GPIO mà chúng tôi muốn. Trong trường hợp của chúng tôi, bit 21.
  • GPCLR0 báo cho pi tắt chân (không có điện áp). Để tắt pin, hãy đặt bit thành chân GPIO tương ứng. Trong trường hợp của chúng tôi, bit 21

Trước khi chúng ta đến với đèn led nhấp nháy, trước tiên chúng ta hãy tạo một chương trình đơn giản giúp bật đèn led một cách đơn giản.

Để bắt đầu, chúng ta cần thêm hai lệnh vào đầu mã nguồn của chúng ta.

  • .section.init cho pi biết nơi đặt mã
  • .global _start

Tiếp theo, chúng ta cần bố trí tất cả các địa chỉ mà chúng ta sẽ sử dụng. Sử dụng.equ để gán các ký hiệu có thể đọc được cho các giá trị.

  • .equ GPFSEL2, 0x08
  • .equ GPSET0, 0x1c
  • .equ GPCLR0, 0x28
  • .equ BASE, 0x3f200000

Bây giờ chúng ta sẽ tạo mặt nạ để thiết lập các bit mà chúng ta cần được thiết lập.

  • .equ SET_BIT3, 0x08 Điều này sẽ đặt bit ba 0000_1000
  • .equ SET_BIT21, 0x200000

Sau đó, chúng ta cần thêm nhãn _start của mình

_bắt đầu:

Nạp địa chỉ cơ sở vào thanh ghi

ldr r0, = BASE

Bây giờ chúng ta cần thiết lập bit3 của GPFSEL2

  • ldr r1, SET_BIT3
  • str r1, [r0, # GPFSEL2] Hướng dẫn này cho biết ghi lại bit 0x08 vào địa chỉ của GPFSEL2

Cuối cùng, chúng ta cần bật GPIO 21 bằng cách đặt bit 21 trong thanh ghi GPSET0

  • ldr r1, = SET_BIT21
  • str r1, [r0, # GPSET0]

Sản phẩm cuối cùng sẽ giống như mã trong hình.

Bước tiếp theo là biên dịch mã và tạo tệp.img mà pi có thể chạy.

  • Tải xuống tệp makefile và kernel.ld đính kèm và nếu bạn muốn mã nguồn turn_led_on.s.
  • Đặt tất cả các tệp trong cùng một thư mục.
  • Nếu bạn đang sử dụng mã nguồn của riêng mình, hãy chỉnh sửa tệp makefile và thay thế mã = turn_led_on.s bằng mã = .s
  • Lưu makefile.
  • Sử dụng terminal (linux) hoặc cửa sổ cmd (windows) để điều hướng đến thư mục chứa các tệp của bạn và gõ lệnh make và nhấn enter
  • Tạo tệp sẽ tạo một tệp có tên kernel.img
  • Sao chép kernel.img vào thẻ sd mini của bạn. Nội dung thẻ của bạn phải như hình (ảnh 3): bootcode.bin, start.elf, fixup.dat và kernel.img.
  • Đẩy thẻ sd mini và lắp nó vào pi
  • Cắm pi vào nguồn điện
  • LED sẽ sáng lên !!!

LƯU Ý QUAN TRỌNG CHỨNG MINH: Rõ ràng là các hướng dẫn đã gặp sự cố với việc makefile không có phần mở rộng, vì vậy tôi đã tải lên lại nó bằng phần mở rộng.txt. Vui lòng xóa tiện ích mở rộng khi bạn tải xuống để nó hoạt động bình thường.

Đề xuất: