푸시 풀 / 오픈 드레인; 풀업 / 풀다운 “출력 타입 레지스터는”각각있는. 들어 GPIO_PUPDR나는 세 가지

ARM Cortex 칩, 특히 GPIO 장의 데이터 시트를 읽고 있습니다. 궁극적으로 SRAM에 대한 읽기 / 쓰기 액세스를 위해 “대체 기능”모드에서 다양한 GPIO 핀을 사용하도록 구성하려고합니다.

모든 GPIO가 가능한 레지스터, 나는 두 가지를 이해하지 못하는 : GPIO_PUPDRGPIO_OTYPE은 “풀업 / 풀다운 레지스터”과 “출력 타입 레지스터는”각각있는.

들어 GPIO_PUPDR나는 세 가지 선택이있다 :

  • 풀업 또는 풀다운 없음
  • 풀업
  • 풀다운

들어 GPIO_0TYPE나는 두 가지 선택이있다 :

  • 출력 푸시 풀
  • 출력 오픈 드레인

다른 모든 구성의 차이점은 무엇이며 SRAM 통신에 가장 적합한 구성은 무엇입니까?

작업중인 보드에 대한 설명서는 여기에서 볼 수 있습니다 (SRAM 회로도는 24 페이지 참조). ARM 칩에 대한 참조 매뉴얼은 여기에 있습니다 (GPIO 레지스터에 대해서는 145 및 146 페이지 참조).



답변

이 답변은 프로세서 및 주변 장치에 일반적으로 사용되며 끝에 특정 RAM 및 CPU와 관련된 SRAM 관련 설명이 있습니다.

출력 핀은 세 가지 모드로 구동 할 수 있습니다.

  • 오픈 드레인 -트랜지스터는 낮게 연결되고 다른 것은 연결되지 않습니다.
  • 풀업 기능이있는 오픈 드레인 -트랜지스터는 낮게 연결되고 저항은 높이로 연결
  • 푸시-풀 -트랜지스터는 하이에 연결되고 트랜지스터는 로우에 연결됩니다 (한 번에 하나만 작동 됨)

입력 핀은 다음과 같은 게이트 입력이 될 수 있습니다.

  • 풀업- 높음에 연결된 저항
  • 풀다운- 로우에 연결된 저항
  • 풀업 및 풀다운- 저항은 높음에 연결되고 저항은 낮음에 연결됩니다 (드문 경우에만 유용).

도있다 슈미트 트리거 입력 모드 입력 핀이 초기 상태에 약한 풀업으로 당겨진다. 홀로 남겨두면 상태는 유지되지만 최소한의 노력으로 새로운 상태로 끌어 올 수 있습니다.

개방 드레인은 여러 게이트 또는 핀이 (외부 또는 내부) 풀업과 함께 연결될 때 유용합니다. 모든 핀이 높으면 모두 개방 회로이며 풀업은 핀을 높입니다. 핀이 낮 으면 함께 묶을 때 모두 낮아집니다. 이 구성은 효과적으로 AND게이트를 형성합니다 .

SRAM을 구동 할 때 데이터 라인 또는 주소 라인을 가능한 한 견고하고 빠르게 구동하여 활성 상하 구동이 필요하므로 푸시 풀이 표시됩니다. 여러 램과 경우에 따라 수 있습니다 영리한 무언가를 다른 모드가 더 적합 할 수 라인을 결합하려는.

SRAM에 데이터 입력을 SRAM와 RAM IC는 항상 다음 어떤 풀업와 핀 데이터를 주장하면 것은 아마 램이 항상 레벨을 설정하고이 부하를 최소화으로 OK. RAM 데이터 라인이 때때로 개방 회로 또는 3 상태 인 경우 입력 핀이 고유 한 유효한 상태를 설정할 수 있어야합니다. 초고속 통신에서 당신은 할 수 있습니다 병렬 효과적인 저항 종단 저항이며, 버스 대기 전압이 두 저항에 의해 설정되어 있지만이 다소 전문 그래서 풀업 및 및 AA 풀다운을 사용하고 싶습니다.


답변

STM32 에서 GPIO 설정 이해 에서이 답변을 찾았습니다.

  • GPIO_PuPd (풀업 / 풀다운)

디지털 회로에서는 신호선이 “부동”되지 않도록하는 것이 중요합니다. 즉, 항상 높은 상태 또는 낮은 상태에 있어야합니다. 부동 상태에서는 상태가 결정되지 않으며 몇 가지 다른 유형의 문제가 발생합니다.

이를 수정하는 방법은 신호선의 저항을 Vcc 또는 Gnd에 추가하는 것입니다. 이런 식으로, 라인이 능동적으로 높거나 낮게 구동되지 않으면 저항은 전위를 알려진 레벨로 드리프트시킵니다.

