วิธีการเปลี่ยนจากไมโครคอนโทรลเลอร์ "พื้นฐาน" เป็น ARM Cortex


22

ฉันมีประสบการณ์หลายปีกับคอร์ 8 บิตจากผู้ผลิตหลายรายเช่น 8051, PIC และ AVR - และตอนนี้ฉันมี Cortex M0 เพื่อค้นหา เฉพาะอันนี้แต่ฉันหวังว่าเราจะได้ทั่วไปมากกว่านั้น

มันกลายเป็นมากกว่าที่ฉันต่อรองเล็กน้อยด้วยเอกสารหลายฉบับที่อธิบายส่วนต่าง ๆ ของระบบในระดับรายละเอียดที่แตกต่างกันและไม่มีจริง ๆ ที่ฉันเห็นว่าเชื่อมต่อเข้าด้วยกัน เมื่อเทียบกับการมีแผ่นข้อมูลเดียวที่อธิบายทุกอย่าง ฉันเข้าใจว่ามีเอกสารมากขึ้นตั้งแต่แรก แต่การเปลี่ยนรูปแบบทำให้ฉันต้องวนซ้ำ

เว็บไซต์ด้านบนมีเอกสารหนึ่งฉบับที่เป็นภาพรวมที่ดีของแต่ละระบบย่อยและอุปกรณ์ต่อพ่วงแยกและอีกอันหนึ่งอธิบายรายละเอียดการลงทะเบียนแต่ละครั้งและฉันมีซอร์สโค้ดทั้งหมดสำหรับ SDK ของพวกเขารวมถึงไฟล์ส่วนหัวและตัวอย่างที่ซับซ้อนบางอย่าง ไม่มีอะไรที่อธิบายถึงความเชื่อมโยงทั้งหมดเข้าด้วยกัน

มีคำแนะนำสั้น ๆ ของสถาปัตยกรรม Cortex ที่อธิบายการทำงานของสิ่งต่าง ๆ ที่คอนโทรลเลอร์ขนาดเล็กไม่มี - เช่นบัสหลายชั้นจาก CPU ไปยังอุปกรณ์ต่อพ่วงแต่ละตัวมีตัวจับเวลาจ้องจับผิดของตัวเอง - และพวกมันเชื่อมต่อกันอย่างไร?


ฉันไม่สามารถบอกได้จากสิ่งที่คุณอธิบายถ้าคุณมีแผ่นข้อมูล / คู่มือผู้ใช้จริงสำหรับโปรเซสเซอร์จากผู้ผลิต นั่นควรให้ภาพรวมและรายละเอียดที่ดีแก่คุณ จากหนึ่งในรูปภาพบนไซต์ที่คุณเชื่อมโยงดูเหมือนกับโปรเซสเซอร์ NXP ดูที่หมายเลขชิ้นส่วนของผู้ผลิตและค้นหาเอกสารของโปรเซสเซอร์บนไซต์ของพวกเขา นอกจากนี้ยังมี ARM ของเว็บไซต์arm.com/products/processors/cortex-m/cortex-m0.php
DigitalNinja

ขออภัยในความล่าช้าในการกลับมาสู่สิ่งนี้ ฉันยุ่งกับโครงการอื่น ขอบคุณ @Adam สำหรับเสียงของประสบการณ์
AaronD

และขอขอบคุณ @Richard สำหรับภาพรวมของวิธีคิดเกี่ยวกับมันและหมายเหตุเกี่ยวกับการพิมพ์การกำหนดค่าหมุด ฉันสนับสนุนคุณทั้งคู่
AaronD

คุณจะไม่ย้อนกลับไปเว้นแต่ว่าคุณต้องการความต้องการด้านราคาที่สูงมาก และถึงอย่างนั้นคุณก็จะถูกล่อลวงเนื่องจากมี Cortex-M ค่อนข้างสกปรกอยู่บ้าง
Ronan Paixão

คำตอบ:


40

ฉันทำงานกับ AVR รวมถึง MCU ที่ใช้ ARM Cortex-M3 / M4 / R4 ฉันคิดว่าฉันสามารถให้คำแนะนำทั่วไปได้ สิ่งนี้จะสมมติว่าคุณกำลังเขียนโปรแกรมใน C ไม่ใช่การประกอบ

CPU นั้นเป็นส่วนที่ง่าย ชนิดข้อมูล C พื้นฐานจะมีขนาดแตกต่างกัน แต่คุณใช้ uint8 / 16 / 32_t อยู่ดีใช่ไหม :-) และตอนนี้ทุกประเภทจำนวนเต็มควรจะเร็วพอสมควรโดยมี 32- บิต (int) จะเร็วที่สุด คุณอาจไม่มี FPU ดังนั้นควรหลีกเลี่ยงการลอยตัวและเพิ่มเป็นสองเท่า

