여기 에서 사용할 수있는 데이터 시트의 섹션 31을 읽은 경우 상황이 조금 더 명확해질 수 있습니다.
내가 아는 것에 대한 요약은 다음과 같습니다.
PIO는 Parallel Input / Output의 약자이며 한 번에 여러 개의 레지스터 포트를 읽고 쓰는 기능을 제공합니다. 데이터 시트에 레지스터 (예 : PIO_OWER)가 언급 된 경우 Arduino 라이브러리에는 REG_PIO? _OWER 형식으로 액세스하기위한 매크로가 있습니다. 여기서? 사용 가능한 다른 포트의 경우 A, B, C 또는 D입니다.
나는 느린 Arduino pinMode () 함수를 사용하여 REG_PIOC_OWER = 0xdeadbeef와 같은 약어 기반 레지스터 호출보다 코드를 더 읽기 쉽도록 핀에서 입력 / 출력을 설정하는 경향이 있지만 직접 레지스터를 사용하여 핀을 설정합니다. 성능 / 동기화. 아직까지 입력으로 아무것도하지 않았으므로 예제는 모두 출력 기반입니다.
기본 사용법의 경우 REG_PIO? _SODR을 사용하여 출력 라인을 높게 설정하고 REG_PIO? _CODR을 사용하여 출력 라인을 낮게 설정합니다. 예를 들어 REG_PIOC_SODR = 0x00000002는 PORTC (이것은 Due 디지털 핀 33 임)의 비트 1 (0부터 번호가 매겨 짐)을 높게 설정합니다. PORTC의 다른 모든 핀은 변경되지 않습니다. REG_POIC_CODR = 0x00000002는 PORTC의 비트 1을 낮게 설정합니다. 다른 모든 핀은 변경되지 않습니다.
병렬 데이터로 작업하는 경우 이것이 여전히 최적이 아니거나 동기화되지 않기 때문에 한 번의 호출로 포트의 32 비트를 모두 쓸 수있는 레지스터가 있습니다. 이들은 REG_PIO? _ODSR이므로 REG_PIOC_ODSR = 0x00000002는 이제 PORTC에서 비트 1을 설정하고 PORTC의 다른 모든 비트는 단일 CPU 명령에서 즉시 낮게 설정됩니다.
포트의 모든 32 비트를 동시에 설정해야하는 상황이 아닐 가능성이 높으므로 현재 핀 값을 저장하고 AND 연산을 수행하여 해당 핀을 마스킹해야합니다. 변경하려는 OR 연산을 수행하여 원하는 것을 높게 설정 한 다음 쓰기를 다시 수행하십시오. 이는 최적이 아닙니다. 이를 극복하기 위해 CPU 자체가 마스킹을 수행합니다. OWSR (출력 쓰기 상태 레지스터)이라는 레지스터가있어 OWSR에 설정된 비트와 일치하지 않는 ODSR에 쓰는 비트를 마스킹합니다.
따라서 이제 REG_PIOC_OWER = 0x00000002 (이것은 OWSR의 비트 1을 높게 설정) 및 REG_PIOC_OWDR = 0xfffffffd (이것은 OWSR의 비트 1을 제외한 모든 비트를 지 웁니다)를 호출 한 다음 REG_PIOC_ODSR = 0x00000002를 다시 호출하면 이번에는 비트 만 변경됩니다. PORTC의 1과 다른 모든 비트는 변경되지 않습니다. 는 사실에주의 심고가 할 수 있는 비트가 1로 설정되어 당신이 쓰는 값에와 있음을 OWDR가 비활성화 모든 비트를 1로 설정되어 당신이 쓰는 값을. 읽을 때 이것을 이해했지만, OWDR 이 내가 쓴 값에서 1로 설정 되지 않은 비트를 비활성화한다고 생각하는 첫 번째 테스트 코드를 작성할 때 여전히 코드 실수를 범했습니다 .
적어도 이것이 Due CPU의 PIO를 이해하는 데 약간의 도움이 되었기를 바랍니다. 책을 읽고 연극을하고 더 궁금한 점이 있으면 답변을 드리도록하겠습니다.
편집 : 하나 더 ...
PORT의 어떤 비트가 Due의 어떤 디지털 라인에 해당하는지 어떻게 알 수 있습니까? 이것을 확인하십시오 : 마감 핀아웃