Tại sao các trường bit liên quan đến logic trong các thanh ghi MCU thường ở các vị trí riêng biệt?


9

Hãy tha thứ cho tôi nếu câu hỏi này đã được trả lời, nhưng tôi không thể tìm thấy câu trả lời trên trang này hoặc trên Internet rộng hơn.

Tôi là một nhà phát triển có kinh nghiệm với kiến ​​thức tốt về lập trình cấp thấp, nhưng tương đối mới đối với phát triển nhúng. Tôi đã tự dạy mình phát triển hệ thống nhúng bằng bảng ST-NUCLEO144, có MCU STM32F746ZG. Một câu hỏi dường như không rõ ràng đối với tôi là tại sao các trường bit liên quan đến logic trong một thanh ghi có thể ở các vị trí khác nhau.

Một ví dụ là USART_CR1đăng ký trên STM32746ZG. Các trường M0M1bit cùng nhau kiểm soát độ dài từ trong USART TX / RX, giá trị 2 bit kết hợp của 0b00chỉ định 8 bit, 0b01chỉ định 9 bit, v.v ... Điều này hoàn toàn đơn giản, ngoại trừ đó M0là ở bit 12 và M1là bit 28 ... tại sao lại thế này?

Đây có phải là lý do thiết kế cũ, chẳng hạn như một tính năng mới đã được chèn vào không gian dành riêng trước đó? Có phải vì lý do liên quan đến thiết kế chip, mà tôi không xem xét, hoặc có mục đích lớn hơn cho điều này mà tôi không thấy?

Rõ ràng điều này là khá nhỏ để khắc phục với mặt nạ bit, nhưng tôi chỉ tò mò.


1
Trong trường hợp của UART cụ thể, nó là công nghệ rất cũ, vì vậy lý do hầu như luôn luôn tương thích ngược. Lý do tương tự tại sao các trường bit đăng ký UART thường có các tên nhảm nhí khiến xung đột không gian tên xảy ra khắp nơi.
Lundin

Câu trả lời:


13

Đây có phải là lý do thiết kế cũ, chẳng hạn như một tính năng mới đã được chèn vào không gian dành riêng trước đó?

Trong trường hợp cụ thể này (và trong các trường hợp tương tự tôi đã thấy) có, nó đã được thực hiện để giúp giữ khả năng tương thích ngược với các thiết bị cũ hơn và giảm thiểu mọi thay đổi cần thiết đối với mã (có thể được kiểm tra và chứng nhận / chứng nhận) đã được viết cho các thiết bị cũ đó . Do đó, các tính năng và chức năng mới (yêu cầu các bit thanh ghi mới để điều khiển & cấu hình) do đó phải sử dụng các bit không liền kề, nếu các bit liền kề với các bit thanh ghi gốc đã được sử dụng.

Ví dụ, đây là thanh USART_CR1ghi của gia đình STM32F1xx cũ.


STM32F1xx đăng ký sử dụng bit USART_CR1

Hình 1. Sử dụng đăng ký STM32F10xxx USART_CR1

Nguồn hình ảnh: Hướng dẫn tham khảo gia đình STM32F10xxx RM0008, phần 27.6.4


USART cũ hơn (chỉ có 2 tùy chọn độ dài từ) chỉ cần một Mbit để định cấu hình độ dài từ USART giữa hai tùy chọn và đó là bit 12. Lưu ý cách sử dụng bit 11 và 13, do đó không có sẵn cho "mở rộng" trong tương lai .

Như bạn nói, trên STM32F7 mới hơn (và, ví dụ, cũng là STM32F4) USART hiện nay có 3 lựa chọn chiều dài từ (7, 8 và 9 bit) và do đó cần một chút cấu hình - bit 12 là M0, với M1bây giờ trong 28 bit (trước đây được bảo lưu trong bản đồ đăng ký STM32F1, như bạn thấy ở trên).


STM32F74xxx đăng ký sử dụng bit USART_CR1

Hình 2. Sử dụng đăng ký STM32F74xxx USART_CR1

Nguồn hình ảnh: Hướng dẫn tham khảo gia đình STM32F75xxx và STM32F74xxx RM0385, phần 31.8.1


Họ không thể đặt M1bit mới vào các bit đăng ký 11 hoặc 13, mà không di chuyển các bit thanh ghi đã được sử dụng cho các chức năng khác và do đó loại bỏ khả năng tương thích ngược với mã hiện có (ví dụ: STM32F1) đã sử dụng chúng.

Vì vậy, họ đã cố gắng giữ một số khả năng tương thích ngược, dẫn đến các bit đăng ký mới được thêm vào những nơi không mong muốn.

Duy trì ánh xạ đăng ký cho các UART độc lập, từ 8250 đến 16550, với các thanh ghi mới được thêm vào nơi khác trong bản đồ đăng ký, là một ví dụ khác.


1
Cảm ơn rất nhiều vì đã dành thời gian để chỉ ra điều này. Có lẽ tôi nên kiểm tra tài liệu tham khảo gia đình F cũ trước khi tôi hỏi. Tôi nghĩ rằng có thể có nhiều câu chuyện hơn mặc dù.
ajxs

1
@ajxs - Bạn được chào đón. Tôi chỉ có thể nói từ kinh nghiệm của mình (những UARTS cũ đó là một ví dụ điển hình khác). Luôn luôn có khả năng người khác sẽ có những trải nghiệm liên quan khác và họ có thể không được dành thời gian viết câu trả lời, nếu câu hỏi đã có câu trả lời được chấp nhận. Vì vậy, bạn luôn có thể "không chấp nhận" câu trả lời của tôi, đợi (nói) một ngày để bất kỳ ai khác trả lời từ các quan điểm khác nhau, và xem bạn có cảm thấy họ trả lời câu hỏi nào tốt hơn của tôi không? Nếu không, thì bạn luôn có thể chấp nhận lại của tôi :-) Tôi chỉ không muốn bạn mất đi những quan điểm trả lời tiềm năng khác.
SamGibson

2
Điều đó có vẻ hợp lý, tôi sẽ lấy lời khuyên của bạn! Cảm ơn bạn đã lịch sự để đưa ra gợi ý. Nếu không có câu trả lời tốt hơn vào ngày mai tôi sẽ chấp nhận của bạn. Cảm ơn một lần nữa.
ajxs

5

Bạn đúng với

".. vì lý do thiết kế cũ, chẳng hạn như một tính năng mới đã được chèn vào không gian dành riêng trước đó ..".

Theo như tôi biết, bản thân các vị trí bit hầu như không có tác động thiết kế (trong quá trình triển khai chip) trong hầu hết các trường hợp. Nhà thiết kế thường cố gắng sử dụng bất cứ thứ gì có sẵn. Và trong một số trường hợp như khi bạn đang cố gắng mở rộng chiều rộng, v.v.

Điều đó nói rằng, tuy nhiên có một số trường hợp các vị trí bit được cố ý giữ cách xa nhau. Cụ thể đối với các bit rất quan trọng và KHÔNG được sửa đổi bằng cách ghi không chủ ý (do vị trí / mặt nạ sai hoặc bị xáo trộn để bảo mật) có thể khiến hệ thống kết thúc ở trạng thái không mong muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.