null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
Embedded C 학습 로드맵
Structure
what-is-embedded-system
•
임베디드 SW vs 일반 SW
•
CPU 아키텍처 기초
•
메모리 레이아웃
development-environment
•
툴체인 개요
•
프로젝트 & 라이브러리 구조
•
플래싱 & 디버깅
c-language-for-embedded
•
데이터 타입과 이식성
•
비트 연산
•
volatile과 최적화
gpio
•
GPIO 개념
•
출력 제어
•
입력 읽기 & 디바운스
basic-uart
•
UART 프레이밍 & 보레이트
•
송수신 구현
•
UART 디버그 출력
Flow Structure
GPIO 개념
11 / 15
입력 읽기 & 디바운스
☆ Star
↗ Full
출력 제어
#gpio
#output
#led
#toggle
#ifxport
@devpc
|
2026-04-02 05:47:09
|
GET /api/v1/flows/10/nodes/204?fv=2&nv=1
Context:
Flow v2
→
Node v1
0
Views
3
Calls
# 출력 제어 ## 디지털 출력의 원리 MCU의 GPIO 출력 핀은 두 가지 상태만 가집니다. ``` High (1): 핀 전압 = VDD (일반적으로 3.3V) Low (0): 핀 전압 = GND (0V) ``` 이 두 상태를 전환하여 LED를 켜고 끄거나, 외부 회로에 신호를 보냅니다. --- ## LED 점멸 기본 회로 ``` [ LED 연결 방식 (Active High) ] MCU PIN ──── [R 330Ω] ──── LED(+) ──── LED(-) ──── GND PIN = High → LED에 전류 흐름 → 점등 PIN = Low → 전류 없음 → 소등 [ LED 연결 방식 (Active Low) ] VDD ──── [R 330Ω] ──── LED(+) ──── LED(-) ──── MCU PIN PIN = Low → LED에 전류 흐름 → 점등 (반대로!) PIN = High → 전류 없음 → 소등 ``` TC37x Aurix 보드(예: ApplicationKit TC375 Lite)에서 LED는 보드 설계에 따라 Active High 또는 Active Low로 연결될 수 있습니다. 데이터시트를 확인하세요. --- ## iLLD로 출력 제어하기 ### 초기 설정 ```c #include "IfxPort.h" void gpio_init(void) { /* P13.0을 Push-Pull 출력으로 설정 */ IfxPort_setPinMode(&MODULE_P13, 0, IfxPort_Mode_outputPushPullGeneral); /* 초기 상태: Low (LED 소등) */ IfxPort_setPinLow(&MODULE_P13, 0); } ``` ### 출력 값 제어 ```c /* High로 설정 (Active High LED → 점등) */ IfxPort_setPinHigh(&MODULE_P13, 0); /* Low로 설정 (Active High LED → 소등) */ IfxPort_setPinLow(&MODULE_P13, 0); /* Toggle (현재 상태 반전) */ IfxPort_togglePin(&MODULE_P13, 0); ``` ### OMR 레지스터를 이용한 원자적 Set/Clear iLLD 내부에서는 PORT 모듈의 **OMR(Output Modification Register)** 를 사용합니다. OMR은 Set과 Clear를 **한 번의 쓰기로 원자적으로** 수행할 수 있어, 인터럽트 충돌 없이 안전하게 GPIO를 제어합니다. ``` [ OMR 레지스터 구조 ] 비트 15~0: PS(Port Set) → 1이면 해당 핀 High 비트 31~16: PCL(Port Clear) → 1이면 해당 핀 Low 예: P13.0을 High로 → OMR = 0x0000_0001 P13.0을 Low로 → OMR = 0x0001_0000 ``` --- ## LED 점멸 예제 (Blinky) 임베디드의 "Hello World"는 LED 점멸(Blinky)입니다. ```c #include "IfxPort.h" #include "Bsp.h" /* waitTime() 등 유틸리티 */ #define LED_PORT &MODULE_P13 #define LED_PIN 0 void core0_main(void) { /* GPIO 초기화 */ IfxPort_setPinMode(LED_PORT, LED_PIN, IfxPort_Mode_outputPushPullGeneral); /* 무한 루프: 500ms 간격으로 토글 */ while (1) { IfxPort_togglePin(LED_PORT, LED_PIN); waitTime(IfxStm_getTicksFromMilliseconds(BSP_DEFAULT_TIMER, 500)); } } ``` ``` [ Blinky 실행 흐름 ] 초기화 (GPIO 출력 설정) | v ┌─── while(1) ────────────────────────────────┐ │ │ │ IfxPort_togglePin() ← LED 상태 반전 │ │ | │ │ waitTime(500ms) ← 500ms 대기 │ │ | │ └────────┘ │ (반복) ``` --- ## 다른 MCU와의 차이점 > ⚠️ 다른 MCU에서 넘어온다면 이런 점이 다를 수 있습니다. - **STM32**: `HAL_GPIO_WritePin()`, `HAL_GPIO_TogglePin()`. 개념과 사용법 거의 동일. - **Arduino**: `digitalWrite(pin, HIGH/LOW)`. 추상화가 더 높아 포트/핀 번호 분리 없음. - **핵심 개념(High/Low, Toggle, 딜레이 루프)은 모든 MCU에서 동일**. - **TC37x 특징**: OMR 레지스터로 원자적 Set/Clear 가능. STM32의 BSRR과 유사한 개념.
GPIO 개념
입력 읽기 & 디바운스
// COMMENTS
Newest First
ON THIS PAGE
No content selected.