코스웨어/11년 내장형하드웨어
[내장형]이수란_2011년9월7일
알 수 없는 사용자
2011. 9. 7. 17:19
ARM
T/C 사용위한 초기화 순서
- 타이머 카운터에 전원 공급 [PMC_PCER]
- 초기화위해 T/C의 클럭 비활성화 [TC_CCR]
- 초기화위해 T/C의 인터럽트 모두 비활성화 [TC_IDR]
- 초기화위해 T/C의 상태레지스터 클리어 - 상태레지스터는 한번 읽으면 자동으로 0값으로 클리어됨 [TC_SR]
- 모든 인터럽트 비활성화 (다른 인터럽트 신호 발생 금지) [AIC_IDCR]
- T/C의 인터럽트 발생시 실행할 함수의 벡터(주소) 지정 [ AIC_SVR [P-ID] ]
- T/C의 인터럽트 소스모드와 우선순위 설정 [ AIC_SMR [P-ID] ]
- T/C의 인터럽트 클리어 [AIC_ICCR]
- 타이머 카운터 모드 설정 [TC_CMR] : (분주비 설정(1초에 얼마씩나누어셀지) | RA, RB, RC 중 레지스터 선택)
- 타이머 카운터의 인터럽트 모드 선택 [TC_IER]
* RC compare interrupt 사용시(비교모드 사용) 비교값 설정 [TC_RC]
- 인터럽트 중 타이머카운터(T/C의 PID값 사용) 사용하도록 설정 [AIC_IECR]
- T/C 의 0번 사용하도록 설정[TC_CCR] -> 카운터 시작됨
①클럭 공급 ② 소프트웨어적 카운터 리셋 후 클럭 공급
_소스코드_
더보기 접기
#include "TIMER.h"
//#include "DBGU.h" // ONE 함수 있는 곳
volatile unsigned int ICNT;
void TIMER_INIT( void )
{
PMC_PCER = 1 < < TC0; //타이머 카운터에 전원 공금
TC0_CCR = 1 < < CLK_DIS; //초기화 위해 클럭 꺼줌
TC0_IDR = 0x FFFFFFFF; //인터럽트 모두 비활성화
TC0_SR; //상태 레지스터를 읽으면 자동으로 내용 삭제됨.(초기화)
AIC_IDCR = 0x FFFFFFFF; // 전체인터럽트 비활성화
AIC_SVR[TC0] = ( unsigned int )MY_CNT; // T/C의 인터럽트 발생시 호출할 벡터 주소 = MY_CNT
AIC_SMR[TC0] = ( 2 < < SRC_TYPE) | ( 0 < < PRIO); // T/C의인터럽트 소스모드 설정
AIC_ICCR = 1 < < TC0; // T/C의 인터럽트 클리어
TC0_CMR = ( 1 < < CPCTRG) | ( 4 < < TCCLKS); //분주비 설정 (MCK/?), PC compare mode로 설정
TC0_IER = 1 < < CPCS; //RC compare enable
TC0_RC = 49 ; //비교할 값 (RC 레지스터에 저장) 1초 = 49152(48KHz에서)
AIC_IECR = 1 < < TC0; //타이머카운터 인터럽트 활성화
// TC0_CCR = 1 < < CLK_EN; //TC0에 클럭 공급
// TC0_CCR = 1 < < SW_TRG; // & 카운터 리셋 & 클럭 공급
return ;
}
void DELAY( unsigned short usValue)
{
ICNT = 0 ;
TC0_CCR = 1 < < CLK_EN; //TC0 start.
TC0_CCR = 1 < < SW_TRG; // └중간의 함수처리시간으로 인한 오차를 줄이기위해 카운트 직전에 호출.
while (usValue > ICNT); //인자로 받은 usValue 값만큼 delay 됨.
return ;
}
void MY_CNT( void ) // 인터럽트 발생시 호출된 함수.
{
TC0_SR;
++ICNT; // 1/1000 초 마다 계산됨.
}
/*{
TC0_SR; // 인터럽트 발생값 다시 0으로 초기화
TC0_CCR = 1 < < CLK_DIS;
//-----------할 일 ----------------
ONE(); //0번 pin 에 연결된 LED toggle
//-------------------------------
TC0_CCR = 1 < < CLK_EN; // 카운터 재시작
TC0_CCR = 1 < < SW_TRG;
return ;
}*/
접기
_main.c_
더보기 접기
int main( void )
{
TIMER_INIT();
LED_INIT();
while ( 1 )
{
DELAY( 1000 ); // 1초
ONE(); // LED toggle
}
return 0 ;
}
접기
---------------------------------------------------------------------------------------------------
API
문자열 리소스
: 윈도우즈에서 문자열도 일종의 리소스로 취급.
리소스에 문자열을 정의해 두고 필요시 읽어와 사용할 수 있음.
장점 - 문자열을 코드와 분리해 따로 관리 가능.
_문자열 리소스 작성_
insert-> resource -> String Table
--> Caption에 문자열 입력. ID 설정
_소스 추가_
LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
TCHAR str[ 256 ]; //문자열 저장 버퍼
hdc = BeginPaint(hWnd, & ps);
//---------------------------
//LoadString(g_hInst,IDS_STRING1,str,256); //문자열리소스읽어와버퍼에 저장
LoadString(GetModuleHandle(NULL),IDS_STRING1,str, sizeof (str));
TextOut(hdc, 10 , 10 ,str,lstrlen(str)); //저장된 문자열 출력
//---------------------------
EndPaint(hWnd, & ps);
return 0 ;
}
(*) HINSTANCE GetModuleHandle (NULL) ;
: 현재 실행되고 있는 프로그램의 핸들을 가져오는 함수.
int LoadString (①HINSTANCE hInstance, ②UINT uID, ③LPTSTR lpBuffer, ④int nBufferMax);
:문자열 리소스를 읽어오는 함수.
① 현재 실행되고 있는 프로그램 핸들
② 문자열 ID
③ 문자열 읽을 버퍼
④ 버퍼 길이
GDI
: Graphic Device Interface
: 모든 출력 장치(화면, 프린터 등)를 제어하는 윈도우즈 모듈
GDI object
: GDI가 그래픽 출력에 사용하는 도구 ( 펜, 브러시, 폰트, 비트맵, 팔레트, 리전...)
일종의 구조체, 선언문은 비공개, GDI object 생성함수로 핸들을 리턴받아 사용 함.
GDI object 를 모아 놓은 것 = DC , DC에서 사용할 오브젝트 선택후 이용.
--> default - 따로 지정하지 않을 때.
BeginPaint, GetDC 함수에서 default로 선택된 GDI object 를 사용하게 됨.
--> default를 바꿀 때 - 함수로 핸들 얻어 지정.
(*) 스톡 오브젝트(Stock Object ) : 윈도우즈 기본 제공하는 GDI 오브젝트. OS부팅시부터 만들어져 있음.
_사용할 스톡 오브젝트의 핸들 값 얻기_
HGDIOBJ GetStockObject (① int fnObject);
: ① ( = 사용하고자 하는 스톡 오브젝트)을 지정해서 리턴되는 핸들값 가져옴.
_오브젝트 지정_
HGDIOBJ SelectObject (② int fnObject);
: ② ( = Get으로 가져온 핸들값)를 사용하도록 설정. 이전에 설정된 핸들값을 리턴함.
_ex_
더보기 접기
LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
HBRUSH MyBrush; //사용할 브러시
HBRUSH OldBrush; //이전 브러시
HPEN MyPEN; //사용할 펜
HPEN OldPEN; //이전 펜
hdc = BeginPaint(hWnd, & ps);
//---------------------------
MyBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH);//LTGRAY_BRUSH핸들값얻어 MyBrush에 저장
OldBrush = (HBRUSH)SelectObject(hdc,MyBrush); // MyBrush 선택.이전값 저장
MyPEN = (HPEN)GetStockObject(WHITE_PEN); // WHITE_PEN 핸들값 얻어오기.
OldPEN = (HPEN)SelectObject(hdc,MyPEN); // MyPEN 선택.이전값 저장
Rectangle(hdc, 50 , 50 , 300 , 200 ); //선택한 My PEN&Brush로 사각형 그리기
SelectObject(hdc,OldBrush); //사용후 복구
SelectObject(hdc,OldPEN);
MyBrush = (HBRUSH)GetStockObject(NULL_BRUSH); // 투명브러쉬 핸들값 얻기
OldBrush = (HBRUSH)SelectObject(hdc,MyBrush); // 선택. 이전값 저장.
Rectangle(hdc, 30 , 30 , 200 , 100 ); // 투명브러쉬, 기본펜으로 사각형 그리기
SelectObject(hdc,OldBrush); // 사용후 복구
//---------------------------
EndPaint(hWnd, & ps);
return 0 ;
}
접기