การใช้งาน Internal Flash Memory

download all demo files: Flash.7z

บทนำ

สิ่งสำคัญอย่างหนึ่งใน ระบบสมองกลฝังตัว ที่ต้องมี คือ หน่วยความจำ หรือ Memory ใช้สำหรับบันทึกข้อมูลทั่วไป โปรแกรมหรือชุดคำสั่งที่ผู้ใช้ป้อนเข้าไปเพื่อให้ระบบทำงานตามที่เราต้องการ โปรแกรมที่เราเขียนในภาษา C หรือใช้ Waijung Blockset จะถูก compile เป็นชุดคำสั่งในรูปแบบ .hex หรือ .bin File แล้วทำการโปรแกรมลงในหน่วยความจำของ Microcontroller ซึ่งปัจจุบันจะใช้เป็นแบบ Flash Memory ซึ่งสามารถลบหรือเขียน ซ้ำๆกันได้ หลายครั้ง นอกจากนี้พื้นที่บางส่วนของ Flash Memory จะจัดสรรไว้สำหรับบันทึกข้อมูลทั่วไป ขึ้นอยู่กับผู้ผลิต Microcontroller ว่า ให้พื้นที่ขนาดเท่าไร

บอร์ด STM32F4DISCOVERY ซึ่งใช้ไมโครคอนโทรลเลอร์ STM32F407VGT6 มีหน่วยความจำแบบ Flash ความจุ 1 MByte การเก็บข้อมูลในหน่วยความจำเปรียบเสมือนการเก็บเอกสารไว้ในตู้เป็นชั้นๆ เพื่อระบุว่าข้อมูลชุดนี้เก็บไว้ส่วนไหน จึงต้องมี Address โดยผู้ใช้งานสามารถเลือกได้อย่างอิสระว่า จะเก็บไว้ที่ Address อะไร ซึ่งแต่ละ Address มีความจุ 1 ไบต์หรือข้อมูล 8 บิต การอ่านหรือเขียน Flash Memory สามารถทำทีละไบต์ได้ แต่การลบจะต้องทำทั้งหมด ใน STM32F4 จึงมีการแบ่ง Flash Memory ไว้เป็น Sector โดยจะแบ่ง Address ออกเป็นช่วงๆ ดังรูป 1‑1

การจัดสรรพื้นที่ของ Flash Memory ภายใน STM32F407 [1, p. 54]

รูป 1-1 การจัดสรรพื้นที่ของ Flash Memory ภายใน STM32F407 [1, p. 54]

การจัดสรรพื้นที่ของ Flash Memory ภายใน STM32F407มีรายละเอียดดังนี้

  • หน่วยความจำหลัก แบ่งออกเป็น 11 Sector โดย Sector ที่ 0-3 มีขนาด 16 กิโลไบต์ Sector ที่ 4 มีขนาด 64 กิโลไบต์ Sector ที่ 5-11 มีขนาด 128 กิโลไบต์
  • System memory สำหรับ boot เมื่ออยู่ในโหมดการทำงาน System memory boot mode
  • หน่วยความจำเขียนได้ครั้งเดียว สำหรับใช้งานทั่วไป ขนาด 512 กิโลไบต์ (อีก 16 ไบต์ ใช้สำหรับ lock ข้อมูล)
  • Option bytes ใช้สำหรับตั้งค่าการใช้งาน Read/Write protection, Brownout reset (ส่วนตรวจจับระดับไฟเลี้ยง), การใช้งาน Hardware/Software Watchdog เป็นต้น

ใน Waijung library มี Blockset สำหรับใช้งาน Internal Flash Memory ซึ่งประกอบด้วย Block สำหรับลบ เขียนและอ่านข้อมูล โดยยังจำกัดการใช้งานเฉพาะ Sector ที่ 5 ถึง 11 เท่านั้น

วิธีการใช้งาน Flash Block

ใน Simulink library >> Waijung Blockset >> STM32F4 target >> On Peripheral Chip >> FLASH ประกอบด้วย Blockset สำหรับจัดการข้อมูลใน Flash Memory มีดังนี้

Flash Erase มีลักษณะและคุณสมบัติรูป 1-2 ใช้สำหรับสำหรับลบข้อมูลทั้ง Sector ซึ่งใช้เวลาประมาณ 1-2 วินาทีสำหรับพี้นที่ 128 กิโลไบต์ [2, p. 106]

