들어가기 전에
새로운 프로그램 언어를 배울 때 우리는 보통 Hello world를 출력하곤 한다. 임베디드를 하는 사람은 LED로 Hello world를 출력해보자.
Target: TC297 Triboard
Step: BC
참조 PDF
TriBoardManual-TC2X7-V13.pdf
하기 순서대로 설명을 진행하도록 한다.
1.Target spec 확인하는 방법
2.Port pin 설정 확인하는 방법
3.특정 Port 사용 주소 알아보는 방법
4.Trace32 로 LED 상태 변경하는 방법
5.소스 코드에서 LED 상태 변경하는 방법
1.Target spec 확인하는 방법
먼저 눈으로 LED를 확인해 보자 하기 이미지의 노랑으로 표시한 부분이 LED 포트와 핀 정보이다. 대게 P33.6 이라는 뜻은 33 port 에 6번 pin이라는 것이다. 따라서 포트 33 6번 핀부터 13번 핀까지 모두 LED에 할당되어 있다고 생각하면 된다.
검은색 표시된 부분을 자세히 보면 포트와 핀(33port.6pin~ 눈 크게 뜨고 보면 보인다.)이 적혀져 있다.
그럼 진짜인지 매뉴얼을 확인한다. (쉽게 확인 가능하다..)
Triboard 메뉴얼을 확인하면 LEDs 가 P33.6 부터 P33.13까지 제공되는 것을 알 수 있다. 이 외에도 LED들이 사용되는걸 확인할 수 있다.
2.Port pin 설정 확인하는 방법
이제 LED 가 어떤 포트와 핀에 할당되어 있는지는 알았다.
그 다음으로 확인해야할 사항은 MCAL이 어떻게 설정되어 있는지 확인하는 작업이다.
Mobilgene(구 Odin)의 경우에는 각 포트별 pin in/out 설정이 가능하다.
Mobilgene 에서 설정한 대로 P33_6번 핀은 OUT으로 설정되어있다.
그 외의 공짜? 툴들은 해당 항목이 하드 코딩 되어있다.
3.특정 Port 사용 주소 알아보는 방법
P33_6 pin_out 설정을 확인 했으므로 실제 소스에서 해당 주소를 찾아 보도록 한다.
자신이 사용하는 SDK Tool이 Odin, mobilgene 이던지 IDE, Hightech, ERIKA 던지 간에 인피니언에서 제공하는 모든 포트 핀 설정 정보는 IfxPort_reg.h 파일에 명시되어있다.
Hightech IDE 경우 port의 주소가 0xF003D300u로 설정되어 있다. 이는 이미 이 포트가 out pin으로 설정되었음을 의미한다.
Hightech IDE
잠시 해당 핀의 주소와 설정 방법을 확인해 보면
하기 문서에서 #define P33_OUT /*lint --e(923)*/ (*(volatile Ifx_P_OUT*)0xF003D300u) 값으로 유니온 포인터로 설정되어 있는 것을 알 수 있다.
Union이 뭔지 헷갈린다면 하기 링크를 참조하자.
유니온 설명 링크: https://suho413.tistory.com/entry/Union-%EC%82%AC%EC%9A%A9-%EC%9D%B4%EC%9C%A0
해당 포트 핀의 시작 주소는 0xF003D300u 이고 이 주소를 기준으로 값을 셋팅 된다.
유니온의 크기는 최대 4byte이고 signed int, unsigned int, bit field를 가능하게 설계되어 있다.
이 설정으로 인해 16진수로 led를 설정하거나 bit를 특정해 설정 가능하다.
사용 예는 글 후반부에 있다.
참조 할 만한 h 선언들
/** \brief 0, Port Output Register */
#define P33_OUT /*lint --e(923)*/ (*(volatile Ifx_P_OUT*)0xF003D300u)
typedef union
{
unsigned int U; /**< \brief Unsigned access */
signed int I; /**< \brief Signed access */
Ifx_P_OUT_Bits B; /**< \brief Bitfield access */
} Ifx_P_OUT;
/** \brief Port Output Register */
typedef struct _Ifx_P_OUT_Bits
{
unsigned int P0:1; /**< \brief [0:0] (rwh) */
unsigned int P1:1; /**< \brief [1:1] (rwh) */
unsigned int P2:1; /**< \brief [2:2] (rwh) */
unsigned int P3:1; /**< \brief [3:3] (rwh) */
unsigned int P4:1; /**< \brief [4:4] (rwh) */
unsigned int P5:1; /**< \brief [5:5] (rwh) */
unsigned int P6:1; /**< \brief [6:6] (rwh) */
unsigned int P7:1; /**< \brief [7:7] (rwh) */
unsigned int P8:1; /**< \brief [8:8] (rwh) */
unsigned int P9:1; /**< \brief [9:9] (rwh) */
unsigned int P10:1; /**< \brief [10:10] (rwh) */
unsigned int P11:1; /**< \brief [11:11] (rwh) */
unsigned int P12:1; /**< \brief [12:12] (rwh) */
unsigned int P13:1; /**< \brief [13:13] (rwh) */
unsigned int P14:1; /**< \brief [14:14] (rwh) */
unsigned int P15:1; /**< \brief [15:15] (rwh) */
unsigned int reserved_16:16; /**< \brief \internal Reserved */
} Ifx_P_OUT_Bits;
4.Trace32 로 LED 상태 변경하는 방법
하기 방법은 T32(Trace 32)에서 메모리 값을 변경해서 Target을 제어하는 과정이다.
Port 33 번 OUT 셋팅에서 6번 핀 상태를 HIGH -> Low로 변경하면 해당 LED가 점등된다. 마우스 더블 클릭하면 bool형 데이터이기 때문에 값이 변경된다. 그리고 하단 B:: Command 창을 보면 선택만으로 해당 위치의 주소값을 확인 할 수있다.
소스 코드에서 LED 상태 변경하는 방법
LED 와 같은 경우 간단하게 LED에 할당된 주소에 값 변경으로 쉽게 제어할 수 있다.
P33_OUT.U = ((P33_OUT.U >> 6) | 0xFF) << 6; // 모든 Led를 Off
P33_OUT.B.P6 = P33_OUT.B.P6 & 0x0; // p33.6 Led를 On
P33_OUT.B.P9 = P33_OUT.B.P9 ^ 0x1;// p33.9 Led를 Toggle
하기 동영상으로 확인 및 정리해 보자.
'programmer > Embedded' 카테고리의 다른 글
Tasking사용 Infineon linker script 분석 1 (0) | 2020.07.27 |
---|---|
Ubuntu 16.4 LTS 에서 Ubuntu 18.4 LTS 변경시 유의 (0) | 2020.04.14 |
Target 의 elf 위치 설정(Hightech IDE) (0) | 2020.03.27 |
Hightec 예제 프로젝트 생성 및 빌드 (0) | 2020.03.27 |
How to install Hightech UDE Plugin (0) | 2020.03.27 |