สารบัญ:

Bare Metal Raspberry Pi 3: ไฟ LED กะพริบ: 8 ขั้นตอน
Bare Metal Raspberry Pi 3: ไฟ LED กะพริบ: 8 ขั้นตอน

วีดีโอ: Bare Metal Raspberry Pi 3: ไฟ LED กะพริบ: 8 ขั้นตอน

วีดีโอ: Bare Metal Raspberry Pi 3: ไฟ LED กะพริบ: 8 ขั้นตอน
วีดีโอ: ต่อ Relay กับ Raspberry Pi 2024, กรกฎาคม
Anonim
Bare Metal Raspberry Pi 3: ไฟ LED กะพริบ
Bare Metal Raspberry Pi 3: ไฟ LED กะพริบ

By moldypizzaติดตาม เพิ่มเติมโดยผู้เขียน:

ปุ่มกด Raspberry Pi พร้อมไฟ LED Bare Metal
ปุ่มกด Raspberry Pi พร้อมไฟ LED Bare Metal
ปุ่มกด Raspberry Pi พร้อมไฟ LED Bare Metal
ปุ่มกด Raspberry Pi พร้อมไฟ LED Bare Metal
ลัง
ลัง
ลัง
ลัง
วิธีการแกะสลักบรรเทาทุกข์สำหรับวันทหารผ่านศึก
วิธีการแกะสลักบรรเทาทุกข์สำหรับวันทหารผ่านศึก
วิธีการแกะสลักบรรเทาทุกข์สำหรับวันทหารผ่านศึก
วิธีการแกะสลักบรรเทาทุกข์สำหรับวันทหารผ่านศึก

เกี่ยวกับ:.oO0Oo ข้อมูลเพิ่มเติมเกี่ยวกับ moldypizza »

ยินดีต้อนรับสู่บทช่วยสอน BARE METAL pi 3 ไฟ LED กะพริบ!

ในบทช่วยสอนนี้ เราจะทำตามขั้นตอนตั้งแต่ต้นจนจบเพื่อให้ไฟ LED กะพริบโดยใช้ Raspberry PI 3, เขียงหั่นขนม, ตัวต้านทาน, ไฟ LED และการ์ด SD เปล่า

แล้ว BARE METAL คืออะไร? BARE METAL เป็นโปรแกรมที่ไม่หรูหรา โลหะเปล่าหมายความว่าเราสามารถควบคุมสิ่งที่คอมพิวเตอร์จะทำได้อย่างเต็มที่ ดังนั้นโดยพื้นฐานแล้วหมายความว่ารหัสจะถูกเขียนในชุดประกอบอย่างสมบูรณ์โดยใช้ชุดคำสั่ง Arm ในตอนท้ายเราจะสร้างโปรแกรมที่จะกะพริบไฟ LED โดยการเข้าถึงที่อยู่ทางกายภาพของหมุด GPIO ของ Raspberry Pi และกำหนดค่าให้เป็นเอาต์พุตแล้วสลับเปิดและปิด การพยายามทำโปรเจ็กต์นี้เป็นวิธีที่ดีในการเริ่มต้นเขียนโปรแกรมแบบฝังตัว และหวังว่าจะช่วยให้เข้าใจวิธีการทำงานของคอมพิวเตอร์ได้ดีขึ้น

อะไรที่คุณต้องการ?

ฮาร์ดแวร์

  • ราสเบอร์รี่ PI 3
  • การ์ด SD ที่โหลดไว้ล่วงหน้าพร้อมอิมเมจที่สามารถบู๊ตได้
  • เขียงหั่นขนม
  • สายจัมเปอร์ชายหญิง
  • สายจัมเปอร์ชาย
  • นำ
  • ตัวต้านทาน 220 โอห์ม (ไม่จำเป็นต้องเป็น 220 โอห์มพอดี ตัวต้านทานส่วนใหญ่จะใช้งานได้)
  • มินิ sd การ์ด
  • mini sd card ที่โหลดไว้ล่วงหน้าด้วยระบบปฏิบัติการ raspberry pi (มักจะรวมอยู่ใน pi)

