LED 제어 프로그래밍 개요
CC2530 마이크로컨트롤러를 사용하여 LED를 제어하기 위해서는 기본적인 GPIO 설정과 함께 출력 상태 조작이 필요합니다. 아래 예제는 순수 레지스터 접근 방식과 함수 캡슐화 방식 두 가지로 작성되었습니다.
방법 1: 레지스터 직접 제어
#include <iocc2530.h>
void Delay(uint16_t count);
void ConfigureGpio(void);
void main(void) {
ConfigureGpio();
while (1) {
P1_0 = ~P1_0; // 토글 P1.0
Delay(50000);
P1_1 = ~P1_1; // 토글 P1.1
Delay(50000);
P0_4 = ~P0_4; // 토글 P0.4
Delay(50000);
}
}
void Delay(uint16_t count) {
for (uint16_t i = 0; i < count; i++);
for (uint16_t i = 0; i < count; i++);
for (uint16_t i = 0; i < count; i++);
}
void ConfigureGpio(void) {
P1DIR |= 0x03; // P1.0, P1.1을 출력으로 설정 (비트 0~1)
P0DIR |= 0x10; // P0.4를 출력으로 설정 (비트 4)
P1_0 = 1; // 초기 상태: High (LED 소등, 공통 애노드 가정)
P1_1 = 1;
P0_4 = 1;
}
방법 2: 제어 함수 활용
#include <iocc2530.h>
void Delay(uint16_t count);
void ConfigureGpio(void);
void ControlLed(uint8_t ledNum, uint8_t on);
void main(void) {
ConfigureGpio();
while (1) {
// 각 LED를 순차적으로 점등/소등
ControlLed(0, 0); Delay(50000);
ControlLed(1, 0); Delay(50000);
ControlLed(2, 0); Delay(50000);
ControlLed(0, 1); Delay(50000);
ControlLed(1, 1); Delay(50000);
ControlLed(2, 1); Delay(50000);
}
}
void ControlLed(uint8_t ledNum, uint8_t on) {
switch (ledNum) {
case 0:
P1_0 = (on ? 0 : 1); // 저항성 애노드 구조 가정 시 '0'이 점등
break;
case 1:
P1_1 = (on ? 0 : 1);
break;
case 2:
P0_4 = (on ? 0 : 1);
break;
}
}
GPIO 설정 원리
CC2530의 입출력 핀은 다양한 모드로 구성 가능하며, 다음 레지스터를 통해 제어됩니다.
- PxSEL (P0SEL, P1SEL, P2SEL): 해당 비트가 1이면 외부 장치 신호로 사용됨. 일반 GPIO 사용 시 0으로 설정.
- PxDIR (P0DIR, P1DIR, P2DIR): 방향 설정. 1 = 출력, 0 = 입력.
- PxINP (P0INP, P1INP, P2INP): 입력 동작 모드 결정.
- P0의 경우, P0INP의 특정 비트로 풀업/풀다운 또는 하이임피던스 선택 가능.
- 예: P0INP에서 관련 비트를 0으로 설정하면 3-state(High-Z), 1이면 풀업/풀다운 활성화.
전원 인가 후 기본값으로 모든 PxSEL 레지스터는 0x00이며, 이는 모든 핀이 일반 GPIO 모드로 시작함을 의미합니다. 별도의 외부 장치를 사용하지 않는 한 SEL 레지스터를 수정할 필요 없습니다.
하드웨어 및 플래싱 정보
- 동작 전압 범위: 2V ~ 3.6V (권장: 3.3V)
- 패키지 유형: QFN40 (40핀)
- 프로그래밍에는 전용 하드웨어 디버거(SmartRF 등) 필요
- 플래시 후 리셋 버튼을 눌러 프로그램 재시작
- PC 드라이버 설치 필수 (장치 인식 실패 시 드라이버 확인 요망)