SAM3X8E (Arduino Due) 핀 IO 레지스터


9

Arduino Due의 IO 레지스터는 어떻게 작동합니까? 아두 이노 우노 그냥 설정에서 DDRx, 다음 PINx, 읽기 PORTx내가 아두 이노 인해와 같은 일을하고 싶습니다, 쓰기,하지만 같은 더 많은 레지스터가 PIO_OWER, PIO_OSER, PIO_CODR, PIO_SODR아두 이노 우노와 사이에 대응 관계를 찾을 등 I를 Arduino Due 레지스터.

같은 몇 가지 유용한 기능도있다 pio_clear, pio_set, pio_get, 등, 모두 여기에서 설명이 :

http://asf.atmel.com/docs/3.19.0/sam3x/html/group__sam__drivers__pio__group.html

이제 세 가지 언급 된 기능이 무엇인지 이해했지만 다른 기능은 이해하지 못했습니다.

pio_configure (Pio *p_pio, const pio_type_t ul_type, const uint32_t ul_mask, const uint32_t ul_attribute)

나는 무엇 ul_attribute이고 무엇인지 알 수 없습니다 ul_type.


다음은 AVR 및 SAM에 대해 구현 된 GPIO 클래스입니다. 레지스터 사용 방법에 대한 힌트를 줄 수 있습니다. github.com/mikaelpatel/Arduino-GPIO/blob/master/src/Hardware/…
Mikael Patel

답변:


7

여기 에서 사용할 수있는 데이터 시트의 섹션 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의 어떤 디지털 라인에 해당하는지 어떻게 알 수 있습니까? 이것을 확인하십시오 : 마감 핀아웃


3

기본 직접 핀 액세스에는 상당히 간단한 기능이 있습니다. 다음은 디지털 핀을 높고 낮게 설정하는 방법을 보여주는 샘플 코드입니다. 첫 번째는 Arduino Due, 두 번째는 Arduino Uno / Mega 등입니다.

const unsigned int imThePin = 10; //e.g. digital Pin 10

#ifdef _LIB_SAM_

    //First lets get the pin and bit mask - this can be done once at the start and then used later in the code (as long as the variables are in scope
    Pio* imThePort = g_APinDescription[imThePin].pPort; 
    unsigned int imTheMask = g_APinDescription[imThePin].ulPin; 

    //Lets set the pin high
    imThePort->PIO_SODR = imTheMask;
    //And then low
    imThePort->PIO_CODR = imTheMask;

#else

    //First lets get the pin and bit mask - this can be done once at the start and then used later in the code (as long as the variables are in scope
    volatile unsigned char* imThePort = portOutputRegister(digitalPinToPort(imThePin)); 
    unsigned char imTheMask = digitalPinToBitMask(imThePin);

    //Lets set the pin high
    *imThePort |= imTheMask;
    //Now low
    *imThePort &= ~imTheMask;

#endif

이를 위해 필요한 모든 것이 기본적으로 포함되어야하며, 그렇지 않은 경우에는 #include <Arduino.h>충분합니다.

실제로 Pio설정 / 클리어링 / 풀업 저항 등을 수행 할 포인터 가 있으면 호출 할 수있는 기능이 있습니다 . 약간 더 깔끔해 보이는 함수 호출을 사용합니다. 전체 목록은 헤더 파일.


0

이것은 33 번 핀에 LED를 깜빡이는 코드 예제입니다. 위에서 빌린 코드-매우 유용한 설명에 감사드립니다. 포트에 대한 빠른 액세스. 코드가 맞습니다. 특히 핀을 낮게 설정하는 줄이 있습니다. LED가 행복하게 깜박입니다.

void setup() 
{
  pinMode(33, OUTPUT); 
  REG_PIOC_OWER = 0x00000002; 
  REG_PIOC_OWDR = 0xfffffffd; 
}

void loop() 
{
  REG_PIOC_ODSR = 0x00000002; 
  delay(1000);             
  REG_PIOC_ODSR = 0x00000000;    
  delay(1000);   
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.