ขออนุญาติ สอบถามครับ มี avr isp programmer ที่สามารถ program ATTINY10ได้ แนะนำบ้างครับ
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
Show posts MenuQuote from: dec on August 31, 2019, 05:29:02 AMQuote from: Irumi on August 30, 2019, 03:15:26 PM
มีข้อสงสัยเกี่ยวกับ GPIOx->OSPEEDR อยากสอบถามครับ
คือ OSPEED มีความเกี่ยวข้องกับ System Clock config หรือไม่ครับ ถ้าผมใช้ board stm32d401re nucleo ซึ่ง maximum clock คือ 84MHz ถ้าเลือกใช้ OSPEED = 100MHz จะมีปัญหาไหมครับ
ไม่ได้เกี่ยวข้องกันครับ OSPEEDR จริงๆ แล้วใช้ในการปรับ Slew rate หรือก็คือความเร็วในการเปลี่ยนจาก High ไป Low (tf) หรือ Low ไป High (tr) ของ pin
การเปลี่ยนค่า OSPEEDR มันจะไปปรับเปลี่ยนวงจร Drive ของ Pin โดยการเพิ่ม Speed ก็เป็นการเพิ่มกระแสให้กับวงจร Driver เพื่อให้สัญญาณมันเปลี่ยนแปลงได้เร็วขึ้น
แต่ก็แลกมากับ noise ที่มากขึ้นไปด้วย แต่ถ้าเราปรับ Speed ต่ำ แต่เอา Pin ไปขับสัญญาณถี่มากๆ สัญญาณมันจะเปลี่ยนแปลงไม่ทันนั่นเอง
เลข MHz ที่ระบุมาเป็นความถี่ที่ ST ได้จากการทดสอบ Pin โดยเอา Pin มาต่อ Load ค่าหนึ่งแล้ว Toggle High Low ในความถี่ค่าหนึ่ง แล้วก็วัดเวลา tf + tr เทียบกับคาบของสัญญาณ (T)
ซึ่งความถี่ที่เหมาะสมคือ tf + tr ต้องไม่เกิน (2/3)T และชิปแต่ละ Series ก็จะแตกต่างกันไป ซึ่งดูได้จาก Datasheet แต่เวลาใช้งานจริงก็อาจไม่ได้ผลตามที่ระบุ
เพราะมันมีปัจจัยอื่นเข้ามาเสริมด้วยเช่น ขนาดของ Load ที่ pin ขับอยู่ กับ ระดับแรงดันที่ใช้ เป็นต้น แต่ก็ใช้พอจะใช้เป็นค่าอ้างอิงได้ครับ
Quote from: dec on August 02, 2019, 03:07:31 AMQuote from: Irumi on August 01, 2019, 02:01:27 PM
ผมพึ่งจะเริ่มต้น STM32 ครับ ตอนนี้ซื้อ Board STM32F401RE nucleo มาศึกษา
พอดีสงสัยครับ ทำไมต้องมีการ set ค่า FLASH->ACR = 0x00000605; // จัดเวลา Flash ROM is 5 Wait state
ถ้าไม่มีคำสั่งนี้จะเกิดอะไรขึ้น
ไม่แน่ใจจะมีคนตอบรึเปล่าเพราะ กระทู้ตั้งแต่ปี 2013
ขอบคุณครับ
โดยปกติวงจร logic เมื่อเราป้อน input ไป วงจรต้องใช้เวลาเล็กน้อยในการส่งออก output ครับ
ซึ่ง flash memory ก็เป็นลักษณะเดียวกัน แต่ flash memory จะใช้เวลาที่ค่อนข้างนานครับ
เวลา controller จะ อ่านคำสั่งหรือข้อมูลจาก flash memory นั้น controller ก็จะส่ง address ของ
ข้อมูลที่ต้องการอ่านไปให้ flash ทาง address bus พอ flash ได้รับ address แล้ว flash จะส่งข้อมูล
กลับมาให้ทาง data bus ครับ แต่สัญญาณที่ flash ส่งกลับมา มันจะยังไม่เสถียรในทันที controller ต้องรอ
ไปซักระยะหนึ่งให้สัญญาณที่ flash ส่งกลับมาเสถียรก่อน แล้วจึงอ่านข้อมูลจาก data bus ครับ
และหน่วยของเวลาที่ controller มันจะจับเวลาได้มันก็มีแค่จำนวน pulse ของสัญญาณ clock นั้นแหละครับ
5 Wait state ก็หมายถึงรอ 5 Clock Tick ก่อนที่จะอ่านข้อมูลกลับมา
ระยะเวลา Wait state นี้มีหลายปัจจัยครับ หลักๆ 3 ปัจจัยก็คือ
1. เทคโนโลยีของ flash ถ้า flash memory ดีๆ ก็จะส่งสัญญาณให้เสถียรได้เร็ว
เช่น flash memory ใน STM32H7 ครับ ความถี่ clock สูงถึง 480MHz แต่รอแค่ 2 wait state
2. ความถี่ clock ที่ใช้ในการสื่อสารกับ flash ซึ่งปกติช่วงเวลาที่รอให้สัญญาณเสถียรมันจะคงที่
แต่ถ้าเราปรับความถี่ clock สูงขึ้น คาบเวลาในแต่ละ clock ก็จะน้อยลง ก็ต้องเพิ่มจำนวน wait state clock
เช่น flash ต้องใช้เวลา 100ns เพื่อให้สัญญาณเสถียร ถ้าใช้ความถี่ clock ที่ 50MHz จะมีคาบเวลาอยู่ที่ 20ns ต่อ 1 clock
ก็ต้องรออย่างน้อย 5 wait state ขึ้นไปถึงจะเพียงพอให้สัญญาณจาก flash เสถียร (5*20ns = 100ns)
แต่ถ้าเราเพิ่มความถี่ clock ไปที่ 100MHz แทน คาบเวลาอยู่ที่ 10ns ก็ต้องรออย่างน้อย 10 wait state ขึ้นไป
ถึงจะเพียงพอให้สัญญาณจาก flash เสถียร (10*10ns = 100ns)
3. ระดับแรงดันที่ใช้ในระบบ ถ้าแรงดันยิ่งสูงสัญญาณก็จะเสถียรเร็วขึ้นครับ
ยกตัวอย่าง STM32F401RE ใน Datasheet หน้า 61 ตารางที่ 15
ถ้าใช้ VDD = 1.8V และความถี่ Clock = 84MHz ต้องรอ 4 wait states ขึ้นไป
ถ้าใช้ VDD = 3.3V และความถี่ Clock = 84MHz ต้องรอ 2 wait states ขึ้นไป
มาถึงตรงนี้ ก็น่าจะพอเดาได้แล้วว่า ถ้าไม่มีการ set ค่า wait state ให้ถูกต้องจะเกิดผลอะไรหรือไม่
ปกติแล้ว ถ้าผมจำไม่ผิด STM32 แทบทุกตัว จะเริ่มการทำงานด้วยการใช้แหล่งกำเนิดสัญญาณ Clock ภายใน
หรือที่เรียกว่า HSI ซึ่งจะมีความถี่อยู่ที่ 16MHz เสมอ และจะตั้ง wait states ไว้ที่ 0
เวลาที่เราจะทำการ Config Clock เพื่อเปลี่ยนแหล่งกำเนิดสัญญาณ Clock ใหม่ ให้สูงขึ้น เราต้องพิจารณาว่า
ความถี่ใหม่ที่จะใช้นี้ต้องเพิ่ม wait states รึเปล่า ถ้าต้องเพิ่ม wait states เราต้องทำการปรับ wait states
ก่อนที่จะทำการเปลี่ยนแหล่งกำเนิดสัญญาณ Clock ของระบบ ไม่เช่นนั้นทันทีที่เปลี่ยนแหล่งกำเนิดสัญญาณ Clock
คำสั่งต่อไปที่ controller ทำการ fetch มาจะผิดไปหมด แล้วก็จะไปจบที่ Hardfault
ถ้าปรับ wait states สูงเกินไป controller ก็ยังทำงานได้ปกติครับ แต่ controller จะเสียเวลาในการรอข้อมูลไปเปล่าๆ
ซึ่งดูเหมือนว่ามันจะน้อย แต่ controller มีการ fetch คำสั่งตลอดเวลา ใน 1 วินาที fetch เป็นล้านครั้ง เมื่อรวมเวลาที่เสียไปมันก็มากอยู่ครับ