본문 바로가기

카테고리 없음

stm32f407 I/O 제어 (4). Alternate function mapping

STM32F4 DISCOVERY BOARD 를 이용한 I/O 제어 (4)


Alternate 에 대해서 할 차례이다. 


alternate는 한마디로 선택 가능한 주변기기이다. 


주변장치의 여러가지 기능들의 입출력을 선택하는 것이다. 


처음 이 alternate를 보았을때는 모든 핀에서 내가 원하는 기능을 뽑아다 쓸 수 있는줄 알았다.

그런데 조금 더 조사를 해보니 AF별로 기능이 정해져 있었고 그 기능들은 각각의 핀에 의해서 구현되고 있었다.


그래서 똑같은 모든 포트에서 모든 기능들을 뽑아다 쓰면 될것이라고 생각했었다. 


그런데 조금더 조사를 해보니 각각 포트별 핀별 출력할 수 있는 기능이 미리 정해져 있었다. 


나는 주로 RM0090 Reference manual 을 보면서 공부를 하고 있는데 아무리 찾아도 정보가 나오지 않더군....

그런데 이 자료는 Datasheet 에 나오더군......  배신감...ㅠㅠ


그래서 찾아보는데 공부하는데 알아보는데 좀더 늦어진 점도 있다. 



DataSheet 에 있는  Alternate function mapping 테이블이다. 



동일한 기능이 여러번  있는거 같다. 타이머3 같은 경우는 총 3번 나온다. 

그래서 조금 색다른 실험을 해봤다 과연 똑같은 출력을 여러번 사용할 수 있을까? 라는 궁금증이다. 


그래서 타이머를 가지고 실험을 해봤더니 결과는 가능하다 이다. 


그런데 다시한번 생각해보니 조금 미련한 실험이였던 것 같다. 궂이 똑같은 출력을 사용할 필요가 없었기 때문이다. 

그냥 pin에 사용하고자 하는 것 2개를 다 물려버리면 되는 간단한 상황이였던 것임....


fan-out 을 생각한다면 사용해봄직도 하지만 그렇게 하드웨어를 구성할 일이 없을듯 하니 결국은 가능성만 확인하는 수준에서 끝났다. 

(물론 가능할까?라는 궁금증에서 시작했으니 소기 목적은 달성했으나 이걸 활용할 일이 있을까 싶다.)


간단하게 타이머소스를 이용하여 테스트 하였으니 타이머 소스를 이용하여 분석해보자.


소스는

STM32F4DISCOVERY board firmware package, including 22 examples
(covering USB Host, audio, MEMS accelerometer and microphone…) and preconfigured projects for 4 different IDEs
Version 1.1.0을 사용하고 있다.

아래 소스는 타이머 초기화 소스이다. 


그리고 아래는 포트 초기화 소스이다. 



  /* GPIOC Configuration: TIM3 CH1 (PC6) and TIM3 CH2 (PC7) */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 ;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;

  GPIO_Init(GPIOC, &GPIO_InitStructure); 


여기서 GPIO_Mode 가 AF 인 것을 알 수 있다. 

이것이 유일하게 기존과 다른 출력이다. 


  GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);

  GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3); 


그리고 위의 함수가 pin 에서 어떤 AF 모드를 사용할 지를 나타내는 것이다. 


위의 Alternate function mapping 테이블을 보면 PORTA의 pin 6,7 번의 AF2는 TIM_CH1, TIM_CH2 인 것을 확이할 수 있다.


여기서 GPIO_AF_TIM3 는 선언하는 부분을 들어가보면 (stm32fxx_gpio.h) 


/** 

  * @brief   AF 2 selection  

  */ 

#define GPIO_AF_TIM3          ((uint8_t)0x02)  /* TIM3 Alternate Function mapping */

#define GPIO_AF_TIM4          ((uint8_t)0x02)  /* TIM4 Alternate Function mapping */

#define GPIO_AF_TIM5          ((uint8_t)0x02)  /* TIM5 Alternate Function mapping */


이렇게 친절하게 나와있다.


atmega128과의 차이점은 아무데서나 뽑아쓸수 있는건 아니지만 출력할 수 있는 핀이 하나는 아니라는것이다. 

예를들면 ch1은 PA6에서 뽑고 ch2는 PC7에서 뽑아서 사용할 수도 있는 것이다. 


atmega128에서 이런 저런 기능을 사용하다보면 심지어 핀활용까지 신경쓰면서 했어야 하는데 이러한 기능은 

좀더 편안하게 하드웨어를 구성할 수 있다는 장점이 있는듯 하다. 


그리고 포트든 핀을 쓸때는 항상 클럭을 활성화 시켜줘야 한다는거!!! 잊지말자....

(잠깐 헤맸었다....)




사실.... alternate는 대충썼네......마지막인데......

I/O의 마지막이기도 한거고....

처음에 이걸 궂이 블로그에 올려야할까라 고 생각했었는데......  

이렇게 하길 잘한거 같다....


이거 올리면서 평소보다 훨씬 자세히 공부하였고 정리하면서 한번더 복습할 수 있었다. 


그리고 데이터북과 레퍼런스 메뉴얼을 찾아보면서 대충 감을 잡은 느낌이랄까?....

아직 중요한 클럭이 있긴 하지만.....  일단은 128보다 빠르게 동작하니..ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


I/O를 통해 전체적인 동작과 자료 찾는 범 함수의 구조, 연관성 등을 살펴볼 수 있어 나에게 유익한 시간이였다.


이제 본격적으로 좀 무언가 만들어 볼가?