SFUD เป็นไลบรารีไดรเวอร์สัดส่วนสากลแบบโอเพนซอร์ส Flash เนื่องจากมีแฟลชอนุกรมหลายประเภทในตลาดข้อกำหนดและคำสั่งของแต่ละแฟลชจึงแตกต่างกัน SFUD ได้รับการออกแบบมาเพื่อแก้ปัญหาความแตกต่างในปัจจุบันในแฟลชเหล่านี้ช่วยให้ผลิตภัณฑ์ของเรารองรับแฟลชของแบรนด์และข้อกำหนดที่แตกต่างกันปรับปรุงความสามารถในการนำกลับมาใช้ใหม่และความสามารถในการปรับขนาดของซอฟต์แวร์ที่เกี่ยวข้องกับฟังก์ชั่นแฟลชและในเวลาเดียวกันก็สามารถหลีกเลี่ยงความเสี่ยงที่เกิดขึ้นกับผลิตภัณฑ์
/sfud/inc/sfud_flash_def.h ) หากไม่รองรับคุณสามารถเพิ่มข้อมูลพารามิเตอร์ของแฟลชนี้ในไฟล์การกำหนดค่า (ดูแฟลชที่ไม่รองรับในห้องสมุดเพิ่ม 2.5 สำหรับรายละเอียด) หลังจากได้รับข้อกำหนดของแฟลชการดำเนินการทั้งหมดบนแฟลชสามารถทำได้ ตารางต่อไปนี้แสดงแฟลชทั้งหมดที่ได้รับการทดสอบแบบเรียลไทม์บนแพลตฟอร์มการสาธิต แฟลชที่ ไม่รองรับ มาตรฐาน SFDP ได้ถูกกำหนดไว้ในตารางข้อมูลพารามิเตอร์แฟลช แฟลชเพิ่มเติมที่ไม่รองรับมาตรฐาน SFDP จะต้อง ได้รับการปรับปรุงและบำรุงรักษา ในอนาคต (GitHub | Oschina | การเข้ารหัส)
หากคุณคิดว่าโครงการโอเพ่นซอร์สนี้ยอดเยี่ยมคุณสามารถคลิก ดาว ที่มุมบนขวาของหน้าแรกของโครงการและแนะนำให้เพื่อนที่ต้องการมากขึ้น
| แบบอย่าง | ผู้ผลิต | ความจุ | ความเร็วสูงสุด | มาตรฐาน SFDP | โหมด QSPI | คำพูด |
|---|---|---|---|---|---|---|
| W25Q40BV | วินบอน | 4MB | 50MHz | ไม่รองรับ | สองเส้น | การผลิตได้ถูกยกเลิก |
| W25Q80DV | วินบอน | 8MB | 104MHz | สนับสนุน | สองเส้น | |
| W25Q16BV | วินบอน | 16MB | 104MHz | ไม่รองรับ | สองเส้น | โดย Slipperstree |
| W25Q16CV | วินบอน | 16MB | 104MHz | สนับสนุน | ไม่ได้ทดสอบ | |
| W25Q16DV | วินบอน | 16MB | 104MHz | สนับสนุน | ไม่ได้ทดสอบ | โดย Slipperstree |
| W25Q32BV | วินบอน | 32MB | 104MHz | สนับสนุน | สองเส้น | |
| W25Q64CV | วินบอน | 64MB | 80MHz | สนับสนุน | สี่บรรทัด | |
| W25Q128BV | วินบอน | 128MB | 104MHz | สนับสนุน | สี่บรรทัด | |
| W25Q256FV | วินบอน | 256MB | 104MHz | สนับสนุน | สี่บรรทัด | |
| MX25L3206E | macronix | 32MB | 86MHz | สนับสนุน | สองเส้น | |
| MX25L3233F | macronix | 32MB | 133MHz | สนับสนุน | ไม่ได้ทดสอบ | โดย Jiapengli |
| KH25L4006E | macronix | 4MB | 86MHz | สนับสนุน | ไม่ได้ทดสอบ | โดย Jiapengli |
| KH25L3206E | macronix | 32MB | 86MHz | สนับสนุน | สองเส้น | |
| SST25VF016B | ไมโครชิป | 16MB | 50MHz | ไม่รองรับ | ไม่รองรับ | SST ได้มาโดย Microchip |
| M25P40 | ไมครอน | 4MB | 75MHz | ไม่รองรับ | ไม่ได้ทดสอบ | โดย redoccheng |
| M25P80 | ไมครอน | 8MB | 75MHz | ไม่รองรับ | ไม่ได้ทดสอบ | โดย redoccheng |
| m25p32 | ไมครอน | 32MB | 75MHz | ไม่รองรับ | ไม่รองรับ | |
| EN25Q32B | กัป | 32MB | 104MHz | ไม่รองรับ | ไม่ได้ทดสอบ | |
| GD25Q16B | กิกะไบต์ | 16MB | 120MHz | ไม่รองรับ | ไม่ได้ทดสอบ | โดย Tanekliang |
| GD25Q32C | กิกะไบต์ | 32MB | 120MHz | ไม่รองรับ | ไม่ได้ทดสอบ | โดย gaupen1186 |
| GD25Q64B | กิกะไบต์ | 64MB | 120MHz | ไม่รองรับ | สองเส้น | |
| S25FL216K | ไซเปรส | 16MB | 65MHz | ไม่รองรับ | สองเส้น | |
| S25FL032P | ไซเปรส | 32MB | 104MHz | ไม่รองรับ | ไม่ได้ทดสอบ | โดย yc_911 |
| S25FL164K | ไซเปรส | 64MB | 108MHz | สนับสนุน | ไม่ได้ทดสอบ | |
| A25L080 | อื้ออึง | 8MB | 100MHz | ไม่รองรับ | สองเส้น | |
| A25LQ64 | อื้ออึง | 64MB | 104MHz | สนับสนุน | สนับสนุน | |
| F25L004 | ESMT | 4MB | 100MHz | ไม่รองรับ | ไม่รองรับ | |
| PCT25VF016B | PCT | 16MB | 80MHz | ไม่รองรับ | ไม่รองรับ | ใบอนุญาต SST จะถูกระบุว่าเป็น SST25VF016B |
| AT45DB161E | อาดิสโต | 16MB | 85MHz | ไม่รองรับ | ไม่รองรับ | Adesto ได้รับสายผลิตภัณฑ์ Atmel Serial Flash |
| NM25Q128EV | nor_mem | 128MB | ไม่ได้ทดสอบ | ไม่รองรับ | ไม่ได้ทดสอบ | SFDP อาจอ่านข้อมูลและระบุว่าเป็นมากกว่า 32GB |
| P25D40H | puya | 4MB | ไม่ได้ทดสอบ | สนับสนุน | ไม่ได้ทดสอบ | โดย Shan |
| P25Q80H | puya | 8MB | ไม่ได้ทดสอบ | สนับสนุน | ไม่ได้ทดสอบ | โดย Shan |
หมายเหตุ: ในโหมด QSPI การเดินสายสองครั้งหมายถึงการสนับสนุนการอ่านอย่างรวดเร็วสองครั้งและสี่สายหมายถึงการสนับสนุนการอ่านอย่างรวดเร็วสี่สาย
โดยทั่วไปแล้ว Flash ซึ่งรองรับการอ่านอย่างรวดเร็วสี่บรรทัดยังรองรับการอ่านอย่างรวดเร็วสองบรรทัด
ก่อนอื่นให้อธิบายโครงสร้างที่ใช้เป็นหลักในห้องสมุดนี้ sfud_flash คำจำกัดความของมันอยู่ใน /sfud/inc/sfud_def.h แฟลช SPI แต่ละตัวจะสอดคล้องกับโครงสร้างและตัวชี้โครงสร้างจะเรียกรวมกันว่าวัตถุอุปกรณ์แฟลช หลังจากการเริ่มต้นสำเร็จพารามิเตอร์ SPI Flash ทั่วไปจะถูกเก็บไว้ในโครงสร้าง sfud_flash->chip หาก SPI Flash รองรับ SFDP คุณยังสามารถดูข้อมูลพารามิเตอร์ที่ครอบคลุมมากขึ้นผ่าน sfud_flash->sfdp ฟังก์ชั่นต่อไปนี้จำนวนมากจะใช้วัตถุอุปกรณ์แฟลชเป็นพารามิเตอร์รายการแรกเพื่อใช้การดำเนินการบนแฟลช SPI ที่ระบุ
sfud_device_init จะถูกเรียกให้เริ่มต้นอุปกรณ์ทั้งหมดในตารางอุปกรณ์แฟลช หากมีแฟลชเพียงครั้งเดียวคุณสามารถใช้ sfud_device_init สำหรับการเริ่มต้นเดียวเท่านั้น
หมายเหตุ : แฟลช SPI ที่เริ่มต้น ได้รับการป้องกัน โดยค่าเริ่มต้น หากคุณต้องการเปิดใช้งานการสั่งการเขียนโปรดใช้ฟังก์ชัน SFUD_WRITE_STATUS เพื่อแก้ไขสถานะ SPI Flash
sfud_err sfud_init ( void ) sfud_err sfud_device_init ( sfud_flash * flash )| พารามิเตอร์ | อธิบาย |
|---|---|
| แฟลช | อุปกรณ์แฟลชที่จะเริ่มต้น |
เมื่อ SFUD เปิดโหมด QSPI ไดรเวอร์แฟลชใน SFUD รองรับการสื่อสารโดยใช้ QSPI Bus เมื่อเทียบกับโหมด SPI แบบดั้งเดิมการใช้ QSPI สามารถเร่งการอ่านข้อมูลแฟลช อย่างไรก็ตามเมื่อจำเป็นต้องเขียนข้อมูลความเร็วในการเขียนข้อมูลของแฟลชนั้นช้ากว่าความเร็วในการส่ง SPI ดังนั้นความเร็วในการเขียนข้อมูลในโหมด QSPI จะไม่ดีขึ้นอย่างมีนัยสำคัญ
ดังนั้นการสนับสนุนของ SFUD สำหรับโหมด QSPI จึง จำกัด เฉพาะคำสั่งอ่านที่รวดเร็ว ฟังก์ชั่นนี้ช่วยให้คุณสามารถกำหนดค่าความกว้างของสายข้อมูลสูงสุดที่รองรับจริงของบัส QSPI ที่ใช้โดยแฟลชเช่น: 1 บรรทัด (ค่าเริ่มต้นนั่นคือโหมด SPI แบบดั้งเดิม), 2 บรรทัดและ 4 บรรทัด
หลังจากการตั้งค่า SFUD จะรวมความกว้างของสายข้อมูลบัส QSPI ที่ตั้งไว้ในปัจจุบันเพื่อให้ตรงกับคำสั่งอ่านอย่างรวดเร็วที่เหมาะสมและเร็วที่สุดในตารางข้อมูลส่วนขยายของ QSPI Flash หลังจากนั้นเมื่อผู้ใช้เรียก SFUD_READ () เขาจะใช้ฟังก์ชันการส่งโหมด QSPI เพื่อส่งคำสั่ง
sfud_err sfud_qspi_fast_read_enable ( sfud_flash * flash , uint8_t data_line_width )| พารามิเตอร์ | อธิบาย |
|---|---|
| แฟลช | อุปกรณ์แฟลช |
| data_line_width | ความกว้างของสายข้อมูลสูงสุดที่รองรับโดยบัส QSPI เช่น: 1, 2, 4 |
ตารางอุปกรณ์แฟลชถูกกำหนดไว้ในไฟล์กำหนดค่า SFUD ซึ่งรับผิดชอบในการจัดเก็บวัตถุอุปกรณ์แฟลชทั้งหมดที่จะใช้ดังนั้น SFUD จึงรองรับอุปกรณ์แฟลชหลายตัวที่จะขับเคลื่อนพร้อมกัน การกำหนดค่าของตารางอุปกรณ์ถูกกำหนดไว้ในมาโคร SFUD_FLASH_DEVICE_TABLE ใน /sfud/inc/sfud_cfg.h สำหรับวิธีการกำหนดค่าโดยละเอียดโปรดดูที่ 2.3 วิธีการกำหนดค่าแฟลช) วิธีนี้ส่งคืนวัตถุ Flash Device โดยการจัดทำดัชนีอุปกรณ์แฟลชในตารางอุปกรณ์และส่งคืนค่า NULL เกินช่วงตารางอุปกรณ์
sfud_flash * sfud_get_device ( size_t index )| พารามิเตอร์ | อธิบาย |
|---|---|
| ดัชนี | ค่าดัชนีของอุปกรณ์แฟลชที่อยู่ในตารางอุปกรณ์แฟลช |
sfud_err sfud_read ( const sfud_flash * flash , uint32_t addr , size_t size , uint8_t * data )| พารามิเตอร์ | อธิบาย |
|---|---|
| แฟลช | วัตถุอุปกรณ์แฟลช |
| addr | ที่อยู่เริ่มต้น |
| ขนาด | ขนาดทั้งหมดของข้อมูลที่อ่านจากที่อยู่เริ่มต้น |
| ข้อมูล | อ่านข้อมูล |
หมายเหตุ: การดำเนินการลบจะถูกจัดตำแหน่งตามข้อกำหนดการลบของชิปแฟลช (ดูแผ่นข้อมูลแฟลชสำหรับรายละเอียดโดยทั่วไปขนาดบล็อกหลังจากการเริ่มต้นเสร็จสิ้นคุณสามารถดูได้ผ่าน
sfud_flash->chip.erase_gran) โปรดระวังเพื่อให้แน่ใจว่าที่อยู่เริ่มต้นและขนาดข้อมูลจะถูกจัดแนวตามการลบเม็ดของชิปแฟลช มิฉะนั้นหลังจากดำเนินการลบข้อมูลอื่น ๆ จะหายไป
sfud_err sfud_erase ( const sfud_flash * flash , uint32_t addr , size_t size )| พารามิเตอร์ | อธิบาย |
|---|---|
| แฟลช | วัตถุอุปกรณ์แฟลช |
| addr | ที่อยู่เริ่มต้น |
| ขนาด | ขนาดทั้งหมดของการลบข้อมูลจากที่อยู่เริ่มต้น |
sfud_err sfud_chip_erase ( const sfud_flash * flash )| พารามิเตอร์ | อธิบาย |
|---|---|
| แฟลช | วัตถุอุปกรณ์แฟลช |
sfud_err sfud_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| พารามิเตอร์ | อธิบาย |
|---|---|
| แฟลช | วัตถุอุปกรณ์แฟลช |
| addr | ที่อยู่เริ่มต้น |
| ขนาด | ขนาดทั้งหมดของข้อมูลที่เขียนจากที่อยู่เริ่มต้น |
| ข้อมูล | ข้อมูลที่จะเขียน |
หมายเหตุ: การดำเนินการลบจะถูกจัดตำแหน่งตามข้อกำหนดการลบของชิปแฟลช (ดูแผ่นข้อมูลแฟลชสำหรับรายละเอียดโดยทั่วไปขนาดบล็อกหลังจากการเริ่มต้นเสร็จสิ้นคุณสามารถดูได้ผ่าน
sfud_flash->chip.erase_gran) โปรดระวังเพื่อให้แน่ใจว่าที่อยู่เริ่มต้นและขนาดข้อมูลจะถูกจัดแนวตามการลบเม็ดของชิปแฟลช มิฉะนั้นหลังจากดำเนินการลบข้อมูลอื่น ๆ จะหายไป
sfud_err sfud_erase_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| พารามิเตอร์ | อธิบาย |
|---|---|
| แฟลช | วัตถุอุปกรณ์แฟลช |
| addr | ที่อยู่เริ่มต้น |
| ขนาด | ขนาดทั้งหมดของข้อมูลที่เขียนจากที่อยู่เริ่มต้น |
| ข้อมูล | ข้อมูลที่จะเขียน |
sfud_err sfud_read_status ( const sfud_flash * flash , uint8_t * status )| พารามิเตอร์ | อธิบาย |
|---|---|
| แฟลช | วัตถุอุปกรณ์แฟลช |
| สถานะ | มูลค่าการลงทะเบียนสถานะปัจจุบัน |
sfud_err sfud_write_status ( const sfud_flash * flash , bool is_volatile , uint8_t status )| พารามิเตอร์ | อธิบาย |
|---|---|
| แฟลช | วัตถุอุปกรณ์แฟลช |
| is_volatile | พลาดง่ายไหม? จริง: ง่ายต่อการพลาดและจะหายไปหลังจากไฟฟ้าดับ |
| สถานะ | มูลค่าการลงทะเบียนสถานะปัจจุบัน |
การกำหนดค่าทั้งหมดอยู่ใน /sfud/inc/sfud_cfg.h โปรดดูการแนะนำการกำหนดค่าด้านล่างเพื่อเลือกการกำหนดค่าที่เหมาะสมกับโครงการของคุณ
เปิด/ปิด SFUD_DEBUG_MODE MACRO
เปิด/ปิด SFUD_USING_SFDP นิยามมาโคร
หมายเหตุ: หลังจากปิดจะมีเพียงตารางข้อมูลแฟลชที่จัดทำโดยไลบรารีใน
/sfud/inc/sfud_flash_def.hจะถูกสอบถาม แม้ว่าสิ่งนี้จะลดความสามารถในการปรับตัวของซอฟต์แวร์ แต่จะลดจำนวนรหัส
เปิด/ปิดนิยามมาโคร SFUD_USING_FAST_READ โหมดการอ่านแฟลชจำนวนมากอาจไม่ตรงกับความถี่ SPI ที่สูงขึ้น (สำหรับรายละเอียดโปรดดูลักษณะการแลกเปลี่ยนแผ่นข้อมูลของแต่ละแฟลช) และต้องเปิดใช้งานโหมดการอ่านที่รวดเร็ว
หมายเหตุ: เนื่องจากโหมดการอ่านที่รวดเร็วจะแทรกไบต์ null เริ่มต้นเมื่ออ่านอาจช้ากว่าโหมดการอ่านเมื่ออัตรา SPI ช้าลง
เปิด/ปิด SFUD_USING_FLASH_INFO_TABLE คำจำกัดความมาโคร
หมายเหตุ: หลังจากปิดไลบรารีนี้จะขับแฟลชที่รองรับข้อมูลจำเพาะ SFDP เท่านั้นซึ่งจะลดจำนวนรหัสอย่างเหมาะสม นอกจากนี้คำจำกัดความของมาโครสองข้อที่ 2.3.2 และ 2.3.3 กำหนดอย่างน้อยหนึ่งในนั้นและพวกเขายังสามารถเลือกได้ทั้งสองวิธี
เพื่อลดจำนวนรหัสเพิ่มเติม SFUD_USING_SFDP และ SFUD_USING_FLASH_INFO_TABLE อาจ ไม่ได้กำหนดไว้
ในเวลานี้เพียงแค่ระบุพารามิเตอร์แฟลชเมื่อกำหนดอุปกรณ์แฟลชจากนั้นเรียก sfud_device_init เพื่อเริ่มต้นอุปกรณ์ อ้างถึงรหัสต่อไปนี้:
sfud_flash sfud_norflash0 = {
. name = "norflash0" ,
. spi . name = "SPI1" ,
. chip = { "W25Q64FV" , SFUD_MF_ID_WINBOND , 0x40 , 0x17 , 8L * 1024L * 1024L , SFUD_WM_PAGE_256B , 4096 , 0x20 } };
......
sfud_device_init ( & sfud_norflash0 );
...... หากมีแฟลชหลายอย่างในผลิตภัณฑ์คุณสามารถเพิ่มตารางอุปกรณ์แฟลช แก้ไขคำจำกัดความแมโครของ SFUD_FLASH_DEVICE_TABLE ตัวอย่างมีดังนี้:
enum {
SFUD_W25Q64CV_DEVICE_INDEX = 0 ,
SFUD_GD25Q64B_DEVICE_INDEX = 1 ,
};
#define SFUD_FLASH_DEVICE_TABLE
{
[SFUD_W25Q64CV_DEVICE_INDEX] = {.name = "W25Q64CV", .spi.name = "SPI1"},
[SFUD_GD25Q64B_DEVICE_INDEX] = {.name = "GD25Q64B", .spi.name = "SPI3"},
} ข้างต้นกำหนดอุปกรณ์แฟลชสองตัว (หนึ่งในผลิตภัณฑ์ส่วนใหญ่เพียงพอ) ชื่อของอุปกรณ์ทั้งสองคือ "W25Q64CV" และ "GD25Q64B" ซึ่งสอดคล้องกับชื่ออุปกรณ์ SPI สองชื่อ "SPI1" และ "SPI3" ตามลำดับ (จะใช้เมื่ออพยพอินเตอร์เฟส SPI ซึ่งอยู่ใน /sfud/port/sfud_port.c ) การแจกแจงสองครั้งของ SFUD_W25Q16CV_DEVICE_INDEX และ SFUD_GD25Q64B_DEVICE_INDEX กำหนดดัชนีของอุปกรณ์ทั้งสองในตารางอุปกรณ์ คุณสามารถรับตารางอุปกรณ์ผ่านวิธี sfud_get_device_table() จากนั้นเข้าถึงอุปกรณ์ที่ระบุด้วยค่าดัชนีนี้
เปิด/ปิดคำจำกัดความมาโคร SFUD_USING_QSPI
เมื่อเปิดใช้งาน SFUD จะรองรับแฟลชที่เชื่อมต่อโดยใช้บัส QSPI
ไฟล์พอร์ตอยู่ใน /sfud/port/sfud_port.c วิธี sfud_err sfud_spi_port_init(sfud_flash *flash) ในไฟล์เป็นวิธีพอร์ตที่จัดทำโดยไลบรารี มันเสร็จสิ้นการกำหนดค่าของไดรเวอร์การอ่านและเขียน SPI (จำเป็น), เวลาลองอีกครั้ง (จำเป็น), อินเตอร์เฟสลองใหม่ (ไม่บังคับ) และ SPI ล็อค (ไม่บังคับ) สำหรับเนื้อหาการพอร์ตที่มีรายละเอียดเพิ่มเติมคุณสามารถอ้างถึงไฟล์พอร์ตของแต่ละแพลตฟอร์มในการสาธิต
ที่นี่คุณต้องแก้ไข /sfud/inc/sfdu_flash_def.h ดูคำจำกัดความมาโคร SFUD_FLASH_CHIP_TABLE สำหรับแฟลชที่รองรับทั้งหมด พารามิเตอร์แฟลชที่ต้องเตรียมล่วงหน้าคือ: | ชื่อ | ID ผู้ผลิต | พิมพ์ ID | ID ความจุ | ความจุ | โหมดเขียน | ลบความละเอียด (หน่วยขั้นต่ำของการลบ) | ลบคำสั่งที่สอดคล้องกัน - ที่นี่เราใช้แฟลช GD25Q64B พร้อม Gigadevice เป็นตัวอย่าง
แฟลชนี้เป็นรูปแบบที่ผลิตในช่วงต้นของนวัตกรรม Gioyi ดังนั้นจึงไม่รองรับมาตรฐาน SFDP ก่อนอื่นคุณต้องดาวน์โหลดแผ่นข้อมูลและค้นหา ID สามรายการที่ส่งคืนโดยคำสั่ง 0x9F ที่นี่คุณต้องการรหัสไบต์สองตัวสุดท้ายคือ type id และ capacity id GD25Q64B สอดคล้องกับ ID ทั้งสองนี้: 0x40 และ 0x17 ตามลำดับ พารามิเตอร์แฟลชอื่น ๆ ที่ต้องการข้างต้นสามารถพบได้ในแผ่นข้อมูล ที่นี่เราจะมุ่งเน้นไปที่ โหมดการเขียน พารามิเตอร์นี้จัดทำโดยไลบรารีเอง มีโหมดการเขียน 4 ประเภท สำหรับรายละเอียดโปรดดูประเภทการแจงนับ sfud_write_mode ที่ด้านบนของไฟล์ แฟลชเดียวกันสามารถรองรับโหมดการเขียนหลายโหมดในเวลาเดียวกันขึ้นอยู่กับสถานการณ์ สำหรับ GD25Q64B โหมดการเขียนที่รองรับควรเป็น SFUD_WM_PAGE_256B นั่นคือเขียน 1-256 ไบต์ต่อหน้า รวมกับพารามิเตอร์แฟลช GD25Q64B ด้านบนควรมีดังนี้:
{"GD25Q64B", SFUD_MF_ID_GIGADEVICE, 0x40, 0x17, 8*1024*1024, SFUD_WM_PAGE_256B, 4096, 0x20},
เพิ่มลงในตอนท้ายของคำจำกัดความมาโคร SFUD_FLASH_CHIP_TABLE เพื่อให้การสนับสนุนของไลบรารีสำหรับ GD25Q64B เสร็จสมบูรณ์
ปัจจุบันได้รองรับการสาธิตภายใต้แพลตฟอร์มต่อไปนี้
| เส้นทาง | คำอธิบายแพลตฟอร์ม |
|---|---|
| /Demo/STM32F10X_NON_OS | แพลตฟอร์มโลหะเปลือย STM32F10X |
| /demo/stm32f2xx_rtt | แพลตฟอร์มระบบปฏิบัติการ STM32F2XX + RT-Thread |
| /Demo/STM32L475_NON_OS_QSPI | STM32L475 + โหมด QSPI แพลตฟอร์มโลหะเปลือยเปล่า |
| /demo/esp32_ext_spi_flash | ESP32C3 + SPI Flash ESP-IDF Framework |
ใช้โปรโตคอลโอเพนซอร์ส MIT โปรดอ่านเนื้อหาของไฟล์ใบอนุญาตในโครงการเพื่อดูรายละเอียด