รูป 1 2 ลักษณะและคุณสมบัติของ Flash Erase Block

รูป 1-2 ลักษณะและคุณสมบัติของ Flash Erase Block

Flash Read ซึ่งมีลักษณะและคุณสมบัติรูป 1-3 ใช้สำหรับสำหรับอ่านข้อมูลใน Address ที่ระบุ การระบุ Address ที่ต้องการจะอ่าน ยกตัวอย่างเช่น ต้องการอ่านข้อมูลที่ Address: 0x080E0500 มีขั้นตอนดังนี้

  • จากค่า Address ที่ต้องการอ่าน เลือก Sector ให้ถูกต้อง ซึ่ง Address: 0x080E0500 อยู่ใน Sector 11
  • หาค่า Offset โดย Offset = Addressที่ต้องการอ่าน – AddressตัวแรกในSector

ดังนั้น Offset = 0x80E0500 – 0x80E0000
= 0x0000500 = 20480 (ในเลขฐานสิบ)

รูป 1-3 ลักษณะและคุณสมบัติของ Flash Read Block

รูป 1-3 ลักษณะและคุณสมบัติของ Flash Read Block

Flash Write ซึ่งมีลักษณะและคุณสมบัติรูป 1-4 ใช้สำหรับสำหรับบันทึกข้อมูลใน Address ที่ระบุ ซึ่งการกำหนด Address และ Offset ใช้วิธีเดียวกับที่กล่าวมาในส่วนของ Flash Read Block

รูป 1-4 ลักษณะและคุณสมบัติของ Flash Write Block

รูป 1-4 ลักษณะและคุณสมบัติของ Flash Write Block

การทดลองใช้งาน Internal Flash Memory

อุปกรณ์ที่ใช้ในการทดลอง

การทดลองบันทึกและลบข้อมูล

จุดประสงค์

  • เพื่อให้ผู้ใช้งานสามารถเข้าใจขั้นตอนการบันทึกข้อมูลลงใน Flash Memory ได้
  • เพื่อให้ผู้ใช้งานสามารถเข้าใจขั้นตอนการลบข้อมูลใน Flash Memory ได้
  • เพื่อให้ผู้ใช้งานสามารถสังเกตการเปลี่ยนแปลงข้อมูลใน Memory ผ่านโปรแกรม STM32 ST-LINK Utility
รูป 2-1 Simulink Model สำหรับการทดลองบันทึกหรือลบข้อมูล Flash Memory

รูป 2-1 Simulink Model สำหรับการทดลองบันทึกหรือลบข้อมูล Flash Memory

ตัวอย่างนี้จะทำการทดลองบันทึกหรือลบข้อมูล Flash Memory ที่ Address: 0x080E0500 โดยใช้ Simulink Model ดังรูป 2‑1 เป็น Model หลักซึ่งประกอบด้วยชุด Block ต่างๆที่ทำหน้าที่ อยู่ 3 ส่วน ดังนี้

  1. วงจรไฟกระพริบ เพื่อให้ผู้ใช้งานสังเกตการทำงาน ในขณะที่มีการบันทึกหรือลบข้อมูล
  2. รับสัญญาณจากสวิตซ์ปุ่มกด SW2 ซึ่งต่อกับขา PB15 เพื่อลบข้อมูลใน Sector ของ Flash Memory โดยภายใน Subsystem Block สำหรับลบข้อมูลแสดงดังรูป 2‑2 หากต้องการลบ Sector อื่นๆ ด้วย ผู้ใช้งานต้องวาง Flash Erase Block เพิ่มและเลือก Sector ที่ต้องการลบ

    รูป 2 2 ภายใน FlashErase Subsystem model

    รูป 2-2 ภายใน FlashErase Subsystem model

  3. รับสัญญาณจากสวิตซ์ปุ่มกด SW1 ซึ่งต่อกับขา PB2 เพื่อบันทึกข้อมูลลงใน Address:0x080E0500 โดยผู้ใช้งานสามารถกำหนดหรือป้อนข้อมูลด้วยการปรับ DIP Switch ค่าที่ได้จะแปลงเป็นจำนวนเต็มชนิด 8 บิต และส่งไปยัง Subsystem ดังรูป 2‑3

    รูป 2-3 ภายใน FlashWritingSeq Subsystem model

    รูป 2-3 ภายใน FlashWritingSeq Subsystem model

