เหตุใดเขตข้อมูลบิตที่เกี่ยวข้องแบบตรรกะในการลงทะเบียน MCU มักจะอยู่ในตำแหน่งที่ตั้งอื่น?


9

ยกโทษให้ฉันถ้าคำถามนี้ได้รับคำตอบแล้ว แต่ฉันไม่สามารถหาคำตอบได้ในหน้านี้หรือในอินเทอร์เน็ตที่กว้างขึ้น

ฉันเป็นนักพัฒนาที่มีประสบการณ์และมีความรู้ที่ดีเกี่ยวกับการเขียนโปรแกรมระดับต่ำ แต่ค่อนข้างใหม่ในการพัฒนาแบบฝัง ฉันสอนการพัฒนาระบบสมองกลฝังตัวด้วยบอร์ด ST-NUCLEO144 ซึ่งมี STM32F746ZG MCU คำถามหนึ่งที่ดูเหมือนไม่ชัดเจนสำหรับฉันคือว่าทำไมฟิลด์บิตที่เกี่ยวข้องอย่างมีเหตุผลในรีจิสเตอร์อาจอยู่ในตำแหน่งที่ตั้งอื่น

ตัวอย่างหนึ่งคือการUSART_CR1ลงทะเบียนใน STM32746ZG M0และM1บิตเขตร่วมกันควบคุมความยาวของคำใน USART TX / RX, รวมมูลค่า 2 บิต0b00ระบุ 8 บิต0b01ระบุ 9 บิต ฯลฯ นี่คือทั้งหมดที่ค่อนข้างตรงไปตรงมายกเว้นว่าM0ที่บิตที่ 12 และM1ที่บิต 28 ... ทำไมเป็นอย่างนี้?

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

เห็นได้ชัดว่านี่เป็นเรื่องเล็กน้อยที่จะเอาชนะด้วยการหลอกลวงเล็กน้อย แต่ฉันแค่อยากรู้


1
ในกรณีของ UART โดยเฉพาะมันเป็นเทคโนโลยีที่เก่ามากดังนั้นเหตุผลก็คือความเข้ากันได้ย้อนหลังเกือบตลอดเวลา เหตุผลเดียวกันที่ทำให้ UART ลงทะเบียนบิตฟิลด์มักจะมีชื่อเส็งเคร็งที่ให้การชนของเนมสเปซทั้งหมด
Lundin

คำตอบ:


13

นี่คือเหตุผลการออกแบบที่สืบทอดมาเช่นมีการแทรกคุณลักษณะใหม่ลงในพื้นที่ที่สงวนไว้ก่อนหน้านี้หรือไม่

ในกรณีพิเศษนี้ (และในกรณีที่คล้ายกันที่ฉันเคยเห็น) ใช่มันถูกทำขึ้นเพื่อช่วยให้สามารถใช้งานร่วมกับอุปกรณ์รุ่นเก่าได้และลดการเปลี่ยนแปลงใด ๆ ที่จำเป็นสำหรับโค้ด (อาจมีการทดสอบที่ดีและผ่านการรับรอง / รับรอง) แล้ว . คุณสมบัติใหม่และฟังก์ชั่นการใช้งาน (ต้องการบิตการลงทะเบียนใหม่สำหรับการควบคุมและการกำหนดค่า) จึงต้องใช้บิตที่ไม่ต่อเนื่องกันหากบิตที่อยู่ติดกันกับบิตการลงทะเบียนเดิมถูกใช้ไปแล้ว

ตัวอย่างเช่นนี่คือการUSART_CR1ลงทะเบียนของตระกูล STM32F1xx เก่า


STM32F1xx ลงทะเบียนการใช้งานบิต USART_CR1

รูปที่ 1. การใช้งานการลงทะเบียน STM32F10xxx USART_CR1

แหล่งรูปภาพ: คู่มืออ้างอิงตระกูล STM32F10xxx RM0008 ส่วน 27.6.4


USART ที่เก่ากว่า (มีเพียง 2 ตัวเลือกความยาวคำ) ต้องการเพียงหนึ่งMบิตในการกำหนดค่าความยาวของคำ USART ระหว่างสองตัวเลือกและนั่นคือ 12 บิตสังเกตว่าใช้ 11 และ 13 บิตด้วยเหตุนี้จึงไม่พร้อมใช้งานในอนาคต .

