스위치 입력 - 실습 LED가 환하게 들어오지 않습니다.
3
작성한 질문수 1
안녕하세요! 이번에 보드를 구입해서 실습을 해보고 있습니다. 강의 코드를 보지 않고 제 스스로 코드를 만들어보고자 다음과 같은 코드를 작성했습니다.
#include "stm32f767xx.h" // CMSIS 디바이스 헤더
// switch pin PD4
// LED pin PC6
volatile uint32_t sw;
int main(void)
{
// clock enable
RCC->AHB1ENR |= (1 << 2);
RCC->AHB1ENR |= (1 << 3);
// PC outpupt
GPIOC->MODER &= ~(3 << (6*2)); // LD2 01 output mode
GPIOC->MODER |= (1 << (6*2)); // LD2 01 output mode
// switch 는 00 번이므로 따로 설정 x
GPIOD->MODER &= ~(3 << (4*2));
// PD pull-up
// [9:8] 두 개의 비트를 사용하므로 초기화 한 후에 사용하는 것이 안전
GPIOD->PUPDR &= ~(3<<(4*2));
GPIOD->PUPDR |= (1<<(4*2));
while(1)
{
sw = GPIOD->IDR & (1 << 4);
if (sw != 0) // 스위치 안 눌렀을 때 led off
{
GPIOC->ODR |= (1<<6);
}
else // 스위치 눌렀을 떄 led on
{
GPIOC->ODR &= ~(1<<6);
}
}
}제가 예상했던 결과는
스위치를 누르지 않았을 때 → LED OFF
스위치를 누르고 있는 동안 → LED ON 상태 유지
였는데 실제 동작 결과
스위치를 누르면 LED가 아주 희미하게 순간적으로 반짝임
스위치를 계속ㄱ 누르고 있어도 LED 가 환하게 켜진 상태로 유지되지 않음
스위치에서 손을 뗄 때 LED 가 켜짐
제 코드에 문제가 있나 싶은 생각에 올려주신 예제 코드를 실행해봤는데 똑같은 결과가 나와 이렇게 질문드립니다!
제가 궁금한 점은 크게 3가지 입니다.
이런 현상이 발생하는 이유가 하드웨어(스위치 회로, 풀업/풀다운, 배선 문제 등) 때문일 수 있을까요?
아니면 제가 원하는 동작을 구현하려면 EXTI 인터럽트 설정 후 Falling Edge Trigger 같은 개념을 사용해야 하는 걸까요?
반대로 스위치를 누를 때 LED 를 OFF 하는 경우에는 제가 예상한 바와 같이 동작을 하는데 그 이유도 궁금합니다!
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 김다현님.
스위치를 통한 LED 제어에서 발생하신 문제에 대해 설명드리고자 합니다. 이런 기술적인 문제는 코드뿐만 아니라 하드웨어 설정, 배선, 회로 구성과 깊은 관련이 있을 수 있습니다.
1. 하드웨어 문제
LED가 희미하게 깜빡이거나, 예상과 다른 타이밍에 켜지고 꺼진다면, 하드웨어적인 문제일 가능성을 먼저 확인해봐야 합니다. 몇 가지 주요 점검 사항은 다음과 같습니다:
풀업/풀다운 저항 확인: 스위치에 연결된 핀의 상태가 부정확하다면, 풀업 혹은 풀다운 저항이 제대로 설정되지 않았을 수 있습니다. GPIOD 핀에 대한 PUPDR 레지스터 설정을 확인해보세요. 코드에서는 풀업으로 설정했으니 확인해보시기 바랍니다.
배선 문제: 보드나 배선 상태가 불안정할 수 있습니다. 연결이 제대로 되어 있는지, 단선이 없는지 확인해 주세요.
2. EXTI 인터럽트 사용 가능성
현재 코드 구조에서 단순히 GPIO 상태를 폴링(polling) 방식으로 읽고 있습니다. 만약 조금 더 안정적이고 정확한 신호 처리를 위해 인터럽트를 사용하고 싶다면, ‘Falling Edge Trigger’와 같은 외부 인터럽트(EXTI)를 설정하여 핀의 상태를 트리거로 동작하도록 할 수 있습니다. 이는 특히 응답 속도가 중요한 경우에 유용합니다.
3. LED 반대 동작의 동작 원리
버튼을 눌러서 LED가 OFF되는 동작은, 풀업 상태에서는 버튼이 눌리지 않았을 때 핀의 기본값(high)이므로 이해됩니다. 이 경우, 버튼을 눌렀을 때 핀의 상태가 low가 되며, 논리적으로 LED를 OFF 상태로 만드는 것입니다. 하지만 실제로 원하는 동작이 반대의 경우라면 현재 프로그램 로직과 pull 상태 설정을 재검토해봐야 합니다.
또한, GPIO의 입력 감지를 하드웨어 디바운스로 처리하여 신호 오류를 줄일 수 있습니다. 이 방법은 물리적인 스위치가 빠르게 on/off되는 떨림 현상을 보정하는 데 유리합니다.
아래 강의에서는 유사한 상황에서의 Q&A와 해결 방법을 확인해 보실 수 있습니다:
전동킥보드로 배우는 임베디드 실전 프로젝트
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
벅컨버터 COMP핀 주파수 보상회로 계산 시 R_ESR값
0
25
2
Center Align PWM 설정 코드 질문
0
27
1
주파수 응답 특성 그래프 튜닝 방식
0
37
2
USART 통신 문의
0
34
2
전동 킥보드에 사용되는 f767 고출력 모델 문의
0
38
3
모터 선정 질문
0
48
2
블루투스 핀 배열 질문
0
46
1
PCB 배선 연결 실수로 인한 증상 검토 요청 건.
0
55
2
ABC 상전류 측정
0
45
1
전동킥보드 펌웨어 코드 분석
0
57
3
전류센싱 pwm adc 동기화 관련 질문
0
45
1
BLDC / PMSM 문의
0
56
2
쓰로틀 측정 값
0
52
1
전류 측정
0
48
1
모터 와이어링
0
47
2
키트(고출력)과 BLDC 모터가 도착했습니다.
0
64
2
소형 BLDC 모터 관련
0
57
2
PCB 구매 관련
0
51
2
PCB 레이아웃 질문
0
48
2
수업관련
0
53
2
벅 컨버터 스위치 off 상태일 때 흐름
0
56
2
PCB 발주
0
57
1
32. MOSFET의 특성과 동작 영역 강의 내용 중 P=I^2R질문
0
40
2
LDO 선정 이유
0
47
1





