목차
[WAT-STM32-2.8] 14번 예제 버턴으로 LED ON/OFF(안정화)
WAT-STM32-2.8 예제 중 14번째로 버턴을 누를 때마다 LED ON/OFF 하는 예제입니다.
13번 예제의 오류를 수정해 보겠습니다.
13번 예제에서는 버턴를 누르는 순간( 또는 누르고 있는 동안) 버턴 상태를 여러 번 체크하여 정확한 버턴 눌림 값을 구할 수 없는 오류를 가지고 있습니다.
예를 들어 버턴을 0.1초간 눌렀다면 0.1초 동안 상태를 10만번 이상 체크하게 됩니다.
우리가 읽은 버튼 상태(key_up)는 10만개 중 1개의 상태를 가져다 쓰는 겁니다.
그래서 원하는 값을 얻을 수 없었던 겁니다.
해결방법은 간단합니다.
버턴 상태가 변경되었을 때 일정한 딜레이를 주면 됩니다.(약 0.5 ~1초 정도면 괜찮습니다.)
주요 코드
수정된 main() 함수
int main(void) { unsigned int key_up =1; RCC_init(); // RCC 초기화 LED_init(); // LED 초기화 Key_init(); // KEY 초기화 while (1) { if(KEY0==0) // key 가 눌렸을 때 { key_up = !key_up; if(key_up) LEDON; // LED ON else LEDOFF; // LED OFF Delay(0x2fffff); // delay } } }
main.c 파일입니다.
// WAT_STM3228_14 KEY INPUT, LED OUT // 키 눌릴때마다 LED ON/OFF 하기 (안정적) // // 출처: https://docs.whiteat.com/?p=3697 // #include "main.h" #include "rcc.h" #include <stdio.h> #define LEDON (GPIOB->BRR = GPIO_Pin_2) #define LEDOFF (GPIOB->BSRR = GPIO_Pin_2) #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) #define KEY0 PAin(0) //PA0 /**********************************************************************************/ LED_init() { /* GPIOB Port Enable*/ RCC->APB2ENR |= RCC_APB2Periph_GPIOB; /*-- GPIO Mode Configuration speed, input/output -----------------------*/ /*-- GPIOB max speed: 50MHz , General purpose output push-pull ---*/ GPIOB->CRL &= 0xFFFFF0FF; GPIOB->CRL |= 0x00000300; } void Delay(vu32 nCount) //delay { for(; nCount != 0; nCount--); } void Key_init() { RCC->APB2ENR|=RCC_APB2Periph_GPIOA; /* GPIOA PORT Enable */ GPIOA->CRL&=0XFFFFFFF0; GPIOA->CRL|=0X00000008; //PA INPUT } int main(void) { unsigned int key_up =1; RCC_init(); // RCC 초기화 LED_init(); // LED 초기화 Key_init(); // KEY 초기화 while (1) { if(KEY0==0) // key 가 눌렸을 때 { key_up = !key_up; if(key_up) LEDON; // LED ON else LEDOFF; // LED OFF Delay(0x2fffff); // delay } } }
결과화면
버턴1을 한번 누르면 LED ON, 한번 더 누르면 LED OFF 가 잘 됩니다.
while 문 안의 delay 를 넣는 것은 좋지 않는 방법입니다만 짧은 코드에서는 괜찮습니다.^^
기회가 된다면 좀더 깔끔한 방법을 소개해 드리도록 하겠습니다.
WAT-STM32-2.8보드 전체 예제
제품 구매
WAT-STM32-2.8 [STM32F103RB Board + 2.8인치 TFT LCD 터치 세트] 는 https://kit128.com/goods/view?no=221 에서 구매하실 수 있습니다.