ขั้นแรกให้ทำความเข้าใจเกี่ยวกับสถาปัตยกรรมระดับระบบ ซึ่งหมายถึง IOs การตอกบัตรหน่วยความจำการรีเซ็ตและการขัดจังหวะ นอกจากนี้คุณต้องคุ้นเคยกับแนวคิดของอุปกรณ์ต่อพ่วงที่แมปหน่วยความจำ บน AVR คุณสามารถหลีกเลี่ยงการคิดเรื่องนั้นได้เนื่องจากรีจิสเตอร์นั้นมีชื่อเฉพาะที่มีตัวแปรทั่วโลกที่ไม่ซ้ำกันซึ่งกำหนดไว้สำหรับพวกเขา ในระบบที่ซับซ้อนยิ่งขึ้นเป็นเรื่องปกติที่จะอ้างถึงการลงทะเบียนด้วยที่อยู่พื้นฐานและการชดเชย ทุกอย่างจะเพิ่มขึ้นจนถึงเลขคณิตของตัวชี้ หากคุณไม่คุ้นเคยกับพอยน์เตอร์ให้เริ่มเรียนรู้ตอนนี้

สำหรับ IOs ให้หาวิธีจัดการอุปกรณ์ต่อพ่วง muxing มีการควบคุม mux กลางเพื่อเลือกพินใดเป็นสัญญาณต่อพ่วงและ GPIO ใด? หรือคุณตั้งพินเป็นโหมดต่อพ่วงโดยใช้รีจิสเตอร์ต่อพ่วง? และแน่นอนคุณจะต้องรู้วิธีกำหนดค่า GPIO เป็นอินพุตและเอาต์พุตและเปิดใช้งานโหมด open-drain และ pull-ups / downs การขัดจังหวะจากภายนอกมักจะตกอยู่ในหมวดหมู่นี้เช่นกัน GPIO นั้นค่อนข้างทั่วไปดังนั้นประสบการณ์ของคุณควรให้บริการคุณดีที่นี่

การตอกย้ำบางสิ่งลงไป คุณเริ่มต้นด้วยแหล่งสัญญาณนาฬิกาโดยทั่วไปจะเป็นคริสตัลหรือ RC oscillator ภายใน สิ่งนี้ใช้เพื่อสร้างโดเมนนาฬิการะดับระบบหนึ่งโดเมนหรือมากกว่า ชิปความเร็วสูงจะใช้ PLL ซึ่งคุณคิดว่าเป็นตัวคูณความถี่ จะมีตัวแบ่งสัญญาณนาฬิกาตามจุดต่าง ๆ ด้วย สิ่งสำคัญที่ควรพิจารณาคือความถี่สัญญาณนาฬิกาของ CPU ของคุณควรเป็นเท่าใดและอัตราบิตใดที่คุณต้องการสำหรับอุปกรณ์สื่อสารของคุณ โดยปกติแล้วจะมีความยืดหยุ่นสวย เมื่อคุณได้รับขั้นสูงคุณสามารถเรียนรู้เกี่ยวกับสิ่งต่าง ๆ เช่นโหมดพลังงานต่ำซึ่งมักจะอิงตามสัญญาณนาฬิกา

หน่วยความจำหมายถึงแฟลชและ RAM หากคุณมีแรมเพียงพอมันมักจะเร็วกว่าที่จะทำให้โปรแกรมของคุณอยู่ในระหว่างการพัฒนาก่อนดังนั้นคุณไม่จำเป็นต้องตั้งโปรแกรมแฟลชซ้ำแล้วซ้ำอีก ปัญหาใหญ่ที่นี่คือการจัดการหน่วยความจำ ผู้ขายของคุณควรมีสคริปต์ linker ตัวอย่าง แต่คุณอาจต้องจัดสรรหน่วยความจำเพิ่มเติมให้กับรหัสค่าคงที่ตัวแปรโกลบอลหรือสแต็กขึ้นอยู่กับลักษณะของโปรแกรมของคุณ หัวข้อขั้นสูงอื่น ๆ ได้แก่ การรักษาความปลอดภัยของรหัสและการโปรแกรมแฟลชแบบรันไทม์

การรีเซ็ตค่อนข้างตรงไปตรงมา โดยปกติคุณจะต้องระวังตัวจับเวลาจ้องจับผิดซึ่งอาจเปิดใช้งานโดยค่าเริ่มต้น การรีเซ็ตมีความสำคัญมากกว่าในระหว่างการดีบักเมื่อคุณเรียกใช้รหัสเดียวกันซ้ำไปซ้ำมา มันง่ายที่จะพลาดบั๊กเนื่องจากปัญหาในการเรียงลำดับแบบนั้น

