CircuitPython for STM32

แนะนำการใช้งาน CircuitPython สำหรับบอร์ดไมโครคอนโทรลเลอร์ที่ใช้ ARM Cortex M4F ตระกูล STM32F4 เช่น บอร์ด STM32F411CE Black Pill

วิธีการติดตั้ง CircuitPython สำหรับ STM32

บอร์ดไมโครคอนโทรลเลอร์ที่ได้เลือกนำมาใช้งานได้แก่ STM32F411CE (ARM Cortex-M4F) Black Pill สามารถติดตั้งเฟิร์มแวร์ CircuitPython โดยใช้วิธี DFU ผ่านทางพอร์ต USB (USB Type-C) และเป็นวิธีที่ทำได้ง่าย ไม่ต้องใช้อุปกรณ์เสริม เช่น ST-Link Programmer เป็นต้น

ถัดไปให้เตรียมอุปกรณ์ฮาร์ดแวร์และซอฟต์แวร์ดังนี้

  • เชื่อมต่อขา A10 (PA10) ด้วยสาย Jumper Wire กับตัวต้านทาน เช่น 10k แบบ Pullup ไปยัง 3.3V

  • เสียบสาย USB-C เชื่อมต่อบอร์ดไมโครคอนโทรลเลอร์กับคอมพิวเตอร์

  • กดปุ่ม BOOT0 กดค้างไว้ กดปุ่ม RESET แล้วจึงปล่อยปุ่ม RESET และ BOOT0 ตามลำดับ เพื่อเข้าสู่ใหมด DFU-USB

  • ดาวน์โหลดและติดตั้งโปรแกรม STM32CubeProgrammer สำหรับ Windows 10 หรือ Linux เป็นต้น

  • ดาวน์โหลดไฟล์เฟิร์มแวร์ CircuitPython (.bin) สำหรับ STM32F411CE: https://circuitpython.org/board/stm32f411ce_blackpill/

เมื่อทำขั้นตอนทั้งหมดแล้ว และรีเซตบอร์ด จะมองเห็นไดรฟ์ชื่อ CIRCUITPY สามารถใช้ Thonny IDE หรือ Mu Editor เชื่อมต่อผ่าน REPL ได้

บอร์ด STM32F411CE Black Pill ใช้ชิป stm32F411ceu6 เป็นตัวประมวลผล มีหน่วยความจำ SRAM 128KB และ Flash 512KB และใช้ความเร็วได้ถึง 100MHz

ถ้าเปรียบเทียบกับ SAMD21 จะเห็นว่า STM32F411CE มีความจุหน่วยความจำมากกว่า และทำงานด้วยความถี่ที่สูงกว่า

ให้ทดลองรันโค้ดต่อไปนี้ เพื่อดูข้อมูลเกี่ยวกับขนาดของหน่วยความจำที่เหลืออยู่ (Free Memory) และที่ถูกใช้ไป (Allocated Memory)

import gc

text = 'Memory Info\n- Free: {} bytes\n- Allocated: {} bytes'
values = (gc.mem_free(), gc.mem_alloc())
print( text.format(*values) )

ตัวอย่างข้อความเอาต์พุต (เมื่อรันสคริปต์โดยใช้ซอฟต์แวร์ Thonny IDE)

Memory Info
- Free: 71520 bytes
- Allocated: 2208 bytes

หรือลองโค้ดตัวอย่างที่ทำให้ LED บนบอร์ดกระพริบ ซึ่งตรงกับขา PC13

import time
import digitalio
import board
from microcontroller import pin


## use onboard LED (blue) / PC13
## 1) use board LED  pin or
#led = digitalio.DigitalInOut(board.LED)
## 2) use microcontroller pin
led = digitalio.DigitalInOut(pin.PC13)
## output direction for the LED pin
led.direction = digitalio.Direction.OUTPUT

try:
    while True:
        led.value = not led.value # toggle output
        time.sleep(0.1)
except KeyboardInterrupt:
    pass
led.deinit() # release the LEd pin
print('Done')

เผยแพร่ภายใต้ลิขสิทธิ์ Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)

Last updated