목차
[WAT-STM32-2.8] 13번 예제 버턴으로 LED ON/OFF
WAT-STM32-2.8 예제 중 13번째로 버턴1을 누를 때마다 LED ON/OFF 하는 예제입니다.

주요 코드
KEY 초기화 함수
void Key_init()
{
RCC->APB2ENR|=RCC_APB2Periph_GPIOA; /* GPIOA PORT Enable */
GPIOA->CRL&=0XFFFFFFF0;
GPIOA->CRL|=0X00000008; //PA INPUT
}
main() 함수
// WAT_STM3228_13 example KEY INPUT, LED OUT
// 키 눌림 상태에 따라 LED ON/OFF
//
// 출처: https://docs.whiteat.com/?p=3693
//
#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)
/**********************************************************************************/
LED_init()
{
RCC->APB2ENR |= RCC_APB2Periph_GPIOB; /* GPIOB PORT Enable */
/*-- 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 function
{
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(key_up)
LEDON; // LED ON
else
LEDOFF; //LED OFF
if(KEY0==0)
key_up = !key_up;
}
}
결과화면
버턴1을 한번 누르면 LED ON, 한번 더 누르면 LED OFF 를 하려고 했으나 잘 안 될 것입니다.
ON,OFF 가 의도치 않은 동작을 하게 됩니다.


다음 장 넘어가지 전에
왜 LED ON/OFF 동작이 이상하게 동작하는지 생각해 보세요.
다음 장에서 이유와 해결 방법을 알려 드리겠습니다.^^
WAT-STM32-2.8보드 전체 예제
제품 구매
WAT-STM32-2.8 [STM32F103RB Board + 2.8인치 TFT LCD 터치 세트] 는 https://kit128.com/goods/view?no=221 에서 구매하실 수 있습니다.

