[WAT-STM32-2.8] 14번 예제 버턴으로 LED ON/OFF (안정화)

[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 터치 세트

제품 구매

WAT-STM32-2.8 [STM32F103RB Board + 2.8인치 TFT LCD 터치 세트] 는 https://kit128.com/goods/view?no=221 에서 구매하실 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다