มีสองสิ่งที่คุณต้องรู้เกี่ยวกับการขัดจังหวะ - วิธีที่คุณเปิดใช้งานและปิดการใช้งานและวิธีกำหนดเวกเตอร์ขัดจังหวะ AVR-GCC ทำหน้าที่หลังสุดให้คุณด้วยมาโคร ISR () แต่สำหรับสถาปัตยกรรมอื่น ๆ คุณอาจต้องเขียนที่อยู่ฟังก์ชันลงทะเบียนด้วยตนเอง

อุปกรณ์ต่อพ่วงไมโครคอนโทรลเลอร์มักจะแยกจากกันดังนั้นคุณสามารถเรียนรู้ทีละตัวได้ มันอาจช่วยเลือกอุปกรณ์ต่อพ่วงหนึ่งอันและใช้มันเพื่อเรียนรู้ส่วนหนึ่งของข้อมูลระดับระบบ Comm อุปกรณ์ต่อพ่วงและ PWM เหมาะสำหรับการตอกบัตรและ IO และตัวจับเวลาดีสำหรับการขัดจังหวะ

อย่าถูกข่มขู่โดยระดับความซับซ้อน ไมโครคอนโทรลเลอร์ "พื้นฐาน" เหล่านั้นได้สอนสิ่งที่คุณต้องรู้ไปแล้ว กรุณาแจ้งให้เราทราบหากคุณต้องการให้ฉันชี้แจงอะไร


4
คำตอบที่ดี. สิ่งที่ต้องระวังอีกอย่างคืออุปกรณ์ต่อพ่วง DMA ซึ่งมักจะมีอินเทอร์เฟซที่ซับซ้อนและมีเอกสารไม่เพียงพอในประสบการณ์ของฉัน
Doug McClean

3
"และตอนนี้จำนวนเต็มทุกประเภทควรเร็วพอ ๆ กัน" ที่จริงแล้วเนื่องจากกฎการส่งเสริมการขายจำนวนเต็มใน C การใช้ชนิด 8 / 16- บิตอาจส่งผลให้ส่วนขยายสัญญาณ / ศูนย์จำนวนมากและอาจเป็นปัญหาเมื่อหน่วยความจำแฟลชเหลือน้อย ดังนั้นหากมี RAM ให้สำรองไว้ก็อาจจ่ายเงินเพื่อใช้ประเภท 32- บิตเพิ่มเติมหรืออย่างน้อยต้องการint/ int_leastN_Tประเภทสำหรับตัวแปรสแต็ก
694733

ทำผิดพลาดกับความคิดเห็นของฉัน ฉันหมายถึงว่า; ใช้int_fastN_tประเภทไม่ใช่int_leastN_tประเภท
694733

@ user694733: ฉันหวังว่า C Standard จะอนุญาตให้โค้ดถามจำนวนเต็มที่ใช้ขนาดที่กำหนดในหน่วยความจำและสามารถทำงานกับค่าภายในช่วงที่กำหนด แต่ด้วยความหมายที่ระบุอย่างหลวมเมื่ออยู่นอกช่วงนั้น ในบางสิ่งเช่น ARM การint16_tจะเร็วพอ ๆint32_tกับค่าที่เก็บไว้ในหน่วยความจำ แต่ Standard กำหนดให้บนแพลตฟอร์มที่intมี 17 บิตหรือใหญ่กว่าint16_t x=32767; x+=2;ต้องตั้งค่าxเป็น -32767 ต้องใช้คำแนะนำการขยายสัญลักษณ์บ่อยครั้งแม้ว่ารหัสจะ ไม่เคยใช้ประโยชน์จากพฤติกรรมการห่อ
supercat

@supercat มาตรฐาน C ต้องการลักษณะการตัดคำเฉพาะสำหรับประเภทที่ไม่ได้ลงนาม สำหรับประเภทที่เซ็นชื่อการห่อใด ๆ คือ UB เนื่องจากมีความเป็นไปได้ที่แตกต่างกัน ดังนั้นด้วยx+=2จะเป็นการถูกต้องที่จะใช้คำสั่งสำหรับชนิด 16 บิตเนื่องจากคอมไพเลอร์อาจคิดว่าค่าจะไม่ถูกรวมอยู่ด้วยดังนั้นการใช้มันจะไม่เปลี่ยนพฤติกรรมที่สังเกตได้ แต่ฉันคิดว่า ARM ไม่มีคำสั่ง ADD แบบ 16 บิตซึ่งจะทำให้สิ่งนี้เป็นไปได้ (ฉันอาจจะผิดความรู้ของฉันเกี่ยวกับชุดคำสั่ง ARM นั้นไม่ดีเลย)
user694733

8

