Luminary Micro GPIO 특징
아주 특별한것은 없지만 5V호환 가능다는것, 드라이버 전류가 8mA로 적다는것 정도.
Programmable control for GPIO interrupts:
- Interrupt generation masking
- Edge-triggered on rising, falling, or both
- Level-sensitive on High or Low values
5-V-tolerant input/outputs
Bit masking in both read and write operations through address lines
Programmable control for GPIO pad configuration:
- Weak pull-up or pull-down resistors
- 2-mA, 4-mA, and 8-mA pad drive
- Slew rate control for the 8-mA drive
- Open drain enables
- Digital input enables
예외) JTAG 핀 (PB7 and PC[3:0]. (GPIOAFSEL=1))
GPIO 블록도
주요 레지스터
GPIODIR : 입출력 방향 설정
0: 입력
1: 출력
GPIODATA : 입출력 데이터
GPIOAFSEL : GPIO 핀 모드 설정
0: Software control of corresponding GPIO line (GPIO mode).
1: Hardware control of corresponding GPIO line (alternate hardware function).
초기화 방법
1) GPIO 클럭 초기화
GPIO에 클럭을 공급하기 위해 RCGC2 레지스터를 설정해야 한다.
Luminary Micro 제공함수 SysCtlPeripheralEnable()를 이용하면 쉽게 설정 가능하다.
ex) SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
2)GPIO 입출력 방향 설정 및 모드 설정
역시 GPIOPinTypeGPIOOutput() 함수를 이용하면 쉽게 초기화 가능하다.
ex) GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, 0xFF);
GPIO Driver 정의
#define LED1_BIT BIT0
#define LED1_PORT GPIO_PORTB_DATA_R
#define Led1Off() Sbi(LED1_PORT, LED1_BIT)
#define Led1On() Cbi(LED1_PORT, LED1_BIT)
#define Led1Toggle() Tbi(LED1_PORT, LED1_BIT)
#define Led1Init() SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);\
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, LED1_BIT)
Luminary Micro GPIO제어 예제 - LED제어
{
SystemInit();
Led1Init();
Led1On();
while(1)
{
Led1Toggle();
Delay(500)
}
}
GPIO 제어에 대한 고찰
GPIO 제어용 함수를 이요하면 쉽게 제어 가능하지만 함수이용 자체가 오버헤드가 걸린다.
GPIOPinWrite() 함수 사용시 코드
17 GPIOPinWrite(GPIO_PORTB_BASE, BIT0, 0);
\ ??main_1:
\ 0000002C 0022 MOVS R2,#+0
\ 0000002E 0121 MOVS R1,#+1
\ 00000030 2046 MOV R0,R4
\ 00000032 ........ BL GPIOPinWrite
\ 00000036 F9E7 B.N ??main_1
define 문으로 정의시 코드
16 Led1Off();
\ 0000002C 0168 LDR R1,[R0, #+0]
\ 0000002E 41F00101 ORR R1,R1,#0x1
\ 00000032 FAE7 B.N ??main_1
\ ??main_0: