Saturday, April 4, 2015

Blinking LED

สวัสดีครับ สำหรับงานที่ได้รับมอบหมายในสัปดาห์นี้คือ ให้ทำไฟกระพริบตามบอร์ดที่จับฉลากได้ โดยกลุ่มของผมได้บอร์ดทดลอง 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_In
    struct.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 ดับ


 
วิดิโอประกอบการทดลอง
 

No comments:

Post a Comment