ข้อควรระวัง สำหรับการเขียนหรือบันทึกข้อมูลลงใน Flash Memory ก่อนเริ่มจะต้องทำการ Erase ทุกครั้งโดยใช้ Flash Erase Block ซึ่งจะทำการลบข้อมูลทั้ง Sector

เมื่อ Download Simulink Model ลงในบอร์ด STM32F4DISCOVERY หลอด LED1 ซึ่งต่อกับขา PD12 จะกระพริบ สำหรับสังเกตการเปลี่ยนแปลงของ Flash Memory ในการทดลองนี้ วิธีการใช้งานโปรแกรม STM32 ST-Utility มีขั้นตอนหลักดังนี้

ขั้นตอนการเชื่อมต่อ STM32 ST-Utility

  • เปิดโปรแกรม STM32 ST-Utility จากนั้น เลือกไอคอน Connect to target บนหน้าต่างของ โปรแกรม ST-Link Utility เพื่อเริ่มการเชื่อมต่อ STM32Discovery

    รูป 2-4 หน้าต่างโปรแกรม STM32 ST-LINK Utility หลังจากเชื่อมต่อกับบอร์ด STM32F4DISCOVERY ได้

    รูป 2-4 หน้าต่างโปรแกรม STM32 ST-LINK Utility หลังจากเชื่อมต่อกับบอร์ด STM32F4DISCOVERY ได้

  • เมื่อเชื่อมต่อได้ ID ของบอร์ด STM32F4DISCOVERY ข้อมูลในหน่วยความจำ สถานะของการเชื่อมต่อ จะปรากฏดังรูป 2‑4 ในขณะเชื่อมต่อ หลอดไฟ LD1 บนบอร์ด STM32F4DISCOVERY จะกระพริบ ในเบื้องต้นการทำงานของบอร์ดจะหยุดชั่วคราว (Halt)
  • เลือก Menu >> target >> MCU Core… จากมีหน้าต่าง Core panel ปรากฏดังรูป 2‑5 กดปุ่ม Run เพื่อให้ไมโครคอนโทรเลอร์ทำงานต่อ จากตัวอย่างนี้ หลอดไฟ LED1 จะกระพริบต่อ

    รูป 2-5 หน้าต่าง Core panel

    รูป 2-5 หน้าต่าง Core panel

  • ยกเลิกการใช้งาน LiveUpdate โดย Tick ออก ซึ่งอยู่ใต้ Device Information
  • หากต้องการ Incremental Build หรือ DownloadSimulink Model ใหม่ ผู้ใช้งานต้องเลือกไอคอน Disconnect ทุกครั้ง

ขั้นตอนการใช้งาน Memory Display

ข้อมูลในหน่วยความจำจะแสดงออกมารูปแบบเลขฐานสิบหก โดยจัดอยู่ในตารางแต่ Row และ Column แสดงตำแหน่ง Address ผู้ใช้งานสามารถปรับหน้าต่างในส่วนของ Memory display ได้ดังนี้

  • Address เพื่อเลือกตำแหน่งแรกของ Address เช่น ตั้งค่า 0x0800E000 ข้อมูลใน Address ตำแหน่งนั้นจะอยู่มุมบนซ้าย ดังรูป 2‑6
  • SizeAddress เพื่อกำหนดจำนวน Address ที่ต้องการแสดงผลในตารางทั้งหมด
  • ปรับ Data Width เพื่อดูข้อมูลแบบ 8 bits(1 ไบต์), 16 bits (2 ไบต์) หรือ 32 bits (4 ไบต์)
รูป 2-6 หน้าต่างแสดงผลข้อมูลในหน่วยความจำ (Data Width 32 bits หรือ 4 Bytes)

รูป 2-6 หน้าต่างแสดงผลข้อมูลในหน่วยความจำ (Data Width 32 bits หรือ 4 Bytes)

เมื่อผู้ใช้งานตั้งค่า Data Width: 8 bits บน Memory Display หน้าต่างแสดงผลข้อมูลจะปรับเปลี่ยนดังรูป 2-7 โดยแต่ละ Address จะมีข้อมูล 8 บิต (ค่า 00 ถึง FF)

รูป 2-7 หน้าต่างแสดงผลข้อมูลในหน่วยความจำ (Data Width 8 bits หรือ 1 Byte)

รูป 2-7 หน้าต่างแสดงผลข้อมูลในหน่วยความจำ (Data Width 8 bits หรือ 1 Byte)