มีประโยชน์ที่ต้องจำไว้ว่า ARM เป็นเจ้าของทรัพย์สินทางปัญญาสำหรับไมโครโปรเซสเซอร์ แต่ไม่ได้สร้างชิ้นส่วนจริงๆ แต่ผู้ผลิตให้สิทธิ์ใช้งานโปรเซสเซอร์รุ่นต่างๆของ ARM และผลิตชิ้นส่วนที่เป็นเอกลักษณ์ของตัวเองพร้อมกับคุณสมบัติและอุปกรณ์ต่อพ่วงที่หลากหลาย

ด้วยสิ่งที่กล่าวมาหากคุณยังใหม่กับสถาปัตยกรรมมันอาจจะเหมาะสมที่จะเริ่มต้นด้วยเอกสารของ ARM ซึ่งโดยพื้นฐานแล้วเอกสารพื้นฐานสำหรับไมโครโปรเซสเซอร์ดังกล่าวทั้งหมด

ยกตัวอย่างเช่น Cortex-M0 อธิบายไว้ในเว็บไซต์ของ ARM

นอกจากนี้ยังมีรายการหนังสือที่เกี่ยวกับ ARMซึ่งมีความต้องการและความสนใจที่หลากหลาย

ในที่สุดก็มีเอกสารข้อมูลเฉพาะของผู้ผลิต สำหรับ M0, Cypress, NXP และ STMicroelectronics เป็นเพียงสามในผู้ผลิตชิ้นส่วนจริงจาก Cortex-M0

(และไม่ฉันไม่ทำงานให้กับ ARM และไม่เคยมี)


1
นี่เป็นคำตอบทั่วไปที่ไม่ได้ทำอะไรมากไปกว่าการเชื่อมโยงไปยังเอกสาร Cortex-M0 ซึ่งฉันมั่นใจว่า OP สามารถหาได้ด้วยตัวเอง
Jay Carlson

1
มันตอบคำถามโดยตรงซึ่งขอความช่วยเหลือในการค้นหาเอกสารโดยรวม คำตอบนี้ตรงกับคำตอบที่ต้องการและอธิบายว่าทำไมจึงเป็นเช่นนั้น
Edward

8

ข้อแตกต่างที่สำคัญอย่างหนึ่งคือการใช้ไลบรารีที่ผู้จำหน่ายจัดหา สำหรับ PICs, Atmels และอื่น ๆ ไลบรารีพื้นฐาน (สำหรับ gpio, ตัวนับ, adc และอื่น ๆ ) ไม่ได้ถูกใช้งานโดยนักพัฒนาส่วนใหญ่ จากประสบการณ์ของฉันคนส่วนใหญ่จะใช้เป็นแนวทางในการเขียนโค้ดของตัวเอง

อย่างไรก็ตามด้วย ARM ไลบรารีเหล่านี้มักถูกใช้งานอยู่เสมอ มีมาตรฐาน "CMSIS" ที่ผู้ผลิตจะแนะนำให้ปฏิบัติตาม ส่วนใหญ่ทำ มันช่วยในการพกพาโค้ด (ระหว่าง ARM ที่แตกต่างกันและระหว่างผู้ผลิต) และให้วิธี "มาตรฐาน" สำหรับการจัดโครงสร้างโค้ดของคุณ ผู้คนคุ้นเคยกับการมองเห็นและทำความเข้าใจกับฟังก์ชั่นห้องสมุด

แน่ใจว่ามีนักพัฒนาบางคนที่เข้าถึงการลงทะเบียนโดยตรง แต่พวกเขาเป็นผู้ผิดกฎหมาย :)

เพื่อตอบคำถามของคุณฉันพบว่ามีประโยชน์มากในการอ่านเอกสารในห้องสมุด ST มีรหัสที่ได้รับการพัฒนามาอย่างดีพร้อมไฟล์ช่วยเหลือ Doxygen ที่สร้างขึ้นขนาดใหญ่ คุณสามารถดูตัวเลือกทั้งหมดที่มีสำหรับโมดูลฮาร์ดแวร์แต่ละตัว

ในการใช้ GPIO เป็นตัวอย่างฟังก์ชันการกำหนดค่าเริ่มต้นจะจัดการ:

  • ทิศทาง (เข้าหรือออก)
  • pullups / pulldowns
  • เปิดเก็บ / ผลักดึง
  • อัตราการฆ่า
  • เป็นต้น

เมื่อดูที่ตัวเลือกต่างๆคุณจะเห็นสิ่งที่เป็นไปได้ และแน่นอนคุณจะได้เรียนรู้วิธีส่งตัวเลือกเหล่านี้ไปยังฟังก์ชัน Init!

ตกลงตอนนี้ฉันได้กล่าวแล้วว่าฉันเห็นว่า ARM เฉพาะของคุณไม่มีไลบรารีที่สอดคล้องกับ CMSIS พวกเขามี SDK ที่เป็นกรรมสิทธิ์ของพวกเขาสำหรับการดาวน์โหลด ฉันจะเริ่มดูเอกสาร SDK ของพวกเขา

