Nếu bạn đã đọc phần 31 của Bảng dữ liệu, có sẵn từ đây , mọi thứ có thể rõ ràng hơn một chút cho bạn.
Dưới đây là tóm tắt về những gì tôi biết:
PIO là viết tắt của Parallel Input / Output và cung cấp chức năng đọc và ghi nhiều cổng đăng ký cùng một lúc. Trường hợp biểu dữ liệu đề cập đến một thanh ghi, ví dụ PIO_OWER, thư viện Arduino có các macro để truy cập chúng theo định dạng này REG_PIO? _OWER ở đâu? là A, B, C hoặc D cho các cổng khác nhau có sẵn.
Tôi có xu hướng vẫn sử dụng hàm Arduino pinMode () chậm để đặt đầu vào / đầu ra trên các chân vì nó làm cho mã dễ đọc hơn các lệnh gọi đăng ký dựa trên từ viết tắt như REG_PIOC_OWER = 0xdeadbeef, nhưng sau đó sử dụng các thanh ghi trực tiếp để đặt các chân cho hiệu suất / đồng bộ hóa. Tuy nhiên, tôi chưa làm gì với đầu vào, vì vậy các ví dụ của tôi đều dựa trên đầu ra.
Đối với việc sử dụng cơ bản, bạn sẽ sử dụng REG_PIO? _SODR để đặt các dòng đầu ra ở mức cao và REG_PIO? _CODR để đặt chúng ở mức thấp. Ví dụ: REG_PIOC_SODR = 0x00000002 sẽ đặt bit 1 (được đánh số từ 0) trên PORTC (đây là pin kỹ thuật số 33) cao. Tất cả các chân khác trên PORTC vẫn không thay đổi. REG_POIC_CODR = 0x00000002 sẽ đặt bit 1 ở mức PORTC thấp. Một lần nữa tất cả các chân khác sẽ không thay đổi.
Vì điều này vẫn chưa tối ưu hoặc được đồng bộ hóa nếu bạn đang làm việc với dữ liệu song song, có một thanh ghi cho phép bạn ghi tất cả 32 bit của một cổng với một cuộc gọi. Đây là REG_PIO? _ODSR, vì vậy REG_PIOC_ODSR = 0x00000002 bây giờ sẽ đặt bit 1 trên mức cao PORTC và tất cả các bit khác trên PORTC sẽ được đặt ở mức thấp ngay lập tức trong một lệnh CPU.
Bởi vì không chắc là bạn đã từng ở trong tình huống cần thiết lập tất cả 32 bit của một cổng, bạn sẽ cần lưu trữ giá trị hiện tại của các chân, thực hiện thao tác AND để che giấu những cái bạn muốn thay đổi, thực hiện thao tác OR để đặt mức bạn muốn đặt lên cao, sau đó thực hiện ghi và viết lại, và điều này không tối ưu. Để khắc phục điều này, CPU sẽ tự thực hiện mặt nạ cho bạn. Có một thanh ghi được gọi là OWSR (thanh ghi trạng thái ghi đầu ra) sẽ che giấu bất kỳ bit nào bạn ghi vào ODSR không khớp với các bit được đặt trong OWSR.
Vì vậy, bây giờ nếu chúng ta gọi REG_PIOC_OWER = 0x00000002 (điều này đặt bit 1 của OWSR cao) và REG_PIOC_OWDR = 0xfffffffd (điều này sẽ xóa tất cả các bit ngoại trừ bit 1 của OWSR) 1 của PORTC và tất cả các bit khác không thay đổi. Hãy chú ý đến thực tế là OWER cho phép bất kỳ bit nào được đặt thành 1 trong giá trị bạn viết và OWDR sẽ vô hiệu hóa bất kỳ bit nào được đặt thành 1 trong giá trị bạn viết. Mặc dù tôi đã hiểu điều này khi đọc nó, tôi vẫn cố gắng mắc lỗi mã khi viết mã kiểm tra đầu tiên của mình với suy nghĩ rằng các bit bị vô hiệu hóa OWDR không được đặt thành 1 trong giá trị tôi đã viết.
Tôi hy vọng điều này ít nhất đã cho bạn một chút khởi đầu trong việc tìm hiểu PIO của CPU do. Hãy đọc và chơi và nếu bạn có thêm câu hỏi nào, tôi sẽ cố gắng trả lời chúng.
Chỉnh sửa: Một điều nữa ...
Làm thế nào để bạn biết bit nào của PORT tương ứng với dòng kỹ thuật số nào của Hạn? Kiểm tra này: Do Pinout