ทดลองเขียนและลบข้อมูล

  1. ผู้ใช้งานปรับตำแหน่ง DIP Switch ที่ต้องการ เช่น ตำแหน่งที่ 1 ถึง 4 เท่ากับ ON-ON-OFF-OFF ตามลำดับ
  2. กดสวิตซ์ SW1 ค้างประมาณ 1 วินาที (Denounced Count:128) สังเกตหลอด LED1 จะค้างชั่วคราวในขณะที่มีการลบและเขียนข้อมูล
  3. กดช่อง LiveUpdate เพื่อดูค่าใน Address: 0x080E0500 แสดง ดังรูป 2-8

    รูป 2-8 หน้าต่างแสดงผลข้อมูลในหน่วยความจำ หลังทำการเขียนข้อมูล

    รูป 2-8 หน้าต่างแสดงผลข้อมูลในหน่วยความจำ หลังทำการเขียนข้อมูล

  4. หากต้องการแก้ไขข้อมูล ให้ปิดการใช้งาน LiveUpdate แล้วทำขั้นตอนที่ 2 และ 3 อีกครั้ง
  5. กดสวิตซ์ SW2 ค้างประมาณ 1 วินาที เพื่อลบข้อมูลใน Sector 11 (ปิดการใช้งาน LiveUpdate ทุกครั้งที่การแก้ไขข้อมูลใน Flash Memory)
  6. ทำขั้นตอนที่ 3 เพื่อดูข้อมูล โดยผลลัพธ์แสดงดังรูป 2‑9 ซึ่งข้อมูลในหน่วยความจำ ที่ Address: 0x080E500 จะมีค่าเท่ากับ FF
รูป 2-9 หน้าต่างแสดงผลข้อมูลในหน่วยความจำ หลังทำการลบข้อมูล

รูป 2-9 หน้าต่างแสดงผลข้อมูลในหน่วยความจำ หลังทำการลบข้อมูล

การทดลองอ่านข้อมูลจาก Flash Memory

จุดประสงค์

  • เพื่อให้ผู้ใช้งานสามารถอ่านข้อมูลจาก Flash Memory โดยใช้ Flash Read Block ได้
รูป 2-10 Simulink Model สำหรับอ่านข้อมูลจาก Flash Memory และแสดงผลผ่านจอ LCD

รูป 2-10 Simulink Model สำหรับอ่านข้อมูลจาก Flash Memory และแสดงผลผ่านจอ LCD

จากตัวอย่างการทดลองที่ผ่านมา ผู้ใช้งานสามารถสังเกตข้อมูลผ่านโปรแกรม STM32 ST-Utility ซึ่งต้องเชื่อมต่อผ่านสาย USB ในการทดลองนี้ผู้ใช้งานสามารถสังเกตค่าที่บันทึกผ่านหน้าจอแสดงผล LCD ได้

การทดลองนี้ใช้ Model ในรูป 2‑10 สำหรับอ่านข้อมูลจาก Flash Memory และแสดงผลผ่านจอ LCD ซึ่งมีส่วนที่เพิ่มเติมจาก Model ในรูป 2‑1 คือส่วนรับสัญญาณจากสวิตซ์ปุ่มกด SW3 เพื่อ Update ค่าที่อ่านได้จาก Flash Memory แล้วแสดงผลผ่าน LCD รูป 2‑11 แสดงภายใน Subsystem Model ใช้สำหรับอ่านข้อมูลที่ Address: 0x080E0500

รูป 2-11 FlashRead Subsystem Model สำหรับอ่านข้อมูลจาก Flash Memory

รูป 2-11 FlashRead Subsystem Model สำหรับอ่านข้อมูลจาก Flash Memory

เมื่อ Download Model ลงในบอร์ด STM32F4DISCOVERY ให้ผู้ใช้งานกดสวิตซ์ SW3 ค้างประมาณ 1 วินาที จากนั้นหน้าจอ LCD จะแสดงค่าที่อ่านได้จาก Flash Memory รูป 2‑12 แสดงค่าที่อ่านได้หลังจาก ลบข้อมูล (กดสวิตซ์ SW2) และค่าที่อ่านได้หลังจากบันทึกค่า 0x0C ลงใน Address: 0x080E0500

รูป 2-12 ค่าที่อ่านได้จาก Flash Memory ผ่านจอแสดงผล LCD

รูป 2-12 ค่าที่อ่านได้จาก Flash Memory ผ่านจอแสดงผล LCD

