สวัสดีครับ สำหรับงานที่ได้รับมอบหมายในสัปดาห์นี้คือ ให้ทำไฟกระพริบตามบอร์ดที่จับฉลากได้ โดยกลุ่มของผมได้บอร์ดทดลอง stm32f4 ซึ่งเป็นของบริษัท ST สำหรับคุณสมบัติต่างๆบนบอร์ดสามารถสรุปได้เป็นข้อๆ ได้ดังนี้
- Core:
- ใช้ ARM Cortex M4 32 bits ที่มี FPU (Floating Point Unit)
- มีการปรับใช้ตัวเร่งของเวลาจริงโดยที่สามารถอนุญาตให้ไม่ต้องคอยจากแฟลชเมมโมรี (ART Accelerator)
- มีความถี่ได้ถึง 168 MHz
- มีการป้องกันหน่วยความจำ (Memory Protection Unit)
- ทีทั้งแบบ 210 DMIPS และ 1.25 DMIPS/MHz (Dhrystone 2.1)
- มีชุดคำสั่งเกี่ยวกับ DSP - Memories: - มีหน่วยความจำประเภทแฟลชได้มากสุด 1MB
- มีหน่วยความจำประเภท SRAM ได้ถึง 192+4 KB ซึ่งรวมไปถึง CCM (core coupled memory) ข้อมูลของแรม 64KB
- มีความยืดหยุ่นในการใช้หน่วยความจำซึ่งรองรับหน่วยความจำดังต่อไปนี้ Compact Flash, SRAM, PSRAM, NOR และ NAND - มีส่วนแสดงผลของหน้าจอเป็น LCD แบบพาราเรล ซึ่งรองรับอยู่ 2 โหมดด้วยกันคือ Intel 8080 และ motorola 6800
- การจัดการเกี่ยวกับ Clock, reset และ supply
- application และ I/Os รองรับการทำงานที่ 1.8 V to 3.6 V
- มี POR (Power-On Reset), PDR, PVD (Programmable Voltage Detector) และ BOR (Brown-Out Reset)
- มีออสซิเลเตอร์คริสตัลได้ตั้งแต่ 4 ถึง 26 MHz
- มี factory-trimmed RC (ความแม่นยำ 1%) ภายใน 16 MHz
- มีออสซิเลเตอร์สำหรับ RTC พร้อมกับ calibration 32 kHz
- มี RC พร้อมกับ calibration ภายใน 32 kHz - การใช้พลังงานในระดับต่ำ- มีโหมดต่างๆดังต่อไปนี้ Sleep, Stop และ Standby
- มี VBAT ซึ่งรองรับสำหรับ RTC, มีรีจิสเตอร์สำหรับการกู้ข้อมูลขนาด 20×32 บิต และมี SRAM (ซึ่งจะมีหรือไม่มีก็ได้) ขนาด 4 KB - 3×12 บิต, ตัวแปลงจากอนาล็อกเป็นดิจิตอล 2.4 MSPSซึ่งมีมากได้ถึง 24 ช่อง และ 7.2 MSPS ในโหมดของ triple interleaved
- ตัวแปลจากดิจิตอลเป็นอนาล็อกขนาด 2×12 บิต
- มี General-purpose DMA: 16-stream DMA controller พร้อมกับ FIFOs และการรองรับการ burst
- มีจำนวนของ timers ถึง 17 timers:
- มี timers ขนาด 16 บิต อยู่ 12 timers และมีอยู่ 2 timers ที่มีขนาด 32 บิต ซึ่งมีความถี่ได้ถึง 168MHz
- แต่ละ timers มีจำนวนของ IC/OC/PWM หรือ pulse counter ได้ถึง 4 และมีอินพุตในการเข้ารหัสได้ถึง 4 - โหมดของการดีบัก
- Serial wire debug (SWD) และ JTAG interfaces
- Cortex-M4 Embedded Trace Macrocell™ - มีพอร์ต I/O มากถึง 140 พอร์ตซึ่งสามารถที่จะทำการอินเตอร์รัพได้
- มีพอร์ตมากถึง 136 พอร์ตซึ่งเป็น fast I/Os โดยสามารถมีความถี่ได้สูงถึง 84 MHz
- มีพอร์ตมากถึง 138 พอร์ตซึ่งเป็น I/Os ที่สามารถรองรับการทำงานได้ที่ 5V - มีพอร์ต 15 พอร์ตที่ใช้เป็นส่วนติดต่อในการสื่อสาร (communication interface)
- มีพอร์ต I2C (SMBus/PMBus) 3 พอร์ต
- มีพอร์ต USARTs 4 พอร์ต พอร์ต UARTs 2 พอร์ต (10.5 Mbit/s, ISO 7816 interface, LIN, IrDA, modem control)
- มีพอร์ต SPI (37.5 Mbits/s) 3 พอร์ต SPIs , มี 2 port ซึ่งเป็น muxed full-duplex I2S to achieve audio class accuracy via internal audio PLL or external clock
- มี CAN interfaces (2.0B Active) 2 พอร์ต
- มีส่วนเชื่อมต่อกับ SDIO - การเชื่อมต่อในขั้นสูง
- มี USB 2.0 full-speed device/host/OTG controller with on-chip PHY
- มี USB 2.0 high-speed/full-speed device/host/OTG controller with dedicated DMA, on-chip full-speed PHY and ULPI
- มี 10/100 Ethernet MAC with dedicated DMA: supports IEEE 1588v2 hardware, MII/RMII - มีส่วนเชื่อมต่อสำหรับกล้องแบบพาราเรล 8 ถึง 14 บิตได้สูงถึง 54 Mbytes/s
- มีตัวสร้างสำหรับการสุ่มเลขที่เป็นเลขจำนวนจริง (True random number generator)
- มีตัวที่ใช้ในการคำนวณ CRC
- มี ID ที่เป็นเอกลักษณ์ 96 บิต
- มี RTC: subsecond accuracy, hardware calendar
อุปกรณ์ที่ใช้
ฮาร์ดแวร์
- บอร์ดทดลอง STM32F4
- สาย USB
ซอฟต์แวร์
- STMCubeMX
- keil toolchain
ผลการทดลอง
โค้ดที่ใช้ในการทดลอง
สำหรับคำสั่งต่างๆนั้นสามารถอธิบายได้ดังต่อไปนี้
รูปประกอบการทดลอง
สำหรับคำสั่งต่างๆนั้นสามารถอธิบายได้ดังต่อไปนี้
- #include "stm32f4xx_hal.h" เป็นการประกาศเรียกใช้ฟังก์ชัน HAL
- static void MX_GPIO_Init(void); เป็นการประกาศฟังก์ชันโปรโตไทป์
- HAL_Init(); เป็นฟังก์ชันสำหรับการตั้งค่า Flash prefetch, ตั้งค่าแหล่งที่มาของฐานเวลา (time base source), NIVC และ ฮาร์ดแวร์ในระดับล่าง
- HAL_GPIO_WritePin(); เป็นฟังก์ชันสำหรับการกำหนดค่าหรือการเคลียร์ค่าบิตของข้อมูล โดยที่ GPIO_PIN_SET เป็นพารามิเตอร์สำหรับการตั้งค่าบิตของข้อมูล ส่วน GPIO_PIN_RESET เป็นพารามิเตอร์สำหรับการเคลียร์ค่าบิตของข้อมูล
- HAL_Delay(); เป็นฟังก์ชันสำหรับการหน่วงเวลาโดยมีหน่วยเป็นมิลลิวินาที
- GPIO_InitTypeDef เป็นการกำหนดค่าต่างๆให้กับพิน GPIO โดยมีพารามิเตอร์ต่างๆดังนี้
- GPIO_Instruct.Pin เป็นการกำหนดพิน GPIO โดยเฉพาะ
- GPIO_Instruct.Mode เป็นการกำหนดโหมดการทำงานให้กับพิน เช่น กำหนดให้เป็นอินพุต เอาต์พุต ในทีนี้เป็น GPIO_MODE_OUTPUT_PP ซึ่งคือโหมด output push pull
- GPIO_Instruct.Pull เป็นการกำหนดให้พินนั้นเป็นแบบ pull-up , pull-down หรือ NOPULL โดยในที่นี้กำหนดให้เป็นแบบ NOPULL ซึ่งมีความหมายว่าไม่ได้กำหนดให้เป็น pull-up หรือ pull-down
- GPIO_Instruct.Speed เป็นการกำหนดค่าของความเร็วของพินนั้นๆ ซึ่งในที่นี้กำหนดให้เป็น GPIO_SPEED_LOW ซึ่งคือความเร็วต่ำ - HAL_GPIO_Init(); เป็นการกำหนดค่าเริ่มต้นของอุปกรณ์การเชื่อมต่อ GPIOx ที่ได้ระบุพารามิเตอร์ไว้ใน GPIO_Init
รูปประกอบการทดลอง
![]() |
| ภาพรวมของวงจร |
![]() |
| ขณะที่ไฟ led ติด |
![]() |
| ขณะไฟ led ดับ |
วิดิโอประกอบการทดลอง




