임베디드 프로세서에서 GPIO의 값과 방향을 먼저 설정해야하는 이유는 무엇입니까?


16

펌웨어 엔지니어로 정규직으로 일하고 있습니다. 최근 GPIO 구성을 검토하고 필요에 따라 설정을 변경하는 작업이있었습니다. 자연스럽게 잘못 구성 된 몇 개의 핀을 찾았으므로 다시 구성했지만 잘못된 순서로 수행했다고 들었습니다. 내가 말하고있는 것은 다음과 같습니다.

이전 :
GPIO1.direction = INPUT;

이후 :
GPIO1.direction = OUTPUT;
GPIO1.value = 0;

그러나 코드 검토 중에 초기화 순서를 다음과 같이 변경해야한다고 들었습니다.

GPIO1.value = 0;
GPIO1.direction = 출력;

즉, 먼저 값을 설정 한 다음 핀의 방향을 설정하십시오. 나는 이것이 현대 프로세서에 있어야하는 방법이라고 들었습니다. 입력과 출력에 각각 하나씩 두 개의 레지스터를 사용하기 때문입니다. 그러나 오래된 프로세서는 하나의 레지스터 만 사용하므로 작업 순서는 중요하지 않습니다.
(참고 : Modern = ARM Cortex M3 이상, Old = Intel 8051)

직장에서 더 나은 설명을 요청했지만 좋은 답변을 얻을 수 없었습니다. 그렇기 때문에 여기에 물어보기로했습니다

내 질문은 다음과 같습니다.

  1. 새 프로세서에서 초기화 순서가 중요한 이유는 무엇입니까?
  2. 이전 프로세서에서 초기화 순서가 중요하지 않은 이유는 무엇입니까?
  3. 현대 프로세서에서 어떤 두 레지스터에 대해 이야기하고 있습니까?
  4. 이전 프로세서에서 어떤 단일 레지스터에 대해 이야기하고 있습니까?

누군가가 일종의 다이어그램을 제공 할 수 있다면 더 좋습니다.


1
"현대"및 "이전"프로세서는 유용한 답변을하기에는 너무 모호합니다. 아키텍처마다 레지스터 설정이 다릅니다. 어떤 말을하는지 알지 못하면 지능적으로 의견을 말할 방법이 없습니다.
Nick Johnson

@ IgnacioVazquez-Abrams 아니오, 실제로는 아닙니다. 방에 경험이 풍부한 엔지니어들이 내 길을 마치면 고장이 날 것이라고 말했다.
flashburn

@NickJohnson Modern = ARM Cortex M4 이상, Old = Intel
8051.

@BrianDrummond LOL. 아주 좋은 설명입니다. 그러나 예를 들어 8051과 같은 이전 프로세서는 어떻습니까? 왜 이것이 중요하지 않습니까?
flashburn

2
Q4는 데이터 시트 링크로 답변하기가 더 쉬울 것입니다.
pjc50

답변:


22

원래 8051은 소위 의사 양방향 출력 포트 (풀업이있는 오픈 드레인)를 사용했기 때문에 실제로 포트 방향 설정이 없었습니다.

물론 현대의 진정한 양방향 출력 포트의 경우 출력을 위해 포트 핀을 활성화하기 전에 알려진 값을 설정하는 것이 좋습니다.

예를 들어 여기에 내 대답을 참조하십시오 .

편집 : (상대적으로) 최신 CMOS 마이크로 컨트롤러 의 I / O 핀 구조는 다음과 같습니다 .

여기에 이미지 설명을 입력하십시오

TRIS (TRIState)는 다른 많은 마이크로에서 DDR (Data Direction Register)이라고합니다. 이 경우 TRIS 래치 출력이 높으면 두 트랜지스터가 모두 '꺼짐'상태이지만 포트를 계속 읽을 수 있습니다.

최신 Microchip 마이크로를 위한 약간 더 복잡한 I / O 핀 구조는 다음과 같습니다 .

여기에 이미지 설명을 입력하십시오

다시, TRIS 래치는 출력을 비활성화합니다. 여기에는 읽기-수정-쓰기 문제를 방지하는 데 도움이되는 LAT 래치가 포함됩니다 . PIC 시리즈에서는 LAT 레지스터에만 쓰고 PORT 레지스터에서 읽어야합니다.

다음은 원래 8051 및 CMOS 8051 클래식 I / O 포트 핀 내부 회로입니다 ( 이 소스의 ).

여기에 이미지 설명을 입력하십시오

외부 커패시턴스를 극복하기 위해 잠깐 켜진 풀업과 병렬로 가속 트랜지스터가 있다는 점에서 약간의 복잡성이 있습니다. 보시다시피, TRIS / DDR 제어는 전혀 없습니다. 정상 동작에 사용되는 풀업 MOSFET은 '약한'-핀에 연결된 외부 출력이 의사 양방향 포트 라인을 낮출 수있을 정도로 작습니다 (낮은 Idss).


설명 주셔서 감사합니다. 나는 한동안 하드웨어를 다루지 않았기 때문에 설명에서 설명을 이해하는 데 어려움을 겪었습니다. 이미지를 제공 하시겠습니까? 핀 구성 하드웨어가 최신 프로세서에서 어떻게 보일지와 8051에서 어떻게 보일까요? 정말 고맙겠습니다.
flashburn

하드웨어 란 무엇을 의미합니까? 칩의 내부 GPIO 회로는?
Spehro Pefhany

맞습니다. 어떤 종류의 다이어그램이 실제로 도움이 될 것입니다.
flashburn

16

방향을 먼저 설정하면 핀은 현재 출력 값이 무엇이든 출력하도록 짧게 구성됩니다. 값을 먼저 설정하면 이런 일이 발생하지 않습니다.

따라서 사용자가 권장 한 방식으로 수행하면 핀이 연결된 대상에 따라 무해한 것에서 치명적인 것까지 출력에 글리치가 발생하지 않습니다.


감사. 그렇다면 이전 프로세서는 어떻습니까? 왜 이것이 중요하지 않습니까? Old = Intel 8051
flashburn

동료들이 말한 바에 따르면 동일한 레지스터가 방향과 값을 모두 구성하는 경우 컴파일러가 두 쓰기를 하나로 쓰기 때문에 문제가되지 않습니다.
닉 존슨

2
아마도 위의 이유로도 오래된 프로세서에 대해이 "새로운"방식으로 수행하는 것이 좋은 습관 일 것입니다. 다른 orocessor는 다른 요구 사항을 가질 수 있고, 다른 벤더는 다른 벤더보다 더 나은 제안을 할 수 있으며, 다른 회사 / 고용주 / 팀은 그러한 세부 사항에 대해 다른 정책을 가질 수 있습니다.
billt

2
실제로 ... 항상 DIO가 궤도의 궤도 레이저에 연결되어 있다고 가정합니다.)
Michael

4

기본 방향이 입력이라고 가정하면 (즉, MCU가 연결된 라인에 값을 강제하지 않기로하는 High-Z), 포트 설정 순서는 바람직하지만 반드시 필요한 것은 아닙니다. 응용 프로그램이 때 사실 필요에 필요 포트의 값이되지 않습니다 시작에 말할 것을 1. 그런 다음 값을 설정 0한 다음 방향을 변경합니다. 이 경우 방향 설정과 값 설정 사이에 일시적인 "글리치"가 발생하지 않으므로 해당 핀에 스파이크가 발생할 수 있습니다. 그리고 새로운 로직뿐만 아니라 그러한 로직을 가진 모든 프로세서에 적용됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.