이글의 전부 또는 일부, 사진, 소스프로그램 등은 저작자의 동의 없이는 상업적인 사용을 금지합니다. 또한, 비상업적인 목적이라하더라도 출처를 밝히지 않고 게시하는 것은 금지합니다.



본 글에서는 전 글에 이어서 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

PA11

PA12

 0

 X

 1

PB8

PB9

 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

 PA6

 PA7

 PB0

PB1 

 0

 X

 X

 X

 X

 1

 PB4

 PB5

 PB0

PB1 

 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

 PA0

 PA1

 PA2

PA3 

 0

 PA15

 PB3

 PA2

PA3 

 1

 PA0

 PB1

 PB10

PB11 

 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

PA12 

PA8 

PA9 

PA10 

PA11 

PB12 

PB13 

PB14 

PB15 

 0

PA12 

PA8 

PA9 

PA10 

PA11 

PA6 

PA7 

PB0 

PB1 

 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

PB10 

PB11 

PB12 

PB13 

PB14 

PC10 

PC11 

PC12 

PB13 

PB14 

PD8 

PD9 

PD10 

PD11 

PD12 


USART2_REMAP : USART2 remap

USART1_REMAP

 CTS

 RTS

 TX

 RX

 CK

PA0 

PA1 

PA2 

PA3 

PA4 

PD3 

PD4 

PD5 

PD6 

PD7 


USART1_REMAP : USART1 remap

USART1_REMAP

 TX

 RX

PA9 

PA10 

PB6 

PB7 


I2C1_REMAP : I2C1 remap

I2C1_REMAP

 SCL

 SDA

PB6 

PB7 

PB8 

PB9 


SPI1_REMAP : SPI1 remap

SPI1_REMAP

 NSS

 SCK

 MISO

 MOSI

PA4 

PA5 

PA6 

PA7 

PA15 

PB3 

PB4 

PB5 




③ AFIO_EXTICR1


오프셋 주소 : 0x08

기본값 : 0x0000



④ AFIO_EXTICR2


오프셋 주소 : 0x0C

기본값 : 0x0000



⑤ AFIO_EXTICR3


오프셋 주소 : 0x10

기본값 : 0x0000



⑥ AFIO_EXTICR4


오프셋 주소 : 0x14

기본값 : 0x0000



EXTIx3

 EXTIx2

 EXTIx1

 EXTIx0

 

PA[x] 

PB[x] 

PC[x] 

PD[x] 

PE[x] 

PF[x] 

PG[x] 




⑦ AFIO_MAPR2


오프셋 주소 : 0x001C

기본값 : 0x0000 0000



FSMC_NADV : NADV connect/disconnect

FSMC_NADV

 

 connect

 not connected


TIM14_REMAP : TIM14 remap

TIM14_REMAP

 TIM14_CH1

PA7 

PF9 


TIM13_REMAP : TIM13 remap

TIM13_REMAP

 TIM13_CH1

PA6 

PF8 


TIM11_REMAP : TIM11 remap

TIM13_REMAP

 TIM13_CH1

PB9 

PF7 


TIM10_REMAP : TIM10 remap

TIM13_REMAP

 TIM13_CH1

PA8 

PF6 


TIM9_REMAP : TIM9 remap

TIM9_REMAP

 TIM9_CH1

 TIM9_CH2

PA2 

PA3 

PE5 

PE6 



레지스터의 내용만 지루하게 길게 정리했습니다. 구체적인 내용은 다 외울 수 없고 그럴 필요도 없다고 생각합니다. 심지어 일부 기능은 STM32F103C8T6에는 없기도 합니다. 이런 방법으로 remapping하는구나 정도만 기억해 둡시다.


다음 제4편에서 본격적으로 GPIO를 이용해서 RA8835를 컨트롤러로 가지고 이있는 그래픽 lcd를 다루어 보겠습니다. HAL 드라이버도 사용해 보고, 직접 포트를 제어해 보기도 할 예정입니다.



블로그 이미지

엠쿠스

Microprocessor(STM32, AVR)로 무엇인가를 만들어 보고자 학습 중입니다.

,