ซอฟต์แวร์

  • คอมไพเลอร์ GCC
  • GNU เครื่องมือฝังตัว
  • โปรแกรมแก้ไขข้อความ
  • ฟอร์แมตการ์ด sd

เอาล่ะ มาเริ่มกันเลย!

ขั้นตอนที่ 1: การตั้งค่าสิ่งของ/สิ่งของ

การตั้งค่าสิ่งของ/สิ่งของ
การตั้งค่าสิ่งของ/สิ่งของ

เอาล่ะ… ขั้นตอนแรกคือการซื้อฮาร์ดแวร์ คุณสามารถซื้อชิ้นส่วนแยกต่างหากหรือมีชุดที่มาพร้อมกับชิ้นส่วนที่เพียงพอ ลิงค์

ชุดนี้มาพร้อมกับทุกสิ่งที่จำเป็นในการติดตั้ง raspberry pi 3 และอื่นๆ! สิ่งเดียวที่ไม่รวมอยู่ในชุดนี้คือการ์ด mini sd พิเศษ รอ! อย่าเพิ่งซื้ออันอื่นเลย หากคุณไม่ได้วางแผนที่จะใช้การติดตั้ง linux ที่โหลดไว้ล่วงหน้าในการ์ด ให้คัดลอกเนื้อหาของการ์ด mini sd ที่รวมไว้สำหรับใช้ในภายหลังและฟอร์แมตการ์ดใหม่ (เพิ่มเติมในภายหลัง) หมายเหตุสำคัญ: ตรวจสอบให้แน่ใจว่าคุณเก็บไฟล์ไว้ในการ์ดที่รวมไว้ซึ่งคุณจะต้องใช้ในภายหลัง!

ต่อไปก็ถึงเวลาตั้งค่าซอฟต์แวร์ บทแนะนำนี้จะไม่รวมคำแนะนำโดยละเอียดเกี่ยวกับวิธีการติดตั้งซอฟต์แวร์ มีแหล่งข้อมูลและบทช่วยสอนออนไลน์มากมายเกี่ยวกับวิธีการติดตั้งสิ่งเหล่านี้:

ผู้ใช้ WINDOWS:

ดาวน์โหลดและติดตั้ง gcc

ถัดไป ดาวน์โหลดและติดตั้ง toolchain แบบฝัง GNU ARM

ลินุกซ์/MAC

  • ลีนุกซ์รุ่นที่มาพร้อมกับ gcc ที่ติดตั้งไว้ล่วงหน้า
  • ดาวน์โหลดและติดตั้ง toolchain แบบฝัง GNU ARM

โอเค ถ้าทุกอย่างเป็นไปด้วยดี คุณควรจะสามารถเปิดเทอร์มินัล (linux/mac) หรือ cmd line (windows) แล้วลองพิมพ์

arm-none-eabi-gcc

ผลลัพธ์ควรมีลักษณะคล้ายกับภาพแรก นี่เป็นเพียงเพื่อตรวจสอบว่าได้ติดตั้งอย่างถูกต้อง

เอาล่ะ เมื่อข้อกำหนดเบื้องต้นหมดไปแล้ว ก็ถึงเวลาเริ่มต้นกับสิ่งสนุก ๆ

ขั้นตอนที่ 2: วงจร

วงจร
วงจร
วงจร
วงจร
วงจร
วงจร

รอบเวลา! วงจรนี้ง่าย เราจะเชื่อมต่อ led กับ GPIO 21 (พิน 40) บน pi (ดูรูปที่ 2 และ 3) ตัวต้านทานยังเชื่อมต่อแบบอนุกรมเพื่อป้องกันไม่ให้ไฟ LED เสียหาย ตัวต้านทานจะเชื่อมต่อกับคอลัมน์เชิงลบบนเขียงหั่นขนมซึ่งจะเชื่อมต่อกับ GND (พิน 39) บน pi เมื่อเชื่อมต่อไฟ LED ให้แน่ใจว่าได้เชื่อมต่อปลายด้านสั้นเข้ากับด้านลบ ดูรูปสุดท้าย

