![[ARM] STM32_버튼 이용 LED 조작](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBjf5v%2FbtsHf9PZf1F%2FrNsDMuOU92COvqkcA3epT1%2Fimg.png)
[ARM] STM32_버튼 이용 LED 조작ARM/기타2024. 5. 9. 00:06
Table of Contents
더보기
typedef struct{
volatile unsigned int MODER;
volatile unsigned int OTYPER;
volatile unsigned int OSPEEDR;
volatile unsigned int PUPDR;
volatile unsigned int IDR;
volatile unsigned int ODR;
volatile unsigned int BSRR;
volatile unsigned int LCKR;
volatile unsigned int AFRL;
volatile unsigned int AFRH;
}GPIO_TypeDef;
#define AHB1_BASE 0x40020000
#define RCC_BASE (AHB1_BASE + 0x3800)
#define GPIOC_BASE (AHB1_BASE + 0x0800)
#define RCC_CR (volatile unsigned int *)(RCC_BASE + 0x00)
#define RCC_AHB1_ENR (volatile unsigned int *)(RCC_BASE + 0x30)
#define GPIOC ((GPIO_TypeDef *)GPIOC_BASE)
enum{LED1_ON, LED2_ON, LED3_ON};
void delay(unsigned int times)
{
unsigned int temp = times * 1000;
while(temp) temp--;
}
void clock_init()
{
// Clock authorization (RCC_CR)
*RCC_CR |= (1<<0);
*RCC_AHB1_ENR |= (1<<2);
}
void gpio_init()
{
//------------------GPIOC
// pin 8 output
GPIOC->MODER &= ~(1<<17);
GPIOC->MODER |= (1<<16);
// pin 6 output
GPIOC->MODER &= ~(1<<13);
GPIOC->MODER |= (1<<12);
// pin 5 output
GPIOC->MODER &= ~(1<<11);
GPIOC->MODER |= (1<<10);
//pin 10 input
GPIOC->MODER &= ~(1<<21);
GPIOC->MODER &= ~(1<<20);
//pin 11 input
GPIOC->MODER &= ~(1<<23);
GPIOC->MODER &= ~(1<<22);
//pin 12 input
GPIOC->MODER &= ~(1<<25);
GPIOC->MODER &= ~(1<<24);
GPIOC->OTYPER &= ~(1<<8);
GPIOC->OTYPER &= ~(1<<6);
GPIOC->OTYPER &= ~(1<<5);
GPIOC->OTYPER &= ~(1<<10);
GPIOC->OTYPER &= ~(1<<11);
GPIOC->OTYPER &= ~(1<<12);
GPIOC->OSPEEDR &= ~(1<<17);
GPIOC->OSPEEDR &= ~(1<<16);
GPIOC->OSPEEDR &= ~(1<<13);
GPIOC->OSPEEDR &= ~(1<<12);
GPIOC->OSPEEDR &= ~(1<<11);
GPIOC->OSPEEDR &= ~(1<<10);
GPIOC->OSPEEDR &= ~(1<<21);
GPIOC->OSPEEDR &= ~(1<<20);
GPIOC->OSPEEDR &= ~(1<<23);
GPIOC->OSPEEDR &= ~(1<<22);
GPIOC->OSPEEDR &= ~(1<<25);
GPIOC->OSPEEDR &= ~(1<<24);
GPIOC->PUPDR &= ~(1<<17);
GPIOC->PUPDR &= ~(1<<16);
GPIOC->PUPDR &= ~(1<<13);
GPIOC->PUPDR &= ~(1<<12);
GPIOC->PUPDR &= ~(1<<11);
GPIOC->PUPDR &= ~(1<<10);
GPIOC->PUPDR &= ~(1<<21);
GPIOC->PUPDR &= ~(1<<20);
GPIOC->PUPDR &= ~(1<<23);
GPIOC->PUPDR &= ~(1<<22);
GPIOC->PUPDR &= ~(1<<25);
GPIOC->PUPDR &= ~(1<<24);
}
void sys_init()
{
clock_init();
gpio_init();
}
void GPIO_toggle(GPIO_TypeDef *GPIOx, int pin)
{
GPIOx->ODR ^= (1<<pin);
delay(500);
}
void GPIO_OFF(GPIO_TypeDef *GPIOx, int pin)
{
GPIOx->ODR &= ~(1<<pin);
}
int GPIO_read(GPIO_TypeDef *GPIOx, int pin)
{
int readData = 0;
if(GPIOx->IDR & (1<<pin)) // Pull-up : Push 1 /
readData = 0;
else
readData = 1;
return readData;
}
int main()
{
int LEDState = LED1_ON;
int stateA = 0;
int stateB = 0;
int stateC = 0;
int oldStateA = 0;
int oldStateB = 0;
int oldStateC = 0;
sys_init();
while(1)
{
stateA = GPIO_read(GPIOC, 10);
stateB = GPIO_read(GPIOC, 11);
stateC = GPIO_read(GPIOC, 12);
// edge detection
if(stateA != oldStateA)
{
if(stateA == 0) // Falling edge
{
//LEDState = LED1_ON;
}
else if(stateA == 1) // Rising edge
{
LEDState = LED1_ON;
}
oldStateA = stateA;
}
if(stateB != oldStateB)
{
if (stateB == 0) // Falling edge
{
//LEDState = LED2_ON;
}
else if (stateB == 1) // Rising edge
{
LEDState = LED2_ON;
}
oldStateB = stateB;
}
if(stateC != oldStateC)
{
if (stateC == 0) // Falling edge
{
//LEDState = LED3_ON;
}
else if (stateC == 1) // Rising edge
{
LEDState = LED3_ON;
}
oldStateC = stateC;
}
switch(LEDState)
{
case LED1_ON:
GPIO_toggle(GPIOC, 8);
GPIO_OFF(GPIOC, 6);
GPIO_OFF(GPIOC, 5);
break;
case LED2_ON:
GPIO_toggle(GPIOC, 6);
GPIO_OFF(GPIOC, 8);
GPIO_OFF(GPIOC, 5);
break;
case LED3_ON:
GPIO_toggle(GPIOC, 5);
GPIO_OFF(GPIOC, 8);
GPIO_OFF(GPIOC, 6);
break;
}
}
return 0;
}
Button 누르면 LED 점등
더보기
#include "stm32f4xx_hal.h"
void RCC_init()
{
RCC->CR |= (1<<0); // HSI ON
RCC->AHB1ENR |= (1<<2); // GPIOC Clock Enable
}
void GPIO_init()
{
/*
* Output : PC5, PC6, PC8
* PushPull, No Pull Up/Down, Low Speed
*/
GPIOC->MODER |= (1<<10); // PC5 Output
GPIOC->MODER |= (1<<12); // PC6 Output
GPIOC->MODER |= (1<<16); // PC8 Output
// PushPull, Low Speed, No Pull Up/Down : Default Set(=set 0)
/*
* Input : PC10, PC11, PC12
*/
GPIOC->MODER &= ~(0x03 << 20 | 0x03 << 22 | 0x03 << 24); // PC10, PC11, PC12 Input
}
void sys_init()
{
RCC_init();
GPIO_init();
}
void GPIO_write(GPIO_TypeDef *GPIOx, uint16_t pin, int state)
{
if(state == RESET)
{
GPIOx->ODR &= ~(1<<pin);
}
else
{
GPIOx->ODR |= (1<<pin);
}
}
int GPIO_read(GPIO_TypeDef *GPIOx, uint16_t pin)
{
/*
* Pull up register : Push == 0
* IDR 16 bit
* Normal : 0100
* Push : 0000 -> IDR & (1<<pin) == 0
*
* Pull down register : Push == 1
* Normal : 0000
* Push : 0100 -> IDR & (1<<pin) == 0100
* => IDR & (1<<pin) != 0x01
*
* When masking, need to check for 0 or non-0
*/
if((GPIOx->IDR & (1<<pin)))
return 1;
else
return 0;
}
int main()
{
sys_init();
while(1)
{
if(!(GPIO_read(GPIOC, 10))) // Pull up register : Push == 0
GPIO_write(GPIOC, 8, SET);
else
GPIO_write(GPIOC, 8, RESET);
if(!(GPIO_read(GPIOC, 11)))
GPIO_write(GPIOC, 6, SET);
else
GPIO_write(GPIOC, 6, RESET);
if(!(GPIO_read(GPIOC, 12)))
GPIO_write(GPIOC, 5, SET);
else
GPIO_write(GPIOC, 5, RESET);
}
}
더보기
main.c
#include "stm32f4xx_hal.h"
#include "RCC.h"
#include "GPIO.h"
void sys_init(){
RCC_init();
GPIO_init();
}
int main(){
sys_init();
while(1)
{
if(!(GPIO_read(GPIOC, 10))) // Pull up register : Push == 0
GPIO_write(GPIOC, 8, SET);
else
GPIO_write(GPIOC, 8, RESET);
if(!(GPIO_read(GPIOC, 11)))
GPIO_write(GPIOC, 6, SET);
else
GPIO_write(GPIOC, 6, RESET);
if(!(GPIO_read(GPIOC, 12)))
GPIO_write(GPIOC, 5, SET);
else
GPIO_write(GPIOC, 5, RESET);
}
}
RCC
// 소스 파일
/*
* RCC.c
*
* Created on: Apr 23, 2024
* Author: k1min
*/
#include "RCC.h"
void RCC_init()
{
RCC->CR |= (1<<0); // HSI ON
RCC->AHB1ENR |= (1<<2); // GPIOC Clock Enable
}
// 헤더 파일
/*
* RCC.h
*
* Created on: Apr 23, 2024
* Author: k1min
*/
#ifndef INC_RCC_H_
#define INC_RCC_H_
#include "stm32f4xx_hal.h"
void RCC_init();
#endif /* INC_RCC_H_ */
GPIO
// 소스 파일
/*
* GPIO.c
*
* Created on: Apr 23, 2024
* Author: k1min
*/
#include "GPIO.h"
void GPIO_init()
{
/*
* Output : PC5, PC6, PC8
* PushPull, No Pull Up/Down, Low Speed
*/
GPIOC->MODER |= (1<<10); // PC5 Output
GPIOC->MODER |= (1<<12); // PC6 Output
GPIOC->MODER |= (1<<16); // PC8 Output
// PushPull, Low Speed, No Pull Up/Down : Default Set(=set 0)
/*
* Input : PC10, PC11, PC12
*/
GPIOC->MODER &= ~(0x03 << 20 | 0x03 << 22 | 0x03 << 24); // PC10, PC11, PC12 Input
}
void GPIO_write(GPIO_TypeDef *GPIOx, uint16_t pin, int state)
{
if(state == RESET)
{
GPIOx->ODR &= ~(1<<pin);
}
else
{
GPIOx->ODR |= (1<<pin);
}
}
int GPIO_read(GPIO_TypeDef *GPIOx, uint16_t pin)
{
/*
* Pull up register : Push == 0
* IDR 16 bit
* Normal : 0100
* Push : 0000 -> IDR & (1<<pin) == 0
*
* Pull down register : Push == 1
* Normal : 0000
* Push : 0100 -> IDR & (1<<pin) == 0100
* => IDR & (1<<pin) != 0x01
*
* When masking, need to check for 0 or non-0
*/
if((GPIOx->IDR & (1<<pin)))
return 1;
else
return 0;
}
// 헤더 파일
/*
* GPIO.h
*
* Created on: Apr 23, 2024
* Author: k1min
*/
#ifndef INC_GPIO_H_
#define INC_GPIO_H_
#include "stm32f4xx_hal.h"
void GPIO_init();
void GPIO_write(GPIO_TypeDef *GPIOx, uint16_t pin, int state);
int GPIO_read(GPIO_TypeDef *GPIOx, uint16_t pin);
#endif /* INC_GPIO_H_ */
Button 누르면 LED Blink
더보기
main
#include "stm32f4xx_hal.h"
#include "RCC.h"
#include "GPIO.h"
typedef enum {
LED1, LED2, LED3
}LEDState;
LEDState state;
void delay(unsigned int times)
{
unsigned int temp = times * 1000;
while(temp) temp--;
}
void sys_init()
{
RCC_init();
GPIO_init();
}
void LED1_stateRun()
{
GPIO_toggle(GPIOC, 8); // LED1 toggle
GPIO_write(GPIOC, 6, RESET); // LED2 OFF
GPIO_write(GPIOC, 5, RESET); // LED3 OFF
delay(300);
if(!GPIO_read(GPIOC, 11)) // button2
{
state = LED2;
}
else if(!GPIO_read(GPIOC, 12)) // button3
{
state = LED3;
}
}
void LED2_stateRun()
{
GPIO_toggle(GPIOC, 6);
GPIO_write(GPIOC, 8, RESET); // LED1 OFF
GPIO_write(GPIOC, 5, RESET); // LED3 OFF
delay(300);
if(!GPIO_read(GPIOC, 10)) // button1
{
state = LED1;
}
else if(!GPIO_read(GPIOC, 12)) // button3
{
state = LED3;
}
}
void LED3_stateRun()
{
GPIO_toggle(GPIOC, 5);
GPIO_write(GPIOC, 8, RESET); // LED1 OFF
GPIO_write(GPIOC, 6, RESET); // LED2 OFF
delay(300);
if(!GPIO_read(GPIOC, 10)) // button1
{
state = LED1;
}
else if(!GPIO_read(GPIOC, 11)) // button2
{
state = LED2;
}
}
int main()
{
sys_init();
state = LED1;
while(1)
{
switch(state)
{
case LED1:
LED1_stateRun();
break;
case LED2:
LED2_stateRun();
break;
case LED3:
LED3_stateRun();
break;
default:
LED1_stateRun();
break;
}
}
}
GPIO.c
/*
* GPIO.c
*
* Created on: Apr 23, 2024
* Author: k1min
*/
#include "GPIO.h"
void GPIO_init()
{
/*
* Output : PC5, PC6, PC8
* PushPull, No Pull Up/Down, Low Speed
*/
GPIOC->MODER |= (1 << 10); // PC5 Output
GPIOC->MODER |= (1 << 12); // PC6 Output
GPIOC->MODER |= (1 << 16); // PC8 Output
// PushPull, Low Speed, No Pull Up/Down : Default Set(=set 0)
/*
* Input : PC10, PC11, PC12
*/
GPIOC->MODER &= ~(0x03 << 20 | 0x03 << 22 | 0x03 << 24);// PC10, PC11, PC12 Input
}
void GPIO_write(GPIO_TypeDef *GPIOx, uint16_t pin, int state)
{
if (state == RESET)
{
GPIOx->ODR &= ~(1 << pin);
}
else
{
GPIOx->ODR |= (1 << pin);
}
}
int GPIO_read(GPIO_TypeDef *GPIOx, uint16_t pin)
{
/*
* Pull up register : Push == 0
* IDR 16 bit
* Normal : 0100
* Push : 0000 -> IDR & (1<<pin) == 0
*
* Pull down register : Push == 1
* Normal : 0000
* Push : 0100 -> IDR & (1<<pin) == 0100
* => IDR & (1<<pin) != 0x01
*
* When masking, need to check for 0 or non-0
*/
if ((GPIOx->IDR & (1 << pin)))
return 1;
else
return 0;
}
void GPIO_toggle(GPIO_TypeDef *GPIOx, uint16_t pin)
{
GPIOx->ODR ^= (1 << pin);
}
Made By Minseok KIM
'ARM > 기타' 카테고리의 다른 글
[ARM] STM32_Systick 사용 버튼 LED 동작 (0) | 2024.05.09 |
---|
@민바Minba :: Minba's blog
Let's Be Happy!
도움이 되었으면 좋겠어요 :)