หากต้องการเขียนข้อมูลหลายๆ ชุด สามารถทำได้โดยแก้ไข Block ภายใน FlashWriteSeq Subsystem ดังรูป 2-13 ซึ่งตัวอย่างสำหรับอ่านเขียนข้อมูล 3 ชุด ที่มีชนิดของตัวแปรต่างๆกัน (uint8, uint32 และsingle) ผู้ใช้งานสามารถวาง Flash Write block เพิ่มได้ทันที และกำหนด Address ต่างๆ กัน โดยห่างกัน 4 Bytes

รูป 2-13 ตัวอย่าง Subsystem model สำหรับเขียนหรือบันทึกข้อมูลใน Flash Memory หลายๆ ชุด

รูป 2-13 ตัวอย่าง Subsystem model สำหรับเขียนหรือบันทึกข้อมูลใน Flash Memory หลายๆ ชุด

ดังนั้นจากตัวอย่าง หากค่าที่อ่านได้จาก DIP Switch มีค่าเท่ากับ 12 ข้อมูลใน Address: 0x080E504 จะมีค่าเท่ากับ 12000 และ Address: 0x080E508 จะมีค่าเท่ากับ 1481.40 เป็นต้น ผู้ใช้สามารถตรวจสอบข้อมูลใน Flash Memory จากหน้าต่างแสดงผลข้อมูลในหน่วยความจำ ดังรูป 2-14

รูป 2-14 หน้าต่างแสดงผลข้อมูลในหน่วยความจำ

รูป 2-14 หน้าต่างแสดงผลข้อมูลในหน่วยความจำ

การแสดงข้อมูลเลขทศนิยมแบบ Single เป็น เลขฐานสอง 32 บิต สามารถดูรายละเอียดได้ที่ http://www.h-schmidt.net/FloatConverter/IEEE754.html ซึ่งเป็นมาตราฐาน IEEE-754
รูป 2-15 เป็นตัวอย่าง Subsystem สำหรับอ่านข้อมูล 3 ชุด ที่มีชนิดของตัวแปรต่างๆกัน (uint8, uint32 และ single) ผู้ใช้งานสามารถวาง Flash Read block เพิ่มได้ทันที และกำหนด Address ที่ต้องการจะอ่าน

รูป 2-15 ตัวอย่าง Subsystem model สำหรับอ่านข้อมูลจาก Flash Memory หลายๆ ชุด

รูป 2-15 ตัวอย่าง Subsystem model สำหรับอ่านข้อมูลจาก Flash Memory หลายๆ ชุด

เมื่อ Download Model แล้วทำการบันทึกข้อมูลที่ได้จาก DIP Switch โดยกดสวิตซ์ SW1 และกดสวิตซ์ SW2 เพื่อแสดงผลผ่านจอ LCD ดังรูป 2‑16

รูป 2-16 ค่าที่อ่านได้จาก Flash Memory หลายๆชุด แสดงผลผ่านจอ LCD

รูป 2-16 ค่าที่อ่านได้จาก Flash Memory หลายๆชุด แสดงผลผ่านจอ LCD

แม้ว่าผู้ใช้งานจะทำการปิด-เปิดไฟเลี้ยงหรือ Download Model ลงบอร์ด STM32F4DISCOVERY อีกครั้ง ข้อมูลที่อยู่ใน Sector 5 – Sector 11 ก็ยังไม่เปลี่ยนแปลง การใช้งาน Flash Memory ภายใน จึงเหมาะสำหรับประยุกต์ใช้งานที่ไม่ค่อยมีการเปลี่ยนแปลงข้อมูลบ่อยนัก เช่นงานด้านความปลอดภัย หรือการตั้งค่าการใช้งานต่างๆ

เอกสารอ้างอิง

  1. STMicroelectronics, “RM0090: STM32F40xxx Reference Manual [Online],” 2013.
  2. STMicroelectronics, “STM32 F407xx Datasheet-production data [Online],” 2013.
  3. STMicroelectronics, “User manual: STM32 ST-LINK Utility software description [Online],” 2014.
  4. Olaf Pfeiffer and Andrew Ayre, “Using Flash Memory in Embedded Applications,” [Online]. Available: http://www.esacademy.com/en/library/technical-articles-and-documents/8051-programming/using-flash-memory-in-embedded-applications.html.
  5. IEEE, “IEEE Standard for Floating-Point Arithmetic”, 2008
  6. http://en.wikipedia.org/wiki/IEEE_754-1985