Tại sao trước tiên tôi cần đặt giá trị và hướng của GPIO trong bộ xử lý nhúng?


16

Tôi có một công việc toàn thời gian là một kỹ sư phần mềm. Gần đây tôi đã được giao một nhiệm vụ để xem xét cấu hình GPIO và thay đổi cài đặt khi cần. Tôi tìm thấy một vài chân được cấu hình không chính xác nên tự nhiên tôi đã cấu hình lại chúng, tuy nhiên tôi được cho biết là tôi đã làm sai thứ tự. Đây là những gì tôi đang nói về:

Trước:
GPIO1.direction = INPUT;

Sau:
GPIO1.direction = OUTPUT;
GPIO1.value = 0;

Tuy nhiên trong quá trình xem xét mã tôi đã được thông báo rằng tôi cần thay đổi thứ tự khởi tạo thành như sau:

GPIO1.value = 0;
GPIO1.direction = OUTPUT;

Nói cách khác, đặt giá trị trước rồi đặt hướng của pin. Tôi cũng đã được thông báo rằng đây là cách nó cần phải có trên các bộ xử lý hiện đại bởi vì chúng sử dụng hai thanh ghi, một cho đầu vào và một cho đầu ra, tuy nhiên các bộ xử lý cũ chỉ sử dụng một thanh ghi, vì vậy thứ tự hoạt động sẽ không thành vấn đề.
(Lưu ý: Hiện đại = ARM Cortex M3 trở lên, Cũ = Intel 8051)

Tôi yêu cầu một lời giải thích tốt hơn trong công việc, nhưng tôi không thể có được một câu trả lời tốt. Đó là lý do tại sao tôi quyết định hỏi ở đây.

Vì vậy, đây là những câu hỏi của tôi:

  1. Tại sao thứ tự khởi tạo lại quan trọng trên bộ xử lý mới?
  2. Tại sao thứ tự khởi tạo không quan trọng trên các bộ xử lý cũ?
  3. Họ đang nói về hai thanh ghi nào trong các bộ xử lý hiện đại?
  4. Những gì đăng ký duy nhất họ đang nói về bộ xử lý cũ?

Nếu ai đó có thể cung cấp một số loại sơ đồ, điều đó sẽ còn tốt hơn nữa.


1
Bộ xử lý "Hiện đại" và "Cũ" quá mơ hồ để đưa ra câu trả lời hữu ích. Kiến trúc khác nhau có cài đặt đăng ký khác nhau; mà không biết những gì bạn đang nói về không có cách nào để bình luận một cách thông minh về họ.
Nick Johnson

@ IgnacioVazquez-Abrams Không, không thực sự. Có những kỹ sư rất có kinh nghiệm trong phòng nói rằng bạn sẽ gặp trục trặc trên đường dây nếu nó được thực hiện theo cách của tôi.
chớp nhoáng 16/07/2015

@NickJohnson Modern = ARM Cortex M4 trở lên, Cũ = Intel 8051.
flashburn 16/07/2015

@BrianDrummond LOL. Giải thích rất hay. Nhưng những gì về bộ xử lý cũ, 8051 chẳng hạn. Tại sao điều này không quan trọng với họ?
chớp nhoáng

2
Q4 sẽ dễ dàng hơn để trả lời với một liên kết biểu dữ liệu.
pjc50

Câu trả lời:


22

8051 ban đầu được sử dụng cái gọi là cổng đầu ra hai chiều giả (mở cống với pullups), do đó thực sự không có cài đặt hướng cổng.

Tất nhiên đối với các cổng đầu ra hai chiều thực sự hiện đại, tốt hơn là nên đặt một giá trị đã biết trước khi bật chân cổng cho đầu ra, bởi vì nếu không, bạn có thể có một đầu ra tạm thời có thể làm điều gì đó không mong muốn.

Xem câu trả lời của tôi ở đây , ví dụ.

Chỉnh sửa: Đây là cấu trúc chân I / O cho một vi điều khiển (tương đối) hiện đại :

nhập mô tả hình ảnh ở đây

TRIS (TRIState) được gọi là DDR (Thanh ghi hướng dữ liệu) trong nhiều micros khác. Trong trường hợp này, nếu đầu ra chốt TRIS cao thì cả hai bóng bán dẫn đều 'tắt', nhưng cổng vẫn có thể được đọc.

