당신의 버튼 코드는 '견고'한가요? 단순히 동작만 하는 코드가 아니라, 어떤 노이즈에도 끄떡없는 전문가 수준의 버튼 처리 팁을 공유합니다.
"분명히 코드대로 짰는데 왜 가끔 버튼이 안 눌릴까요?" 혹은 "왜 제멋대로 눌릴까요?" 솔직히 말씀드리면, 90%는 하드웨어 노이즈와 ISR 설계 미스 때문입니다. 오늘 제가 알려드리는 3가지 팁만 적용해도 여러분의 펌웨어는 훨씬 '프로'다워질 겁니다. 시작해볼까요? 🚀
Tip 1. ISR에서는 "말"하지 말고 "쪽지"만 남기세요 📝
인터럽트 함수 안에서 `printf`를 쓰는 건, 전쟁 중에 전령이 장군에게 보고하러 와서 수다를 떠는 것과 같습니다. 전령은 "적이 나타났다!"는 쪽지(Flag)만 던지고 바로 전장으로 복귀해야 합니다.
📌 전문가의 한 마디
ISR 내부의 코드가 길어질수록 다른 인터럽트가 밀리게 되고, 결국 실시간성(Real-time)이 파괴됩니다. 펌웨어 아키텍처의 기본은 역할 분담입니다.
ISR 내부의 코드가 길어질수록 다른 인터럽트가 밀리게 되고, 결국 실시간성(Real-time)이 파괴됩니다. 펌웨어 아키텍처의 기본은 역할 분담입니다.
Tip 2. 소프트웨어 타이머를 활용한 노이즈 제거 🛡️
하드웨어에 100nF 커패시터를 다는 게 가장 좋지만, 이미 보드가 나왔다면? 코드로 해결해야죠. `HAL_GetTick()`을 사용한 시간차 검사는 가장 저렴하고 확실한 해결책입니다.
| 방식 | 장점 | 단점 |
|---|---|---|
| 단순 Polling | 구현이 매우 쉬움 | CPU 점유율 높음, 반응 느림 |
| 단순 Interrupt | 반응 속도 최상 | 채터링에 매우 취약함 |
| IT + S/W Timer | 가장 효율적이고 안정적 | 약간의 설계 고민 필요 |
Tip 3. 버튼 상태 머신(State Machine) 도입 🤖
버튼을 '짧게 누를 때'와 '길게 누를 때(Long Press)' 처리를 다르게 하고 싶나요? 이럴 땐 단순 변수보다는 Enum을 활용한 상태 머신을 설계해보세요. 코드가 훨씬 깔끔해집니다.
🔢 버튼 입력 시뮬레이션
버튼을 누른 후 디바운싱 시간을 직접 설정해보세요.
설정 시간: ms
💡 오늘의 고수 팁 요약
1. NO Delay: ISR 내부에서 딜레이는 죄악입니다.
2. Time Check: 전역 틱을 활용해 노이즈를 걸러내세요.
3. State Logic: 복잡한 입력은 상태 머신으로 관리하세요.
자주 묻는 질문 ❓
Q: 하드웨어 디바운싱 회로가 있다면 코드는 안 짜도 되나요?
A: 회로가 완벽하다면 생략 가능하지만, 소프트웨어적으로 한 번 더 방어막을 치는 것이 실무적으로는 안전합니다.
실전에서 발생하는 버튼 문제는 대부분 이 원칙만 지켜도 해결됩니다. 😊

