본 글에서는 전 글에 이어서 AFIO에 관한 내용을 다룹니다. AFIO와 remap 기능은 그래픽 lcd를 제어하는 것과는 관련이 별로 없어서 한참을 망설이다가 공부하는 김에 같이 익히고 가자는 생각이 들어서 다루어 봅니다. 사실 복잡한 내용은 아니지만 내용이 방대해서 대충의 방향만 다루어 보겠습니다. 굳이 외우거나 할 필요는 없고 대충 이런 내용이 있구나 정도만 파악해도 될 듯합니다. 어차피 레지스터를 직접 프로그래밍하려면 STM32F103의 레퍼런스 매뉴얼을 보아야 할 것이기 때문입니다.
STM32에 관하여 이제 입문한 정도인지라 무슨 내용인지도 파악이 안되는 것들도 좀 있습니다.
본 글에서는 AFIO 레지스터의 개략적인 내용을 살펴 볼 예정입니다. 본격적으로 RA8835를 사용한 그래픽 lcd를 다루는 코드는 다음 글인 제4편에서 다루겠습니다. 예전에 언급했듯이 RA8835와 SED1335는 완전히 호환되므로, SED8835 관련 라이브러리나 함수들은 RA8835에서도 모두 사용할 수 있습니다.
STM32F103의 각 핀들은 GPIO 외에 다른 기능들을 가지고 있습니다. STM32CubeMX의 pinout 설정시 각 핀을 클릭해 보면 그 핀이 가지고 있는 다양한 기능이 나옵니다. 프로그래머는 각 핀이 가지고 있는 다양한 기능 중에서 원하는 기능을 수행하도록 설정해야 합니다. UART 통신, CAN 통신, SPI, I2C 등 각각의 관리 레지스터를 프로그래밍함으로써 각 핀들이 가지고 있는 alternative function을 활성화 시킬 수 있습니다. 그런데, alternative function으로 사용하고자 하는 핀을 이미 다른 기능으로 사용하고 있는 경우가 발생할 수 있습니다. 이럴 때에STM32F103에서는 alternative function 기능을 다른 핀으로 재할당할 수 있습니다. 이런 기능을 remapping이라 합니다. STM32F103에서는 소프트웨어적으로 AFIO_MAPR 레지스터를 프로그래밍함으로써 alternative function을 remapping할 수 있습니다.
OSC32_IN/OSC32_OUT 핀은 LSE(low speed external) oscillator를 사용하지 않을 때에는 GPIO PC14와 PC15로 사용할 수 있습니다. 하지만 LSE 기능이 GPIO 기능보다 우선권을 가져서 Vdd가 끊어지고, Vbat에 1.8V의 전압이 공급되면 PC13, PC14, PC15는 아나로그 입력 상태가 되어 RTC 동작으로 전환됩니다.
OSCIN/OSCOUT 핀은 HSE(High Speed External) oscillator에 사용되지만, AFIO 레지스터의 PD01_REMAP 비트를 프로그래밍함으로써 GPIO인 PD0나 PD1로 사용할 수 있습니다. 이 기능은 36핀, 48핀, 64핀 패키지에서 유용합니다. 왜냐하면 100핀이나 114핀 패키지에는 PD0와 PD1이 별도의 핀으로 존재하기 때문에 이 기능을 쓸 필요가 없습니다. 36핀, 48핀, 64핀 패키지의 경우 PD0와 PD1은 외부 인터럽트나 이벤트 기능으로 사용할 수는 없습니다.
AFIO_MAPR 레지스터의 SWJ_CFG[2:0] 비트를 프로그래밍하으로써 디버그 인터페이스에 사용되는 JTAG나 SWD로 사용하는 핀들을 GPIO 핀으로 remapping 할 수도 있습니다.
STM32F103의 경우 AFIO가 할당된 메모리 주소는 다음과 같습니다.
0x4001 0000 ~ 0x4001 03FF
AFIO의 주요 레지스터들을 정리해 봅니다.
① AFIO_EVCR
오프셋 주소 : 0x0000 0000
기본값 : 0x0000 0000
Bit 7 EVOE (Eventout Enable)
Bit 6:4 PORT[2:0] (Eventout port selection)
PORT2 |
PORT1 |
PORT0 |
|
0 |
0 |
0 |
PA |
0 |
0 |
1 |
PB |
0 |
1 |
0 |
PC |
0 |
1 |
1 |
PD |
1 |
0 |
0 |
PE |
Bit 3:0 PIN[3:0] (Eventout pin selection) pin0 ~ pin15
② AFIO_MAPR
오프셋 주소 : 0x0000 0004
기본값 : 0x0000 0000
SWJ_CFG[2:0] : Serial Wire JTAG configuration
SWJ_CFG2 |
SWJ_CFG_1 |
SWJ_CFG0 |
|
0 |
0 |
0 |
JTAG-DP + SW-DP (Reset state) |
0 |
0 |
1 |
JTAG-DP + SW-DP but without NJTRST |
0 |
1 |
0 |
JTAG-DP Disabled, SW-DP Enabled |
1 |
0 |
0 |
JTAG-DP Disabled, SW-DP Disabled |
|
|
|
Others are ignored |
ADC2_ETRGREG_REMAP : ADC 2 external trigger regular conversion remapping
ADC2_ETRREG_REMAP |
ADC2 External Trigger Regular Conversion |
0 |
EXTI11 |
1 |
TIM8_TRGO |
ADC2_ETRGINJ_REMAP : ADC 2 external trigger injected conversion remapping
ADC2_ETRINJ_REMAP |
ADC2 External Trigger Injected Conversion |
0 |
EXTI15 |
1 |
TIM8_Channel4 |
ADC1_ETRGREG_REMAP : ADC 1 external trigger regular conversion remapping
ADC1_ETRREG_REMAP |
ADC1 External Trigger Regular Conversion |
0 |
EXTI11 |
1 |
TIM8_TRGO |
ADC1_ETRGINJ_REMAP : ADC 1 external trigger injected conversion remapping
ADC1_ETRINJ_REMAP |
ADC1 External Trigger Injected Conversion |
0 |
EXTI15 |
1 |
TIM8_Channel4 |
TIM5CH4_IREMAP : TIM5 Channel 4 internal remap
TIM5CH4_IREMAP |
TIM5 Channel 4 internal |
0 |
PA3 |
1 |
LSI |
PD01_REMAP : PD0/PD1 mapping on OSCIN/OSCOUT
PD01_REMAP |
OSCIN/OSCOUT |
0 |
OSCIN/OSCOUT |
1 |
PD0/PD1 (internal 8MHz RC is used as application clock) |
CAN_REMAP[1:0] :
CAN_REMAP1 |
CAN_REMAP0 |
CAN_RX |
CAN_TX |
0 |
0 |
PA11 |
PA12 |
0 |
1 |
X |
X |
1 |
0 |
PB8 |
PB9 |
1 |
1 |
PD0 |
PD1 |
TIM4_REMAP : TIM4 remap
TIM4_REMAP |
TIM4_CH1 |
TIM4_CH2 |
TIM4_CH3 |
TIM4_CH4 |
0 |
PB6 |
PB7 |
PB8 |
PB9 |
1 |
PD12 |
PD13 |
PD14 |
PD15 |
TIM3_REMAP[1:0] : TIM3 remap
TIM3_REMAP1 |
TIM3_REMAP0 |
TIM3_CH1 |
TIM3_CH2 |
TIM3_CH3 |
TIM3_CH4 |
0 |
0 |
PA6 |
PA7 |
PB0 |
PB1 |
0 |
1 |
X |
X |
X |
X |
1 |
0 |
PB4 |
PB5 |
PB0 |
PB1 |
1 |
1 |
PC6 |
PC7 |
PC8 |
PC9 |
TIM2_REMAP[1:0] : TIM2 remap external trigger(ETR)
TIM2_REMAP1 |
TIM2_REMAP0 |
CH1/ETR |
CH2/ETR |
CH3/ETR |
CH4/ETR |
0 |
0 |
PA0 |
PA1 |
PA2 |
PA3 |
0 |
1 |
PA15 |
PB3 |
PA2 |
PA3 |
1 |
0 |
PA0 |
PB1 |
PB10 |
PB11 |
1 |
1 |
PA15 |
PB3 |
PB10 |
PB11 |
TIM1_REMAP[1:0] : TIM1 remap
TIM1_REMAP1 |
TIM1_REMAP0 |
ETR |
CH1 |
CH2 |
CH3 |
CH4 |
BKIN |
CH1N |
CH2N |
CH3N |
0 |
0 |
PA12 |
PA8 |
PA9 |
PA10 |
PA11 |
PB12 |
PB13 |
PB14 |
PB15 |
0 |
1 |
PA12 |
PA8 |
PA9 |
PA10 |
PA11 |
PA6 |
PA7 |
PB0 |
PB1 |
1 |
0 |
X |
X |
X |
X |
X |
X |
X |
X |
X |
1 |
1 |
PE7 |
PE9 |
PE11 |
PE13 |
PE14 |
PE5 |
PE8 |
PE10 |
PE12 |
USART3_REMAP[1:0] : USART3 remap
USART3_REMAP1 |
USART3_REMAP0 |
TX |
RX |
CK |
CTS |
RTS |
0 |
0 |
PB10 |
PB11 |
PB12 |
PB13 |
PB14 |
0 |
1 |
PC10 |
PC11 |
PC12 |
PB13 |
PB14 |
1 |
0 |
X |
X |
X |
X |
X |
1 |
1 |
PD8 |
PD9 |
PD10 |
PD11 |
PD12 |
USART2_REMAP : USART2 remap
USART1_REMAP |
CTS |
RTS |
TX |
RX |
CK |
0 |
PA0 |
PA1 |
PA2 |
PA3 |
PA4 |
1 |
PD3 |
PD4 |
PD5 |
PD6 |
PD7 |
USART1_REMAP : USART1 remap
USART1_REMAP |
TX |
RX |
0 |
PA9 |
PA10 |
1 |
PB6 |
PB7 |
I2C1_REMAP : I2C1 remap
I2C1_REMAP |
SCL |
SDA |
0 |
PB6 |
PB7 |
1 |
PB8 |
PB9 |
SPI1_REMAP : SPI1 remap
SPI1_REMAP |
NSS |
SCK |
MISO |
MOSI |
0 |
PA4 |
PA5 |
PA6 |
PA7 |
1 |
PA15 |
PB3 |
PB4 |
PB5 |
③ AFIO_EXTICR1
오프셋 주소 : 0x08
기본값 : 0x0000
④ AFIO_EXTICR2
오프셋 주소 : 0x0C
기본값 : 0x0000
⑤ AFIO_EXTICR3
오프셋 주소 : 0x10
기본값 : 0x0000
⑥ AFIO_EXTICR4
오프셋 주소 : 0x14
기본값 : 0x0000
EXTIx3 |
EXTIx2 |
EXTIx1 |
EXTIx0 |
|
0 |
0 |
0 |
0 |
PA[x] |
0 |
0 |
0 |
1 |
PB[x] |
0 |
0 |
1 |
0 |
PC[x] |
0 |
0 |
1 |
1 |
PD[x] |
0 |
1 |
0 |
0 |
PE[x] |
0 |
1 |
0 |
1 |
PF[x] |
0 |
1 |
1 |
0 |
PG[x] |
⑦ AFIO_MAPR2
오프셋 주소 : 0x001C
기본값 : 0x0000 0000
FSMC_NADV : NADV connect/disconnect
FSMC_NADV |
|
0 |
connect |
0 |
not connected |
TIM14_REMAP : TIM14 remap
TIM14_REMAP |
TIM14_CH1 |
0 |
PA7 |
1 |
PF9 |
TIM13_REMAP : TIM13 remap
TIM13_REMAP |
TIM13_CH1 |
0 |
PA6 |
1 |
PF8 |
TIM11_REMAP : TIM11 remap
TIM13_REMAP |
TIM13_CH1 |
0 |
PB9 |
1 |
PF7 |
TIM10_REMAP : TIM10 remap
TIM13_REMAP |
TIM13_CH1 |
0 |
PA8 |
1 |
PF6 |
TIM9_REMAP : TIM9 remap
TIM9_REMAP |
TIM9_CH1 |
TIM9_CH2 |
0 |
PA2 |
PA3 |
1 |
PE5 |
PE6 |
레지스터의 내용만 지루하게 길게 정리했습니다. 구체적인 내용은 다 외울 수 없고 그럴 필요도 없다고 생각합니다. 심지어 일부 기능은 STM32F103C8T6에는 없기도 합니다. 이런 방법으로 remapping하는구나 정도만 기억해 둡시다.
다음 제4편에서 본격적으로 GPIO를 이용해서 RA8835를 컨트롤러로 가지고 이있는 그래픽 lcd를 다루어 보겠습니다. HAL 드라이버도 사용해 보고, 직접 포트를 제어해 보기도 할 예정입니다.
'STM32F103' 카테고리의 다른 글
RA8835 GLCD 제어하기(제5편) - 한글 및 영문자 출력하기 (0) | 2018.11.18 |
---|---|
RA8835 GLCD 제어하기(제4편) - RA8835 제어함수 만들기 (0) | 2018.11.15 |
RA8835 GLCD 제어하기(제2편) - STM32F103 GPIO 다루기(1) (0) | 2018.11.11 |
RA8835 GLCD 제어하기(제1편) - 회로도와 프로젝트 만들기 (0) | 2018.11.11 |
문자형 LCD 4비트로 제어하기 (GPIO와 Timer2 인터럽트 이용) (2) | 2018.11.11 |