목차
[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 에서 구매하실 수 있습니다.