Đây là cấu trúc chân I / O phức tạp hơn một chút cho micro Microchip mới hơn .

nhập mô tả hình ảnh ở đây

Một lần nữa, chốt TRIS sẽ vô hiệu hóa đầu ra. Cái này bao gồm một chốt LAT giúp tránh các vấn đề đọc-sửa-ghi . Trên loạt PIC, bạn chỉ nên ghi vào thanh ghi LAT (và đọc từ thanh ghi PORT).

Dưới đây là mạch bên trong chân cổng I / O cổ điển 8051 và CMOS 8051 (từ nguồn này ):

nhập mô tả hình ảnh ở đây

Có một chút phức tạp thêm ở chỗ có một bóng bán dẫn tăng tốc song song với việc kéo lên được bật nhanh để khắc phục điện dung bên ngoài. Như bạn có thể thấy, không có kiểm soát TRIS / DDR nào cả. Các MOSFET kéo lên được sử dụng trong hoạt động bình thường là 'yếu' - chúng đủ nhỏ (Idss thấp) để đầu ra bên ngoài được kết nối với pin có thể kéo dòng cổng giả hai chiều xuống thấp.


Cảm ơn đã giải thích. Tôi đã không làm việc với phần cứng trong một thời gian vì vậy tôi rất khó hiểu được lời giải thích từ một mô tả. Bạn có phiền khi cung cấp hình ảnh? Nói phần cứng cấu hình pin sẽ trông như thế nào trên bộ xử lý hiện đại so với 8051 như thế nào? Tôi thực sự sẽ đánh giá cao nó.
chớp nhoáng 16/07/2015

Bạn có ý nghĩa gì bởi phần cứng? Mạch GPIO bên trong của chip?
Spehro Pefhany 16/07/2015

Đúng rồi. Một số loại sơ đồ sẽ thực sự hữu ích.
chớp nhoáng 16/07/2015

16

Nếu bạn đặt hướng trước, pin sẽ được cấu hình ngắn gọn để xuất bất kể giá trị đầu ra hiện tại của nó là gì. Nếu bạn đặt giá trị đầu tiên, điều này sẽ không xảy ra.

Vì vậy, thực hiện theo cách bạn đã được đề xuất để tránh các trục trặc ở đầu ra, có thể từ vô hại đến thảm khốc, tùy thuộc vào việc pin được kết nối với cái gì.


Cảm ơn. Vậy những bộ xử lý cũ thì sao, tại sao điều này không quan trọng với họ? Cũ = Intel 8051
flashburn

Tôi không quen thuộc với 8051. Dựa trên những gì đồng nghiệp của bạn đã nói, nếu cùng một thanh ghi cấu hình cả hướng và giá trị, sẽ không có vấn đề gì vì trình biên dịch sẽ tối ưu hóa hai lần ghi thành một.
Nick Johnson

2
có lẽ vẫn là một thói quen tốt để thực hiện theo cách "mới" này cho các bộ xử lý cũ cũng vì lý do trên. Các nhà giáo dục khác nhau có thể có các yêu cầu khác nhau, các nhà cung cấp khác nhau có thể đưa ra gợi ý tốt hơn so với những người khác và các công ty / nhà tuyển dụng / nhóm khác nhau có thể có các chính sách khác nhau về các chi tiết đó.
hóa đơn

2
thực sự ... luôn cho rằng DIO được kết nối với tia laser quỹ đạo của sự diệt vong;)
Michael

4

Giả sử hướng mặc định là đầu vào (nghĩa là High-Z, điều này có ý nghĩa vì chúng tôi không muốn MCU buộc bất kỳ giá trị nào trên các đường được kết nối), thứ tự thiết lập cổng này là thích hợp hơn nhưng không cần thiết. Thực tế là cần thiết khi ứng dụng của bạn yêu cầu khi khởi động, giá trị của cổng sẽ không được, nói 1. Sau đó, bạn sẽ đặt giá trị thành 0và sau đó thay đổi hướng. Trong trường hợp này, bạn tránh được "trục trặc" nhất thời có thể giữa cài đặt hướng và giá trị, điều này có thể dẫn đến tăng đột biến trên chân đó. Và nó đúng cho tất cả các bộ xử lý có logic như vậy, không chỉ những cái mới.

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.