#include "stm32f4xx_hal.h"
void delay(unsigned int times)
{
unsigned int temp = times*1000;
while(temp) temp--;
}
void clock_init()
{
RCC->CR= (1<<0); // 0번 비트에만 1
RCC->AHB1ENR |= (1<<0); // A
RCC->AHB1ENR |= (1<<2); // C
}
void GPIO_init()
{
//GPIOA MODE : OUTPUT
GPIOA->MODER &= ~(1<<11); //GPIOA_MODER 11번비트에 0
GPIOA->MODER |= (1<<10); //GPIOA_MODER 10번비트에 1
//GPIOA OUTPUT TYPE REGISTER : pushpull
GPIOA->OTYPER &= ~(1<<5); // GPIOA의 5번 PIN pushpull로 사용한다.
//GPIOA OUTPUT SPEED
GPIOA->OSPEEDR &= ~((1<<11)|(1<<10)); //GPIOA_OSPEEDR 11번,10번 비트에 0
/*
//input
//PC12
GPIOC->MODER &= ~(1<<25);
GPIOC->MODER &= ~(1<<24);
// GPIOC->OTYPER &= ~(1<<12);
// GPIOC->OSPEEDR &= ~((1<<25)|(1<<24));
GPIOC->PUPDR &= ~(1<<25);
GPIOC->PUPDR |= (1<<24);
//PC11
GPIOC->MODER &= ~(1<<23);
GPIOC->MODER &= ~(1<<22);
// GPIOC->OTYPER &= ~(1<<11);
// GPIOC->OSPEEDR &= ~((1<<23)|(1<<22));
GPIOC->PUPDR &= ~(1<<23);
GPIOC->PUPDR |= (1<<22);
//PC10
GPIOC->MODER &= ~(1<<21);
GPIOC->MODER &= ~(1<<20);
// GPIOC->OTYPER &= ~(1<<10);
// GPIOC->OSPEEDR &= ~((1<<21)|(1<<20));
GPIOC->PUPDR &= ~(1<<21);
GPIOC->PUPDR |= (1<<20);
*/
//output
//PC8
GPIOC->MODER &= ~(1<<17);
GPIOC->MODER |= (1<<16);
GPIOC->OTYPER &= ~(1<<8);
GPIOC->OSPEEDR &= ~((1<<17)|(1<<16));
//PC6
GPIOC->MODER &= ~(1<<13);
GPIOC->MODER |= (1<<12);
GPIOC->OTYPER &= ~(1<<6);
GPIOC->OSPEEDR &= ~((1<<13)|(1<<12));
//PC5
GPIOC->MODER &= ~(1<<11);
GPIOC->MODER |= (1<<10);
GPIOC->OTYPER &= ~(1<<5);
GPIOC->OSPEEDR &= ~((1<<11)|(1<<10));
}
void sys_init()
{
clock_init();
GPIO_init();
}
void GPIO_WRITE(GPIO_TypeDef *GPIOx, int pin, int state)
{
if(state == SET)
{
GPIOx->ODR |= (1<<pin);
}
else
{
GPIOx->ODR &= ~(1<<pin);
}
}
void GPIO_TOGGLE(GPIO_TypeDef *GPIOx, int pin)
{
GPIOx->ODR ^= (1<<pin);
}
int GPIO_READ(GPIO_TypeDef *GPIOx, int pin)
{
int flag = 0;
if((GPIOx->IDR & (1<<pin))==0)
{
flag = 1;
}
else{
flag = 0;
}
return flag;
}
int main()
{
sys_init();
int state=1;
while(1) //but1 2 3 : 10 11 12 LED1 2 3 : 8 6 5
{
if(GPIO_READ(GPIOC,10)==1){
state = 1;
}
else if(GPIO_READ(GPIOC, 11)==1){
state = 2;
}
else if(GPIO_READ(GPIOC, 12)==1){
state = 3;
}
switch(state){
case 1:
GPIO_TOGGLE(GPIOC, 8);
GPIO_WRITE(GPIOC, 6, RESET);
GPIO_WRITE(GPIOC, 5, RESET);
break;
case 2:
GPIO_TOGGLE(GPIOC, 6);
GPIO_WRITE(GPIOC, 8, RESET);
GPIO_WRITE(GPIOC, 5, RESET);
break;
case 3:
GPIO_TOGGLE(GPIOC, 5);
GPIO_WRITE(GPIOC, 6, RESET);
GPIO_WRITE(GPIOC, 8, RESET);
break;
}
delay(300);
}
return 0;
}