ในขณะที่คุณกล่าวว่าเมื่อวันที่ใหม่ STM32F7 (และเช่นยัง STM32F4) เดอะ USART ตอนนี้มีตัวเลือกความยาวของคำ 3 (7, 8 และ 9 บิต) และเพื่อตอบสนองความต้องการบิตการกำหนดค่าอื่น - บิต 12 M0ที่มีM1อยู่ในขณะนี้บิต 28 (สงวนไว้ก่อนหน้านี้ในแผนที่การลงทะเบียน STM32F1 ตามที่คุณเห็นด้านบน)


STM32F74xxx ลงทะเบียนการใช้งานบิต USART_CR1

รูปที่ 2 การใช้งานการลงทะเบียน STM32F74xxx USART_CR1

แหล่งรูปภาพ: คู่มืออ้างอิงตระกูล STM32F75xxx และตระกูล STM32F74xxx RM0385 ส่วน 31.8.1


พวกเขาไม่สามารถใส่M1บิตใหม่ลงในบิตการลงทะเบียน 11 หรือ 13 โดยไม่ย้ายบิตการลงทะเบียนที่ใช้แล้วสำหรับฟังก์ชั่นอื่น ๆ และเพื่อลบความเข้ากันได้ย้อนหลังกับรหัสที่มีอยู่ (เช่นสำหรับ STM32F1) ที่ใช้

ดังนั้นพวกเขาจึงพยายามรักษาความเข้ากันได้แบบย้อนหลังซึ่งนำไปสู่บิตการลงทะเบียนใหม่ที่เพิ่มเข้ามาในสถานที่ที่ไม่คาดคิด

การบำรุงรักษาการแม็พรีจิสเตอร์สำหรับ UART แบบสแตนด์อโลนจาก 8250 ถึง 16550 โดยมีรีจิสเตอร์ใหม่เพิ่มที่อื่นในแผนที่รีจิสเตอร์เป็นอีกตัวอย่างหนึ่ง


1
ขอบคุณมากที่สละเวลาในการชี้ประเด็นนี้ บางทีฉันควรตรวจสอบเอกสารอ้างอิงตระกูล F เก่าก่อนที่ฉันจะถาม ฉันคิดว่าอาจมีเรื่องราวมากกว่านี้
ajxs

1
@ajxs - ไม่เป็นไร ฉันสามารถพูดจากประสบการณ์ของฉันเท่านั้น(UARTS เก่าเหล่านั้นเป็นอีกตัวอย่างที่ดี) เป็นไปได้เสมอที่คนอื่นจะมีประสบการณ์ที่เกี่ยวข้องอื่น ๆ และพวกเขาอาจถูกเลื่อนออกจากการใช้เวลาเขียนคำตอบหากคำถามนั้นมีคำตอบที่ยอมรับแล้ว ดังนั้นคุณสามารถ "ไม่ยอมรับ" คำตอบของฉันรอ (พูด) ต่อวันเพื่อให้คนอื่นได้รับคำตอบจากมุมมองที่แตกต่างกันและดูว่าคุณรู้สึกว่าพวกเขาตอบคำถามได้ดีกว่าของฉันหรือไม่ ถ้าไม่เช่นนั้นคุณสามารถรับของฉันได้อีกครั้ง :-) ฉันแค่ไม่อยากให้คุณสูญเสียมุมมองของคำตอบที่เป็นไปได้อื่น ๆ
SamGibson

2
ดูเหมือนว่าสมเหตุสมผลฉันจะรับคำแนะนำของคุณ! ขอขอบคุณที่กรุณาให้ข้อเสนอแนะที่สุภาพ ถ้าพรุ่งนี้ไม่มีคำตอบที่ดีไปฉันจะยอมรับคุณ ขอบคุณอีกครั้ง.
ajxs

5

คุณพูดถูก

"สำหรับเหตุผลการออกแบบดั้งเดิมเช่นคุณสมบัติใหม่ถูกแทรกลงในพื้นที่สงวนก่อนหน้านี้ .. "

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

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

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