ARM (및 기타 마이크로 컨트롤러)에는이를위한 내장 회로가 있습니다. 이렇게하면 회로에 다른 부품을 추가 할 필요가 없습니다. 예를 들어 “GPIO_PuPd_UP”을 선택하면 신호 라인과 Vcc 사이에 저항을 추가하는 것과 같습니다.

  • GPIO_OType (출력 유형) :

푸시 풀 : 대부분의 사람들이 “표준”으로 생각하는 출력 유형입니다. 출력이 낮아지면 실제로 “접지”됩니다. 반대로, 출력이 높음으로 설정되면 Vcc쪽으로 적극적으로 “밀어 내”집니다. 단순화하면 다음과 같습니다.

반면에 오픈 드레인 출력은 한 방향으로 만 활성화됩니다. 핀을지면쪽으로 당길 수는 있지만 높이로 구동 할 수는 없습니다. 상단 MOSFET이없는 이전 이미지를 상상해보십시오. 접지로 당기지 않을 경우 (하단) MOSFET은 단순히 비전 도성이므로 출력이 플로팅됩니다.

이러한 유형의 출력을 위해서는 회로에 풀업 저항이 추가되어 로우로 구동되지 않을 때 라인이 높아질 수 있습니다. 외부 부품을 사용하거나 GPIO_PuPd 값을 GPIO_PuPd_UP으로 설정하여이를 수행 할 수 있습니다.

이름은 MOSFET의 드레인이 내부적으로 어떤 것과도 연결되어 있지 않다는 사실에서 비롯됩니다. MOSFET 대신 BJT를 사용할 때 이러한 유형의 출력을 “오픈 콜렉터”라고도합니다.

  • GPIO_Speed

기본적으로 출력 신호의 슬 루율 (상승 시간 및 하강 시간)을 제어합니다. 슬 루율이 빠를수록 회로에서 더 많은 노이즈가 방출됩니다. 슬루 레이트를 느리게 유지하고 특정 이유가있는 경우에만 슬루 레이트를 높이는 것이 좋습니다.


답변

좀 더 작은 tid- 비트 : AVR과 같은 명시적인 “오픈 드레인”모드가없고 Uno와 같은 Arduino ATmega328 기반 보드가없는 마이크로 컨트롤러의 경우이 “오픈 드레인”모드는 래퍼 기능을 작성하여 시뮬레이션 할 수 있습니다. a를 보낼 때 단순히 핀을 “출력 LOW”로 설정하고 a를 보낼 때 0핀을 “입력 LOW”(높은 임피던스 모드, 내부 풀업 저항 NOT)로 구성합니다 1. 이런 식으로 같은 효과를 얻을 수 있습니다. 이 최신 32 비트 ARM 코어 마이크로 컨트롤러에는 훨씬 더 많은 옵션이 있습니다.

또한, 위에 링크 된 STM32 Reference Manual의 p146은 다음과 같습니다 [추가 된 부분은 대괄호 안에 있습니다] .

– 오픈 드레인 모드 : 출력 레지스터의 “0”은 N-MOS를 활성화합니다 ( 핀을 GND에 연결하여 적극적으로 LOW를 구동 함) . 출력 레지스터의 “1”은 포트를 Hi-Z (P- MOS는 활성화되지 않음) [고 임피던스 모드-풀업 또는 풀다운 저항이없는 플로팅 입력과 동일]

– 푸시 풀 모드 : 출력 레지스터의 “0”은 N-MOS를 활성화하고 [핀을 GND에 연결하여 적극적으로 LOW를 구동합니다] , 출력 레지스터의 “1”은 P-MOS를 활성화 합니다. VCC에 대한 핀]


Arduino 코드에서 “래퍼 함수”는 다음과 같이 구현 될 수 있습니다.

digitalWriteOpenDrain(byte pin, bool state)
{
    // Actively drive LOW
    if (state==LOW)
    {
        pinMode(pin, OUTPUT);
        digitalWrite(pin, LOW);
    }
    // High impedance mode
    // (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
    else //state==HIGH
    {
        pinMode(pin, INPUT);
        digitalWrite(pin, LOW);
    }
}

또는 단순화 :

digitalWriteOpenDrain(byte pin, bool state)
{
    digitalWrite(pin, LOW);

    // Actively drive LOW
    if (state==LOW)
    {
        pinMode(pin, OUTPUT);
    }
    // High impedance mode
    // (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
    else //state==HIGH
    {
        pinMode(pin, INPUT);
    }
}

Arduino 에서 내부 풀업 저항 려면 다음을 수행하십시오.

pinMode(pin, INPUT_PULLUP);

또는 (같은 것) :

pinMode(pin, INPUT);
digitalWrite(pin, HIGH);

추가 자료 :


답변