ขั้นตอนที่ 3: BOOTABLE Mini SD

มินิ SD ที่บูตได้
มินิ SD ที่บูตได้
มินิ SD ที่บูตได้
มินิ SD ที่บูตได้
มินิ SD ที่บูตได้
มินิ SD ที่บูตได้

มีสามขั้นตอนในการทำให้ pi 3 รู้จักการ์ด mini sd เปล่าของคุณ เราจำเป็นต้องค้นหาและคัดลอก bootcode.bin, start.elf และ fixup.dat คุณสามารถรับไฟล์เหล่านี้ในการ์ด mini sd ที่รวมมาหากคุณซื้อ canakit หรือสร้างการ์ด sd ที่สามารถบู๊ตได้สำหรับ pi 3 ด้วยการกระจาย linux ไม่ว่าจะด้วยวิธีใดไฟล์เหล่านี้จำเป็นต้องอนุญาตให้ pi รู้จักการ์ด sd เป็นอุปกรณ์ที่สามารถบู๊ตได้ ถัดไป ฟอร์แมต mini sd เป็น fat32 (การ์ด mini sd ส่วนใหญ่จะฟอร์แมตเป็น fat32 ฉันใช้ mini sd card ราคาถูกจาก sandisk) ย้าย bootcode.bin, start.elf, fixup.dat ไปที่การ์ด sd และคุณทำเสร็จแล้ว! เอาล่ะอีกครั้งและในลำดับของรูปภาพขั้นตอนคือ:

  1. ค้นหา bootcode.bin, start.elf, fixup.dat
  2. ตรวจสอบให้แน่ใจว่าการ์ด SD ของคุณฟอร์แมตเป็น fat32
  3. ย้าย bootcode.bin, start.elf และ fixup.dat ไปยังการ์ด sd ที่ฟอร์แมตแล้ว

นี่คือวิธีที่ฉันคิดออก ลิงค์

ขั้นตอนที่ 4: ตรวจสอบ Mini SD

ตรวจสอบ Mini SD
ตรวจสอบ Mini SD
ตรวจสอบ Mini SD
ตรวจสอบ Mini SD

เอาล่ะ เรามีการ์ด mini sd ที่สามารถบู๊ตได้ และหวังว่าคุณจะมี pi 3 ในตอนนี้ ดังนั้นตอนนี้เราควรทดสอบเพื่อให้แน่ใจว่า pi 3 รู้จักการ์ด mini sd ว่าสามารถบู๊ตได้

บน pi ใกล้กับพอร์ต mini usb มีไฟ LED ขนาดเล็กสองดวง หนึ่งคือสีแดง นี่คือไฟแสดงสถานะเพาเวอร์ เมื่อ pi ได้รับพลังงาน ไฟนี้ควรติดสว่าง ดังนั้นหากคุณเสียบ pi ของคุณตอนนี้โดยไม่มีการ์ด mini sd มันควรจะสว่างเป็นสีแดง โอเค ถอดปลั๊ก pi ของคุณและใส่การ์ด mini sd ที่สามารถบู๊ตได้ซึ่งสร้างขึ้นในขั้นตอนก่อนหน้าแล้วเสียบ pi คุณเห็นไฟอื่นหรือไม่ ควรมีไฟสีเขียวติดกับไฟสีแดงที่ระบุว่ากำลังอ่านการ์ด sd นำนี้เรียกว่านำ ACT มันจะสว่างขึ้นเมื่อใส่การ์ด sd ที่ใช้งานได้ มันจะกะพริบเมื่อเข้าถึงการ์ด mini sd ของคุณ

