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