공부방/ARM_STM32 노진호교수님_필기

240422 input switch 과제

맘스터치보단파파이스 2024. 4. 23. 09:16

#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;

}

'공부방 > ARM_STM32 노진호교수님_필기' 카테고리의 다른 글

240424 과제  (0) 2024.04.24
240423 UART2_LCD  (1) 2024.04.23
240423 LOWLEVEL  (0) 2024.04.23
240422_LL GPIO  (0) 2024.04.22
240422_ RCC, LED(GPIO OUTPUT_PA5)  (0) 2024.04.22