โอเค สองสิ่งที่ควรจะเกิดขึ้นหลังจากที่คุณใส่การ์ด mini sd ที่สามารถบู๊ตได้และเสียบ pi เข้าไป:

  1. ไฟ LED สีแดงควรติดสว่างเพื่อระบุการรับพลังงาน
  2. ไฟ LED สีเขียวควรสว่างขึ้นเพื่อระบุว่าบูตเข้าสู่การ์ด mini sd แล้ว

หากมีข้อผิดพลาด ให้ลองทำขั้นตอนก่อนหน้าซ้ำ หรือคลิกลิงก์ด้านล่างเพื่อดูข้อมูลเพิ่มเติม

ลิงค์นี้เป็นข้อมูลอ้างอิงที่ดี

ขั้นตอนที่ 5: CODE1

โปรเจ็กต์นี้เขียนด้วยภาษาแอสเซมบลี ARM ความเข้าใจพื้นฐานเกี่ยวกับการประกอบ ARM ถูกสันนิษฐานไว้ในบทช่วยสอนนี้ แต่นี่คือสิ่งที่คุณควรทราบ:

.equ: กำหนดค่าให้กับสัญลักษณ์เช่น abc.equ 5 abc แทนห้า

  • ldr: โหลดจากหน่วยความจำ
  • str: เขียนถึงหน่วยความจำ
  • cmp: เปรียบเทียบสองค่าโดยทำการลบ ตั้งค่าสถานะ
  • b: สาขาไปยังป้ายกำกับ
  • เพิ่ม: ดำเนินการเลขคณิต

หากคุณไม่มีประสบการณ์เกี่ยวกับการประกอบ Arm ให้ดูวิดีโอนี้ มันจะช่วยให้คุณเข้าใจภาษาของ Arm เป็นอย่างดี

โอเค ตอนนี้เรามีวงจรที่เชื่อมต่อกับ raspberry pi 3 ของเรา และเรามีการ์ด sd ที่ pi รู้จัก ดังนั้นงานต่อไปของเราคือการหาวิธีโต้ตอบกับวงจรโดยการโหลด pi ด้วยโปรแกรมปฏิบัติการ โดยทั่วไป สิ่งที่เราต้องทำคือบอกให้ pi ส่งออกแรงดันไฟฟ้าจาก GPIO 21 (พินที่เชื่อมต่อกับสายสีแดง) จากนั้นเราต้องการวิธีสลับไฟ LED เพื่อให้กะพริบ ในการดำเนินการนี้ เราต้องการข้อมูลเพิ่มเติม ณ จุดนี้เราไม่รู้ว่าจะบอก GPIO 21 ให้ส่งออกได้อย่างไรซึ่งเป็นสาเหตุที่เราต้องอ่านแผ่นข้อมูล ไมโครคอนโทรลเลอร์ส่วนใหญ่มีแผ่นข้อมูลที่ระบุว่าทุกอย่างทำงานอย่างไร น่าเสียดายที่ pi 3 ไม่มีเอกสารอย่างเป็นทางการ! อย่างไรก็ตาม มีเอกสารข้อมูลอย่างไม่เป็นทางการ นี่คือลิงค์สองลิงค์:

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

เอาล่ะ ณ จุดนี้ คุณควรใช้เวลาสองสามนาทีก่อนที่จะไปยังขั้นตอนถัดไปเพื่อดูแผ่นข้อมูลและดูว่าข้อมูลใดบ้างที่คุณสามารถหาได้