หากคุณไม่ได้แต่งงานกับผลิตภัณฑ์นี้ฉันอาจแนะนำให้คุณหาผู้จำหน่ายรายอื่นที่มีไลบรารี่ที่เข้ากันได้มากกว่า คุณกำลังจะปีนโค้งการเรียนรู้ต่อไปดังนั้นคุณอาจทำให้การลงทุนของคุณเป็นแบบพกพามากขึ้น ...

แขนสนุก! ฉันไม่ได้ดูกลับ


"สำหรับ PICs, Atmels และอื่น ๆ ห้องสมุดไม่ได้ถูกใช้งานโดยนักพัฒนาส่วนใหญ่" ไม่แน่ใจว่ามาจากไหน ฉันใช้ PICs ไม่ใช่ AVR แต่ไม่ต้องการเขียนไลบรารี่ของตัวเองเช่นอินเทอร์เฟซโฮสต์ USB หรือสแต็ก TCP หรือระบบไฟล์การ์ด SD ห้องสมุดของ Microchip ดูเหมือนจะเพียงพอแล้ว
tcrosley

โอ้ @tcrosley คุณถูกต้องแน่นอน ฉันแค่พยายามอ้างถึงฟังก์ชั่นที่ครอบคลุมโดยอุปกรณ์ต่อพ่วงพื้นฐาน: gpio, ตัวจับเวลา, adc และอื่น ๆ
bitsmack

ฉันเห็นด้วยฉันมักจะเข้าถึง GPIO ตัวจับเวลานาฬิกาและ UART R / W โดยตรง บางครั้งฉันใช้การเรียกใช้ไลบรารี่ของพวกเขาสำหรับการตั้งค่า I2C, SPI, ADC และ UART แต่ไม่เสมอไป การลงทะเบียนจำนวนมากไม่ว่าคุณจะพูดถึง PIC (และโดยเฉพาะอย่างยิ่ง PIC32) หรือ ARM
tcrosley

ฉันคิดว่าคำตอบนี้เป็นคำตอบที่มีประโยชน์มากที่สุดที่ระบุไว้สำหรับคำถามนี้แม้ว่าจะไม่ได้ใช้กับคอนโทรลเลอร์เฉพาะของ OP ฉันคิดว่าคุณสามารถทำวิศวกรรมฝังตัวที่ดีได้โดยไม่ต้องเข้าใจ AHB หรือ NVIC
Jay Carlson

@ JayCarlson ขอบคุณ! การแก้ไขคำตอบของคุณถูกปฏิเสธเพราะเราไม่ควรเปลี่ยนโพสต์ของคนอื่นอย่างมีนัยสำคัญ แต่มันเป็นข้อมูลที่ดีจริงๆ! ฉันขอแนะนำให้คุณโพสต์มันเป็นคำตอบของคุณเองดังนั้นมันจะช่วยให้ผู้คนและยังได้รับการ upvoted :)
bitsmack

5

ช่วงเวลาที่ดีในการเคลื่อนไหว 8-bits กำลังจะตายอย่างรวดเร็ว เมื่อคุณสามารถซื้อบอร์ดราคา $ 5 ด้วย (ตัวอย่าง) STM32F103 ซึ่งเป็นไมโครคอนโทรลเลอร์ ARM แบบ 32 บิตที่มีความสามารถมากกว่า (พร้อม USB แม้!) จะไม่มีการเปลี่ยนแปลงเวลาอย่างแน่นอน

คุณมีคำตอบที่ยอดเยี่ยมอยู่แล้ว แต่ส่วนใหญ่ฉันจะพูดว่า "ลืมชุดประกอบ" และเกือบ "ลืมดูแลเกี่ยวกับวิธีการทำงานของซีพียูในระดับต่ำ" - วันหนึ่งจะมีกรณีมุมที่คุณต้องขุดลงไป (การเพิ่มประสิทธิภาพที่เฉพาะเจาะจงหรือการดีบัก) แต่แกน ARM เรียกใช้รหัส C ได้ดีเป็นพิเศษ (จากการออกแบบ) และคุณมักจะต้องเปลี่ยนลึกเข้าไปในอวัยวะภายใน

นี่หมายความว่าคุณจะใช้เวลาในการต่อสู้กับปัญหาเกี่ยวกับคอมไพเลอร์ (และโดยเฉพาะอย่างยิ่ง linkers และ makefiles) barfing ข้อผิดพลาดที่ไม่ชัดเจนที่คุณ แต่พวกเขาทั้งหมดสามารถเอาชนะได้

