[Embedded] GPIO Overview
NOTE : ๊ณต๋ถํ๋๊ฒธ ์ ์๊ฑฐ๋ผ ๋ถ์ ํํ ์ ๋ณด๊ฐ ์์ ์ ์๋ค.
GPIO (General-Purpose Input/Ouput)
GPIO๊ฐ ๋ญ๋๊ณ ํ๋ฉด ๊ทธ๋ฅ ๋ด๊ฐ ๋ง๋๋ก ์ฌ๋ฌ ๋ชฉ์ ์ผ๋ก ์ธ ์ ์๋ ๋ฒ์ฉ ํ์ด๋ค.
GPIO ํ ์ค์ ๊ณผ์
- GPIOํ์ clock ์ธ๊ฐ
- MODER๋ ์ง์คํฐ๋ฅผ ํตํด ์ด๋ค ๋ชจ๋๋ก ์ฌ์ฉํ ๊ฑด์ง ์ค์
- ์ฌ์ฉ
GPIO ์ฐ์ต : ๋ณด๋์ LED1 ๋ถ ์ผ๊ณ ๋๊ธฐ
์์ฒญ ๊ฐ๋จํ ์์คํ ์ ๋ง๋ค์ด์ GPIO๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ํ์ธํด๋ดค๋ค.
์ด๋ฒ์๋ ๋ณดํต ์ฒ์ ๋ฐฐ์ธ๋ ๋ง์ด ํ๋ ๋ณด๋ LED ๋ถ ์ผ๊ณ ๋๊ธฐ๋ฅผ ํด๋ดค๋ค.
GPIO ํ ์ฐพ๊ธฐ
GPIO๋ฅผ ์ค์ ํ๊ธฐ ์ํด์๋ ํด๋น LED๊ฐ ์ด๋ค ํ์ ์ฌ์ฉํ๋์ง ์์์ผํ๋ค.
๋๋ ์ฐ์ต์ฉ ๋ณด๋๋ก stm32 uncleo f767zi์ธ๊ฐ ํ๋ ๋ณด๋๋ฅผ ์ฐ๊ณ ์๋๋ฐ ์ด ๋ณด๋์ ๊ฒฝ์ฐ์๋ LED ํ ๋งตํ ์ ๋ณด๋ฅผ User Manual์์ ์ฐพ์ ์ ์์๋ค.
์ฌ๊ธฐ์ ๋ณด๋ฉด LD1์ PB0์ ์ฐ๊ฒฐ๋์ด์๋ค๊ณ ๋์์์ผ๋ ๋ด๊ฐ ์ ์ดํด์ผํ๋ GPIO ํ์ด PB0๋ผ๋๊ฒ์ ํ์ธํ๋ค.
์ด ๋ค์ ๋จ๊ณ์์ ํด๋น ํ์ ์ ์ดํ๊ธฐ ์ํ ์์ ์ ์ด์ด์ ์งํํ๋ค.
GPIOํ์ clock์ธ๊ฐ
Clock์ ์ธ๊ฐํ๊ธฐ ์ํด์๋ ํด๋น GPIOํ์ด ์ด๋ค ๋ฒ์ค์ ์ฐ๊ฒฐ๋์ด์๋์ง ์์์ผํ๋ค.
๋ณดํต ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๋ชจ์๋ Reference sheet์์ GPIO๋ ์ง์คํฐ ๋งตํ๋ ๋ถ๋ถ์ ๋ณด๋ฉด ๋ฒ์ค๊ฐ ๊ฐ์ด ๋์์๋ค.
์๋ ์ฌ์ง์ ๋ณด๋ฉด GPIO๊ฐ AHB1๋ฒ์ค์ ์ฐ๊ฒฐ๋์ด์์์ ์ ์ ์๋ค.
๋ฉ๋ด์ผ์ ๋ณด๋ฉด AHB1๋ฒ์ค์ RCC๋ ์ง์คํฐ๊ฐ 0x40023800~xxx ์ฃผ์์ ์์นํด ์๋๊ฒ์ ์ ์ ์๋ค.
์ด์ด์ RCC register map์ ํ์ธํด๋ณด๋ฉด ์ด๋ฐ์์ผ๋ก 0x30 offset์ GPIOB์ clock์ ์ธ๊ฐํ๋ GPIOBEN์ ๋ํ ์ ๋ณด๊ฐ ๋์์๋ค.
์ฌ๊ธฐ์ ๋ณด๋ฉด 0x30 offset ์ฃผ์์ ๋๋ฒ์งธ ๋นํธ๋ฅผ ํตํด ์ด๋ฅผ ์ ์ดํ ์ ์๋ค.
cf) ์ฐธ๊ณ ๋ก RCC ๋ ์ง์คํฐ์ RCC๋ Reset and Clock Control์ ์ฝ์๋ก, ํด๋น ๋ฒ์ค์ ์ฐ๊ฒฐ๋ ํ์ reset๊ณผ clock์ ์ ์ดํ๋ ๋ ์ง์คํฐ์งํฉ์ด๋ค.
ํ์ํ ์ฃผ์๋ฅผ ์์์ผ๋ฉด ์๋์ ๊ฐ์ด ํด๋น ํ์ ํด๋ญ์ ์ธ๊ฐ์ํฌ์ ์๋ค.
#define RCC_BASE 0x40023800UL
#define RCC_AHB1ENR (*(volatile uint32_t*)(RCC_BASE + 0x30))
// GPIOB ํด๋ญ ์ธ๊ฐ
RCC_AHB1ENR |= (1 << 1); // 1๋ฒ ๋นํธ๊ฐ GPIOB
๋ชจ๋ ์ค์
์ด๋ฒ์๋ GPIO register map์ ํ์ธํ๋ค. ๊ทธ ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋งต์์ GPIOB์ base์ฃผ์๊ฐ 0x40020400์ด๋ผ๋๊ฑธ ํ์ธํ๋ค.
๊ทธ๋ฆฌ๊ณ GPIO register map์ ๋ณด๋ฉด offset 0x00์ MODER๋ ์ง์คํฐ๊ฐ ์๋ค. MODER๋ ์ง์คํฐ์์๋ ํด๋น GPIO ๊ทธ๋ฃน์ ํ ๋ชจ๋๋ฅผ ๊ฐ๊ฐ 2๋นํธ๋ฅผ ํ์ฉํด ์ค์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ GPIOB_MODER๋ ์ง์คํฐ๋ฅผ ๋ณด๋ฉด ํด๋น ๋ ์ง์คํฐ์ 0,1๋ฒ์งธ ๋นํธ๋ก PB0 ํ์ MODE๋ฅผ ์ค์ ํจ์ ์ ์์๋ค.
๋ชจ๋์ ๋ํ ์ค์ ๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
00 : Input mode 01 : General purpose output mode 10 : Alternate function mode 11 : Analog mode
input(00)
input์ GPIO์์ญ์์ IDR๋ ์ง์คํฐ๋ฅผ ์ฝ์ด์ LOW, HIGH๋ฅผ ๊ตฌ๋ถํ ์ ์๋ค.
Output(01)
output์ ๊ฒฝ์ฐ์๋ GPIO๋ ์ง์คํฐ ์์ญ์์ ODR(Output Data Register)์์ญ์ ์ถ๋ ฅ์ผ๋ก ์ค์ ํ ๊ฐ์ ์จ ๋ฃ์ผ๋ฉด ๋๋ค.
NOTE : ODR๋์ BSRR๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๋๊ฒ ๋ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ๋ค.
๋ค๋ง ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ํ์ด ์ฐ๊ฒฐ๋ ํ๋ก๊ฐ push-pull์ํ์ธ์ง ํน์ open-drain์ํ์ธ์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
ODR | push-pull | open-drain |
---|---|---|
0 | LOW | LOW |
1 | HIGH | HIGH-Z (floating state) / HIGH(pull-up ์ ํญ์๋ ๊ฒฝ์ฐ) |
์ด ๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์ฌ์ค ์ข๋ ์ฌ๋ฌ ๋ด์ฉ์ด ์์ง๋ง ๊ธธ์ด์ง๊ฒ ๊ฐ์์ ๋ค์์ ๋ค์ ์ ๋ฆฌํ๋ ค๊ณ ํ๋ค.
Alternate function mode(AF) (10)
์ด๊ฑด ๊ทธ๋ฅ GPIO ํ์ ์ฃผ๋ณ์ฅ์น ๊ธฐ๋ฅ(USART, SPI ๋ฑ)์ผ๋ก ์ฌ์ฉํ๋ ๋ชจ๋์ด๋ค.
์ด ๋ชจ๋๋ก ์ค์ ํ ํ์๋ ๊ด๋ จ๋ ๋ค๋ฅธ ๋ ์ง์คํฐ๋ฅผ ํตํด ํด๋น ํ์ ๊ตฌ์ฒด์ ๊ธฐ๋ฅ์ ์ง์ ํด ์ฃผ์ด์ผํ๋ค.
Analog(11)
์ด๊ฑด GPIO ํ์ ์ ๋ ฅ์ผ๋ก ๋ค์ด์ค๋ ๊ฐ์ ์๋ ๋ก๊ทธ ํ์์ผ๋ก ๋ฐ๊ธฐ ์ํด ์๋ ๋ชจ๋์ด๋ค.
์ด๊ฒ ๋ฐ๋ก ์๋ ์ด์ ๋ ๋์งํธ ํ๋ก์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก Schmitt trigger ๊ตฌ์กฐ ๋๋ฌธ์ ์ ๋งคํ ์ ์๋ ๊ฐ์ ๋ก 0์ด๋ 1๋ก ํ๋จํ๊ฒ๋๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ ๋์งํธ ํ๋ก๊ฐ ์ฐ๊ฒฐ๋์ด์์ผ๋ฉด ์ ๋๋ก๋ ์๋ ๋ก๊ทธ๊ฐ์ ์ป์ ์ ์๊ธฐ๋๋ฌธ์ ๋์งํธ ํ๋ก์์ ์ฐ๊ฒฐ์ open์ํค๊ณ , ADCํ๋ก์ ์ฐ๊ฒฐํ๊ธฐ ์ํด์ ๋ฐ๋ก ๋ชจ๋๋ฅผ ๊ตฌ๋ถํ๋ค.
reference
- STM32 manual
- https://idsn.tistory.com/50
์ฃผ์ ๋ฆฌ
์๋ฒ ๋๋ ๊ณต๋ถ๋ฅผ ์ง์ง ์ค๋๋ง์ ๋ค์ํ๊ณ ์๋๋ฐ ๊ณต๋ถ ๋์ด๋๊ฐ ์ง์ง ๋์๊ฒ ๊ฐ๋ค.
๋ด์ฉ์ด ์ด๋ ต๋ค๊ธฐ ๋ณด๋ค๋ ์ ๋ณด๋ฅผ ์ฐพ๊ธฐ๊ฐ ์ ๋ง ์ด๋ ต๋ค. (ํนํ ํ๊ตญ์ด ์๋ฃ๋..)
๊ทธ๋์ ์ด๋ ๊ฒ ์ ๋ฆฌํ๋ฉด์ ์ค์ค๋ก ํ์ ์ก์๊ฐ๋๊ฒ ์ ๋ง ์ค์ํ๋ค๊ณ ๋๋ผ๊ณ ์๋ค.
์์ผ๋ก๋ ์ด์ฌํ ์ ๋ฆฌํ๊ณ ๊พธ์คํ ํ๊ณ ํด์ผ๊ฒ ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