ขั้นตอนที่ 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 ลงทะเบียนเพื่อควบคุมพินเอาต์พุต/อินพุต (อุปกรณ์ต่อพ่วง) หมุดถูกจัดกลุ่มเข้าด้วยกันและแต่ละกลุ่มถูกกำหนดให้กับการลงทะเบียน สำหรับ GPIO เราต้องสามารถเข้าถึงการลงทะเบียน SELECT, การลงทะเบียน SET และการลงทะเบียน CLEAR ในการเข้าถึงรีจิสเตอร์เหล่านี้ เราจำเป็นต้องมีที่อยู่จริงของรีจิสเตอร์เหล่านี้ เมื่อคุณอ่านแผ่นข้อมูล คุณเพียงต้องการจดบันทึกออฟเซ็ตของที่อยู่ (lo byte) และเพิ่มไปยังที่อยู่ฐาน คุณต้องทำเช่นนี้เพราะแผ่นข้อมูลแสดงรายการที่อยู่เสมือนของ linux ซึ่งเป็นค่าที่ระบบปฏิบัติการกำหนดโดยพื้นฐาน เราไม่ได้ใช้ระบบปฏิบัติการ ดังนั้นเราจึงจำเป็นต้องเข้าถึงการลงทะเบียนเหล่านี้โดยตรงโดยใช้ที่อยู่จริง คุณต้องมีข้อมูลต่อไปนี้:

  • ที่อยู่พื้นฐานของอุปกรณ์ต่อพ่วง: 0x3f200000 pdf (หน้า 6) ระบุว่าที่อยู่พื้นฐานคือ 0x3f000000 อย่างไรก็ตามที่อยู่นี้จะใช้งานไม่ได้ ใช้ 0x3f200000
  • ออฟเซ็ตของ FSEL2(SELECT) ไม่ใช่ที่อยู่เต็มของรีจิสเตอร์ pdf แสดงรายการ FSEL2 ที่ 0x7E20008 แต่ที่อยู่นี้อ้างถึงที่อยู่เสมือนของ linux ออฟเซ็ตจะเหมือนกันนั่นคือสิ่งที่เราต้องการทราบ 0x08
  • ออฟเซ็ตของ GPSET0(SET):0x1c
  • ออฟเซ็ตของ GPCLR0(CLEAR):0x28

ดังนั้นคุณอาจสังเกตเห็นว่าแผ่นข้อมูลแสดงรายการรีจิสเตอร์ SELECT 4 รายการ รีจิสเตอร์ SET 2 รายการ และรีจิสเตอร์ CLEAR 2 รายการ เหตุใดฉันจึงเลือกรายการที่ฉันทำ เนื่องจากเราต้องการใช้ GPIO 21 และ FSEL2 ควบคุม GPIO 20-29, SET0 และ CLR0 ควบคุม GPIO 0-31 การลงทะเบียน FSEL กำหนดสามบิตสำหรับพิน GPIO ทุกอัน เนื่องจากเราใช้ FSEL2 ซึ่งหมายถึงบิต 0-2 ควบคุม GPIO 20 และบิต 3-5 ควบคุม GPIO 21 เป็นต้น การลงทะเบียน Set และ CLR กำหนดบิตเดียวให้กับทุกพิน ตัวอย่างเช่น บิต 0 ใน SET0 และ CLR0 ควบคุม GPIO 1 ในการควบคุม GPIO 21 คุณจะต้องตั้งค่าบิต 21 ใน SET0 และ CLR0

ตกลงเราได้พูดคุยเกี่ยวกับวิธีเข้าถึงการลงทะเบียนเหล่านี้ แต่ทั้งหมดนี้หมายความว่าอย่างไร

  • การลงทะเบียน FSEL2 จะใช้ในการตั้งค่า GPIO 21 เป็นเอาต์พุต ในการตั้งค่าพินเป็นเอาต์พุต คุณต้องตั้งค่าบิตลำดับ lo ของสามบิตเป็น 1 ดังนั้นหากบิต 3-5 ควบคุม GPIO 21 นั่นหมายความว่าเราจำเป็นต้องตั้งค่าบิตแรก บิต 3 เป็น 1 นี่จะบอก pi ที่เราต้องการใช้ GPIO 21 เป็นเอาต์พุต ดังนั้นถ้าเราจะดูที่ 3 บิตสำหรับ GPIO 21 พวกเขาควรจะมีลักษณะเช่นนี้หลังจากที่เราตั้งค่าเป็นเอาต์พุต b001
  • GPSET0 บอกให้ pi เปิดพิน (เอาต์พุตแรงดันไฟฟ้า) ในการทำเช่นนี้เราเพียงแค่สลับบิตที่สอดคล้องกับพิน GPIO ที่เราต้องการ ในกรณีของเรา บิต 21
  • GPCLR0 บอกให้ pi ปิดพิน (ไม่มีแรงดันไฟฟ้า) หากต้องการปิดพิน ให้ตั้งค่าบิตเป็นพิน GPIO ที่เกี่ยวข้อง ในกรณีของเราบิต21

