machine --- ฟังก์ชันที่เกี่ยวข้องกับฮาร์ดแวร์

โมดูล machine ประกอบด้วยฟังก์ชันเฉพาะที่เกี่ยวข้องกับฮาร์ดแวร์บนบอร์ดนั้นๆ ฟังก์ชันส่วนใหญ่ในโมดูลนี้ช่วยให้สามารถเข้าถึงและควบคุมบล็อกฮาร์ดแวร์บนระบบได้โดยตรงและไม่จำกัด (เช่น CPU, ตัวจับเวลา, บัส เป็นต้น)

การเข้าถึงหน่วยความจำ

โมดูลนี้เปิดเผยออบเจ็กต์แบบ subscriptable สามตัวสำหรับการเข้าถึงหน่วยความจำดิบ แต่ละตัวทำงานเหมือน sparse array ที่ใช้ที่อยู่ไบต์เป็นดัชนี: value = memN[addr] อ่าน และ memN[addr] = value เขียน ที่อยู่เป็นที่อยู่ไบต์เสมอโดยไม่คำนึงถึงความกว้างในการเข้าถึง

machine.mem8

ตัวเข้าถึงหน่วยความจำ 8 บิตแบบ subscriptable mem8[addr] อ่าน int ในช่วง 0-255 จากไบต์ที่ addr; mem8[addr] = value เขียน 8 บิตต่ำของ value โดย addr ต้องอยู่ในแนวที่ 1 ไบต์ (ที่อยู่ใดก็ได้)

machine.mem16

ตัวเข้าถึงหน่วยความจำ 16 บิต (halfword) แบบ subscriptable mem16[addr] อ่าน int ในช่วง 0-65535; mem16[addr] = value เขียน 16 บิตต่ำ โดย addr ต้องอยู่ในแนวที่ 2 ไบต์

machine.mem32

ตัวเข้าถึงหน่วยความจำ 32 บิต (word) แบบ subscriptable mem32[addr] อ่าน int ในช่วง 0-0xFFFFFFFF; mem32[addr] = value เขียน 32 บิตต่ำ โดย addr ต้องอยู่ในแนวที่ 4 ไบต์

ตัวอย่างการใช้งาน (รีจิสเตอร์เฉพาะสำหรับไมโครคอนโทรลเลอร์ STM32H7 -- บน OpenMV Cam H7 / H7 Plus / Pure Thermal หัวต่อ P0 ต่อกับ PB15)

import machine
from micropython import const

GPIOB = const(0x58020400)
GPIO_BSRR = const(0x18)
GPIO_IDR = const(0x10)

# set P0 (PB15) high via the GPIOB bit-set/reset register
machine.mem32[GPIOB + GPIO_BSRR] = 1 << 15

# read P0 (PB15) directly out of the GPIOB input-data register
value = (machine.mem32[GPIOB + GPIO_IDR] >> 15) & 1

ฟังก์ชันเบ็ดเตล็ด

machine.unique_id() bytes

คืนค่าออบเจ็กต์ bytes ที่มีตัวระบุเฉพาะสำหรับบอร์ดนี้ ค่านี้อ่านจากฮาร์ดแวร์ของ MCU (โดยทั่วไปคือหมายเลขซีเรียลของอุปกรณ์ที่โปรแกรมมาจากโรงงาน) จึงคงที่ตลอดการรีบูตและแตกต่างกันในแต่ละบอร์ด

ความยาวขึ้นอยู่กับตระกูล MCU -- 12 ไบต์บน STM32, 8 ไบต์บนพอร์ต mimxrt และ alif หากแอปพลิเคชันต้องการ ID ความยาวคงที่ ให้ตัดหรือแฮชค่าที่คืนมา

machine.time_pulse_us(pin: Pin, pulse_level: int, timeout_us: int = 1000000, /) int

วัดความกว้างของพัลส์เดียวบน pin และคืนค่าระยะเวลาเป็นไมโครวินาที

pin ต้องกำหนดค่าเป็นอินพุตดิจิทัล