ความกล้าของวิธีการทำงานของ ARM (เช่นหนังสือ ARM cpu) มีความหนาแน่นและไม่น่าสนใจมากจนกระทั่งถึงวันนั้นตามที่คุณต้องการเพิ่มประสิทธิภาพ (และคุณจะประหลาดใจว่านานแค่ไหนที่คุณมีการลงทะเบียน 32 บิตและ PLL ของคุณ ' นาฬิกาของ CPU อยู่ในพื้นที่ 100mhz)

ชุดคำสั่ง ARM "เก่า skool" ง่ายต่อการอ่านการถอดแยกชิ้นส่วนของ "Thumb2" ที่ใหม่กว่า - ซึ่งเป็นสิ่งที่คุณพบใน ARMS ระดับไมโครคอนโทรลเลอร์ที่ทันสมัยที่สุด (Cortex) - แต่คำแนะนำภาษาแอสเซมบลีอีกครั้ง ส่วนใหญ่จางหายไปเป็นพื้นหลัง; หากคุณมีชุดเครื่องมือที่ถูกต้อง (โดยเฉพาะอย่างยิ่ง debugger ระดับซอร์สที่ดีพร้อมกับเบรกพอยต์ / ขั้นตอนเดียว ฯลฯ ) คุณก็ไม่สนใจว่ามันคือ ARM เลย

เมื่อคุณอยู่ในโลกของการลงทะเบียนแบบ 32 บิตและความกว้างบัสข้อมูลแบบ 32 บิตและทุกสิ่งที่คุณต้องการบนชิปที่มีอยู่คุณจะไม่ต้องการกลับไปใช้ซีพียู 8 บิตอีกต่อไป โดยทั่วไปมักจะไม่มีบทลงโทษสำหรับ "การง่าย" และการเขียนโค้ดให้อ่านง่ายกว่ามีประสิทธิภาพ

อย่างไรก็ตาม ... อุปกรณ์ต่อพ่วง ... ใช่แล้วมีการถู

คุณแน่ใจหรือไม่ว่าจะมีของมากมายให้เล่นบน MCU ที่ทันสมัยและมีหลายสิ่งที่เป็นสิ่งที่น่ารัก คุณมักจะพบกับโลกที่ซับซ้อนไกลเกินกว่า AVR, PIC และอุปกรณ์ต่อพ่วงบนชิป 8051

จับเวลาได้หนึ่งโปรแกรม? ไม่ได้มีแปดคน! DMA? วิธีการประมาณ 12 ช่องทางที่มีลำดับความสำคัญโปรแกรมและโหมดต่อเนื่องและโหมดถูกล่ามโซ่และโหลดอัตโนมัติและ .. และ .. และ ...

I2C? I2S? มีตัวเลือก muxing จำนวน pin หรือไม่ วิธีที่แตกต่างกันสิบห้าวิธีในการตั้งโปรแกรมแฟลชบนชิปอีกครั้ง แน่นอน!

บ่อยครั้งที่รู้สึกว่าคุณออกไปจากการกันดารอาหารเพื่อฉลองกับอุปกรณ์ต่อพ่วงและเป็นเรื่องธรรมดาที่มีชิปชิ้นหนึ่งที่คุณจะชื่นชม แต่แทบจะใช้ไม่ได้เลย

จำนวนของฮาร์ดแวร์บนชิป (และรูปแบบที่แตกต่างกันนั้นเป็นเพียงหนึ่งในผู้ผลิตชิปรายหนึ่ง) ปัจจุบันทุกวันนี้ค่อนข้างน่าเหลือเชื่อ แน่นอนว่าผู้จำหน่ายชิปรายหนึ่งมักจะใช้บล็อก IP ซ้ำอีกครั้งดังนั้นเมื่อคุณคุ้นเคยกับแบรนด์บางยี่ห้อแล้วมันก็จะง่ายขึ้น แต่ "อึทำได้ทุกวันนี้ craaaazy"

หากอุปกรณ์ต่อพ่วงและการโต้ตอบ (และ DMA และการขัดจังหวะและการจัดสรรรถบัสและและและ ... ) นั้นซับซ้อนดังนั้น (และในบางครั้งไม่ตรงตามที่อธิบายไว้ในเอกสารข้อมูล) ซึ่งวิศวกรมักจะมี ARM MCU ที่ชื่นชอบและ มักจะต้องการติดกับมันเพียงเพราะพวกเขาคุ้นเคยกับอุปกรณ์ต่อพ่วงและเครื่องมือในการพัฒนา

ห้องสมุดที่ดีและเครื่องมือในการพัฒนา (เช่นวงจรคอมไพล์ + debug ที่รวดเร็วพร้อมดีบักที่เหมาะสม) และชุดโค้ดตัวอย่างการทำงานจำนวนมากมีความสำคัญอย่างยิ่งต่อทางเลือก ARM MCU ของคุณในปัจจุบัน ดูเหมือนว่าผู้ค้าส่วนใหญ่ตอนนี้มีบอร์ดประเมินราคาถูกมาก (

ตามที่ฉันแน่ใจว่าคุณสังเกตเห็นเมื่อคุณได้รับเกินระดับไมโครคอนโทรลเลอร์ที่มี ARMs และในระดับ SOC (เช่น Raspberry Pi / SOCs สไตล์ ฯลฯ ) จากนั้นกฎการเปลี่ยนแปลงอย่างสมบูรณ์และมันเป็นเรื่องของลินุกซ์ที่คุณจะไป เพื่อเรียกใช้เพราะ - ด้วยข้อยกเว้นบางประการที่หายไป - คุณจะเห่าบ้าที่จะลองสิ่งอื่น

โดยทั่วไป; ไม่ว่าจะเลือกซีพียูที่อาจได้รับการเลือกล่วงหน้าให้กับตัวคุณแล้วขอให้คุณซื้อบอร์ดทดลองใช้ Cortex ที่ราคาถูกสุด ๆ จากผู้ขายที่แตกต่างกันหลายราย (TI, STM, Freescale และอื่น ๆ อีกมากมาย) และ มีแฮ็ครอบกับรหัสตัวอย่างที่ให้ไว้

คำแนะนำสุดท้าย; เมื่อคุณพบหน้าหรือสามในแผ่นข้อมูลที่อธิบายตัวเลือกขา muxing สำหรับที่แน่นอนชิปหมายเลขชิ้นส่วนคุณกำลังทำงานกับคุณอาจต้องการที่จะพิมพ์ออกมาและติดบนผนัง การค้นหาสายในโครงการว่าการรวมอุปกรณ์ต่อพ่วงบางอย่างเป็นไปไม่ได้เพราะการตรึง muxing นั้นไม่สนุกและบางครั้งข้อมูลนั้นถูกฝังอยู่ดังนั้นคุณต้องสาบานว่าพวกเขากำลังพยายามซ่อน :-)


ภาคผนวกอย่างรวดเร็ว - หากโครงการของคุณเป็นมากกว่าคอนโทรลเลอร์ที่ง่ายที่สุดลองนึกถึงการใช้ RTOS - มีบางอย่างของช่วงการเรียนรู้ที่คุณเลือกได้ แต่แม้แต่ ARMs ที่เล็กที่สุดก็มีระบบปฏิบัติการแบบมัลติเธรดมากมายในทุกวันนี้ โดยส่วนตัวแล้วฉันพบว่า ChibiOS เป็นส่วนผสมที่ยอดเยี่ยมของความสามารถแบบลีน แต่ก็มีความสามารถ (โดยเฉพาะทำงานบน STM32 ซึ่งมาพร้อมกับไลบรารีอุปกรณ์ต่อพ่วงที่ดี) แต่มีตัวเลือกมากมาย
Richard Aplin

4

ฉันยังมาจาก AVR และตอนนี้มักจะติดกับ STM32 (Cortex-M) นี่คือสิ่งที่ฉันแนะนำสำหรับผู้เริ่มและสะท้อนถึงความยากลำบากของฉันเองเมื่อฉันเริ่ม:

  1. รับบอร์ดที่มีตัวดีบั๊กหรืออย่างน้อยตัวเชื่อมต่อ JTAG (จากนั้นซื้อตัวดีบัก JTAG) มีราคาถูกมากมายอยู่รอบ ๆ และคุณจะประหยัดเวลาได้มากโดยใช้มัน

  2. รับ IDE ที่ดีพร้อมทุกอย่างที่มี ฉันเคยแนะนำCooCox CoIDEเมื่อนานมาแล้ว ตั้งแต่นั้นมาก็หยุดและเริ่มการพัฒนาใหม่ดังนั้นฉันไม่แน่ใจว่ามันเป็นอย่างไร "IDE ที่ดี" ช่วยให้คุณได้รับไฟ LED Hello World พื้นฐานที่กะพริบในเวลาไม่นาน

  3. "IDE ที่ดี" ควรตั้งค่าส่วนหัว CMSIS ของผู้ผลิต นี่คือพื้นฐานของแผนที่การลงทะเบียนที่อนุญาตให้เขียนโปรแกรม C / C ++ ได้ง่ายขึ้นด้วยชื่อตัวแปรแทนที่จะเป็นตัวเลขธรรมดาและพอยน์เตอร์

  4. ลองใช้ไลบรารีอุปกรณ์ต่อพ่วงของผู้ผลิตถ้าคุณไม่ต้องการประสิทธิภาพที่ดีที่สุด ตอนนี้คุณไม่ได้ทำจริงๆเพราะคุณกำลังเรียนรู้ หากภายหลังคุณพบว่าคุณต้องบีบให้มากขึ้นให้ดูที่รหัสห้องสมุดเพื่อดูว่ามันทำงานอย่างไร ข้อดีของห้องสมุดคือพวกเขามักจะอนุญาตให้คุณใช้ชิปที่แตกต่างกันมากมายจากผู้ผลิตรายเดียวกันด้วยรหัสเดียวกัน

  5. แตกต่างจาก AVR ชิป ARM เริ่มต้นด้วยการปิดการใช้งานอุปกรณ์ต่อพ่วง คุณต้องเปิดใช้งานก่อน ไลบรารีอุปกรณ์ต่อพ่วงที่ดีจะมีตัวอย่างเกี่ยวกับวิธีการใช้อุปกรณ์ต่อพ่วงอย่างถูกต้องและคุณสามารถรับข้อมูลเพิ่มเติมจากแผ่นข้อมูลของอุปกรณ์ ดังนั้นอย่าลืมเปิดใช้งานนาฬิกาและอุปกรณ์ต่อพ่วงก่อนที่จะใช้ ใช่แม้พอร์ต I / O จะถือเป็นอุปกรณ์ต่อพ่วง

  6. รหัสตามที่คุณเรียนรู้ อย่าพยายามคร่ำครวญทุกอย่างทันทีเพราะมันค่อนข้างซับซ้อน ฉันจะเริ่มต้นด้วยการเรียนรู้ทรีนาฬิกา (APB, AHB, รถเมล์ ฯลฯ ) และวิธีการที่นาฬิกาและตัวแบ่งสัญญาณนาฬิกาโต้ตอบ จากนั้นฉันจะดูที่ IDE เก็บสคริปต์ตัวเชื่อมโยงและรหัสเริ่มต้นสำหรับอุปกรณ์ของคุณ สคริปต์ตัวเชื่อมโยงนั้นเป็นวิธีการที่คุณจัดระเบียบหน่วยความจำ (เช่น RAM, แฟลช, ตารางเวกเตอร์ ISR ฯลฯ ) สคริปต์เริ่มต้นตั้งค่าโปรแกรมของคุณ (สิ่งต่าง ๆ เช่นการคัดลอก initializers ตัวแปรส่วนกลางจากแฟลชไปยัง RAM) IDE บางตัวมีสคริปต์เริ่มต้นใน ASM และบางตัวมีใน C บางครั้งคุณสามารถใช้ Google สำหรับสคริปต์อื่นในภาษาที่คุณต้องการ

  7. รับตัวดีบักโดยเร็วที่สุด เป็นเรื่องปกติที่จะทำผิดพลาดในการเริ่มต้นโดยการทำบางสิ่ง (โดยปกติจะเป็นการเริ่มต้นฮาร์ดแวร์) ในลำดับที่แตกต่างจากที่คุณควร บางครั้งสิ่งนี้จะทำให้เกิดข้อยกเว้น ISR ที่ทำให้คุณwhile(1);ไม่มีที่สิ้นสุด (การใช้งานเริ่มต้นสำหรับ ISR นั้น) ที่หยุดโปรแกรมของคุณและยากต่อการติดตามแม้จะมีดีบักเกอร์ก็ตาม ลองนึกภาพโดยไม่ต้องดีบักเกอร์

  8. ถ้าพูดถึงตัวดีบั๊กลองใช้ UART ต่อไปจากนั้นใช้อะแดปเตอร์แบบอนุกรม USB เพื่ออ่านมัน printf()การดีบักมีประโยชน์เสมอ :-)


3

ฉันไม่ได้ทำงานมากใน 8051, AVR หรือ PIC แต่เมื่อเร็ว ๆ นี้ฉันเริ่มดูที่ตัวประมวลผล ARM Cortex MX ดังนั้นฉันไม่สามารถบอกคุณได้มากเกี่ยวกับการเปลี่ยนจาก 8051, AVR หรือ PIC แต่ส่วนใหญ่มาจากมุมมองของผู้เริ่มต้น

หน่วยประมวลผลARM®Cortex™ -M4 นั้นขึ้นอยู่กับสถาปัตยกรรมของฮาร์วาร์ดดังนั้นจึงมีข้อมูลและบัสสั่งการแยกต่างหาก ด้านล่างเป็นภาพระดับสูง

ป้อนคำอธิบายรูปภาพที่นี่

สัปดาห์นี้ผู้ส่งสัญญาณกำลังจะมาเยี่ยมสถานที่ของเรา ฉันจะตรวจสอบกับพวกเขาสำหรับทรัพยากร NXP ARM-Cortex Mx และโพสต์ไว้ที่นี่ Freescale มีไมโครคอนโทรลเลอร์ Kinetis พลังงานต่ำ 32 บิต (MCU) ตามARM®Cortex®-M Coresฉันเข้าใจว่าพวกเขายังมีแนวทางที่คล้ายกันในการเรียนรู้โปรเซสเซอร์ ARM น่าเสียดายที่ฉันไม่ได้ทำการวิจัย


อ้างอิง:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.