ก่อนที่เราจะไปที่ไฟ LED ที่กะพริบ ก่อนอื่นเรามาสร้างโปรแกรมง่ายๆ ที่จะเปิดไฟ LED กันก่อน

ในการเริ่มต้นเราต้องเพิ่มสองคำสั่งที่ด้านบนของซอร์สโค้ดของเรา

  • .section.init บอก pi ว่าจะใส่รหัสที่ไหน
  • .global _start

ต่อไป เราต้องจัดวางที่อยู่ทั้งหมดที่เราจะใช้ ใช้.equ เพื่อกำหนดสัญลักษณ์ที่อ่านได้ให้กับค่า

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

ตอนนี้เรากำลังจะสร้างมาสก์เพื่อตั้งค่าบิตที่เราจำเป็นต้องตั้งค่า

  • .equ SET_BIT3, 0x08 ซึ่งจะตั้งค่าบิตสาม 0000_1000
  • .equ SET_BIT21, 0x20000

จากนั้นเราต้องเพิ่ม _start label. ของเรา

_เริ่ม:

โหลดที่อยู่ฐานลงใน register

ldr r0, =BASE

ตอนนี้เราต้องตั้งค่า bit3 ของ GPFSEL2

  • ldr r1, SET_BIT3
  • str r1, [r0, #GPFSEL2] คำแนะนำนี้บอกให้เขียนกลับบิต 0x08 ไปยังที่อยู่ของ GPFSEL2

สุดท้ายเราต้องตั้งค่า GPIO 21 เป็นเปิดโดยตั้งค่าบิต 21 ในการลงทะเบียน GPSET0

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

ผลิตภัณฑ์ขั้นสุดท้ายควรมีลักษณะเหมือนรหัสในภาพ

ขั้นตอนต่อไปคือการคอมไพล์โค้ดและสร้างไฟล์.img ที่ pi สามารถทำงานได้

  • ดาวน์โหลด makefile ที่แนบมาและ kernel.ld และถ้าคุณต้องการซอร์สโค้ด turn_led_on.s
  • นำไฟล์ทั้งหมดไปไว้ในโฟลเดอร์เดียวกัน
  • หากคุณกำลังใช้ซอร์สโค้ดของคุณเอง ให้แก้ไข makefile และแทนที่โค้ด = turn_led_on.s ด้วย code =.s
  • บันทึก makefile
  • ใช้เทอร์มินัล (ลินุกซ์) หรือหน้าต่าง cmd (หน้าต่าง) เพื่อนำทางไปยังโฟลเดอร์ของคุณที่มีไฟล์และพิมพ์ make และกด Enter
  • ไฟล์ make ควรสร้างไฟล์ชื่อ kernel.img
  • คัดลอก kernel.img ลงในการ์ด mini sd ของคุณ เนื้อหาในการ์ดของคุณควรเป็นไปตามภาพ (รูปที่ 3):bootcode.bin, start.elf, fixup.dat และ kernel.img
  • นำการ์ด mini sd ออกแล้วใส่ลงใน pi
  • เสียบ pi เข้ากับแหล่งพลังงาน
  • LED ควรสว่างขึ้น!!!

หมายเหตุสำคัญเล็กน้อย: เห็นได้ชัดว่าคำสั่งสอนมีปัญหากับ makefile ที่ไม่มีนามสกุล ดังนั้นฉันจึงอัปโหลดใหม่ด้วยนามสกุล.txt โปรดนำส่วนขยายออกเมื่อคุณดาวน์โหลดเพื่อให้ทำงานได้อย่างถูกต้อง

แนะนำ: