본문 바로가기
Stm32/실제 구동(stm32cubeide)

[1]GPIO 입출력 레지스터 직접 제어

by [Akashic Records] 개발의선지자 2024. 5. 2.

출력 레지스터 제어 전 먼저 설정해야 할 것이 있다.

- 해당 핀 클럭 소스 선택 HSI or HSE

- 타입(풀다운 또는 풀업) ->  GPIOx_OTYPER , GPIOx_PUPDR 

- 클럭 스피드 지정 -> GPIOx_OSPEEDR

- 모드 지정 -> GPIOx_MODER

 

GPIO 출력 설정 레지스터 순서

1. GPIOX_CRL - configuration register

2. GPIOX_CRH - configuration register

3. GPIOX_ODR - data output register

4. GPIOX_BSRR - set/reset register

5. GPIOX_BRR - reset register

 

1. Enable GPIOX clock
2. Set the PIN as output
3. Configure the output mode 
4. Configure the output state 
5. Configure the output speed
6. Configure the output pullup/pulldown

 

 예시1)

NUCLEO STM32F411에서 PA5과 LED2(LD2)는 HW적으로 연결되어 있다.

직접 레지스터 제어로 PA5을 출력 핀으로 세팅하고 LED2가 1초마다 ON/OFF 반복하는 코드를 작성

  	RCC->AHB1ENR |= (1<<0);  //GPIOA ENABLE
	GPIOA->MODER |= (1<<10); // PA5 output mode
	GPIOA->OTYPER &= ~(1<<5); //PA5 output type Output push pull 
	GPIOA->OSPEEDR |= (1<<11); //output speed fast speed
	GPIOA->PUPDR &= ~((1<<10) | (1<<11)); //no pull-up no pull-down
    
    while (1) 
    {
    	GPIOA->ODR |= (1<<5); //GPIOA_BSRR로 대체 가능
		HAL_Delay(1000);
		GPIOA->ODR &= ~(1<<5); //GPIOA_BSRR로 대체 가능
		HAL_Delay(1000);
    
    }

 

 

 

GPIO 입력 설정 레지스터 순서

 

1. GPIOX_CRL - configuration register

2. GPIOX_CRH - configuration register

3. GPIOX_IDR - data input register

4. GPIOX_BSRR - set/reset register

5. GPIOX_BRR - reset register

 

1. Enable GPIOX clock
2. Set the PIN as input
3. Configure the Pull UP / Pull Down mode
RCC->AHB1ENR |= (1<<0);
GPIOC->MODER &= ~((1<<26) | (1<<27)); //PC13 00 input
GPIOC->PUPDR |= (1<<26) ; //PC13 pull-up
uint32_t count = 0;

while(1)
{
	if(!(GPIOC->IDR & (1<<13)))
	{
		count++;
		if(count % 2 != 0)  GPIOA->ODR |= (1<<5);
		else GPIOA->ODR &= ~(1<<5);

	}
]
1. RCC_APB2ENR 레지스터 제어
2. #define GPIOC_CRL (*(volatile unsigned *)0x40011000) #define GPIOC_CRH (*(volatile unsigned *)0x40011004) 3.#define GPIOC_BSRR (*(volatile unsigned *)0x40011010) #define GPIOC_BRR (*(volatile unsigned *)0x40011014) 4.#define GPIOC_ODR (*(volatile unsigned *)0x4001100c)

 

 예시1)

NUCLEO STM32F411에서 PC13과 USER BUTTON1과 HW적으로 연결되어 있다.

직접 레지스터 제어로 PC13을 입력 핀으로 세팅하고 USER BUTTON을 짝수번 누르면 

LED2가  켜지고 , 홀수번 누르면 OFF 반복하는 코드를 작성

 

다음 USART TX/RX 통신을 레지스터 제어를 통해 구현해보록 하자.

 

 

'Stm32 > 실제 구동(stm32cubeide)' 카테고리의 다른 글

ADC Multi Channel - Joy Stick  (0) 2024.07.10
UART 실습[2]  (0) 2024.06.30
Timer Interrupt  (0) 2024.06.18
UART (Polling, Interrupt , DMA) [HAL-DRIVER 이용]  (0) 2024.05.08
GPIO 입출력 [HAL-DRIVER 이용]  (0) 2024.05.01