pulse_level คือขั้วของพัลส์ที่จะจับเวลา: 1 สำหรับพัลส์สูง, 0 สำหรับพัลส์ต่ำ

ฟังก์ชันทำงานใน 2 ระยะ ประการแรก หากพินยังไม่อยู่ที่ pulse_level ฟังก์ชันจะรอให้พินเปลี่ยนไปที่ pulse_level (จุดเริ่มต้นของพัลส์) จากนั้นวัดเวลาที่พินอยู่ที่ pulse_level ก่อนเปลี่ยนกลับ (จุดสิ้นสุดของพัลส์) เวลาที่วัดได้จะคืนค่าเป็นไมโครวินาที

timeout_us จำกัด แต่ละ ระยะอย่างอิสระ (ดังนั้นการเรียกในกรณีเลวร้ายที่สุดจะใช้เวลาสูงสุด 2 * timeout_us) เมื่อหมดเวลา ฟังก์ชันจะคืนค่าลบที่ระบุว่าระยะใดหมดเวลา:

  • -2 -- หมดเวลารอขอบนำ (พินไม่เคยถึง pulse_level)

  • -1 -- หมดเวลารอขอบตาม (พัลส์ยาวกว่า timeout_us)

machine.bitstream(pin: Pin, encoding: int, timing: tuple, data: bytes, /) None

ส่ง data โดยการ bit-bang บน pin ที่ระบุ อาร์กิวเมนต์ encoding ระบุวิธีเข้ารหัสบิต และ timing คือข้อกำหนด timing เฉพาะสำหรับการเข้ารหัสนั้น

การเข้ารหัสที่รองรับ ได้แก่:

  • 0 สำหรับการมอดูเลตระยะเวลาพัลส์ "high low" ซึ่งจะส่งบิต 0 และ 1 เป็นพัลส์ที่จับเวลา โดยเริ่มจากบิตนัยสำคัญสูงสุด timing ต้องเป็น tuple สี่ค่าของนาโนวินาทีในรูปแบบ (high_time_0, low_time_0, high_time_1, low_time_1) ตัวอย่างเช่น (400, 850, 800, 450) คือข้อกำหนด timing สำหรับ LED RGB WS2812 ที่ 800kHz

ความแม่นยำของ timing ขึ้นอยู่กับฮาร์ดแวร์ MCU ที่เร็วกว่าจะให้พัลส์ที่แม่นยำกว่า (โดยทั่วไปหลักสิบนาโนวินาที)

Note

สำหรับการควบคุมแถบ WS2812 / NeoPixel ดูโมดูล neopixel สำหรับ API ระดับสูง

ค่าคงที่

ค่าคงที่ด้านล่างถูกคืนค่าโดย reset_cause() เพื่อระบุสาเหตุที่ MCU รีเซ็ตครั้งล่าสุด ใช้ได้กับพอร์ต STM32 และ mimxrt; พอร์ต alif (OpenMV Cam AE3) ยังไม่เปิดเผยค่าคงที่สาเหตุรีเซ็ตและ reset_cause() จะคืนค่า 0 เสมอ

machine.PWRON_RESET: int

รีเซ็ตจากการจ่ายไฟให้ชิป พอร์ต STM32 และ mimxrt

machine.WDT_RESET: int

รีเซ็ตจากตัวจับเวลา watchdog หมดเวลา พอร์ต STM32 และ mimxrt

machine.SOFT_RESET: int

รีเซ็ตจาก soft_reset() (อินเทอร์พรีเตอร์ Python รีสตาร์ทโดยไม่มีการรีเซ็ตฮาร์ดแวร์) พอร์ต STM32 และ mimxrt

machine.HARD_RESET: int

รีเซ็ตจากการยืนยันพิน NRST (ปุ่ม reset ภายนอก) เฉพาะพอร์ต STM32

machine.DEEPSLEEP_RESET: int

รีเซ็ตจากการตื่นจาก deep-sleep เฉพาะพอร์ต STM32

คลาส