[Lowlevel.c]

|


[1단계 - EFC Init] (내장 플래시 메모리 컨트롤러 초기화)

[소스 코드]

1
2
3
4
5
6
#ifdef AT91SAM7S512 //선택적 컴파일, 전처리지시어
	AT91C_BASE_MC->MC0_FMR = AT91C_MC_FWS_1FWS; // 1 Wait State to work at 48MHz
	AT91C_BASE_MC->MC1_FMR = AT91C_MC_FWS_1FWS; // 1 Wait State to work at 48MHz
#else
	AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS; // 1 Wait State to work at 48MHz
#endif

[소스 분석]
Makefile에 TARGET=AT91SAM7S256으로 정의되어 있으므로 else문이 실행된다.
메모리 컨트롤러는 임베디드 플래시 컨트롤러를 포함하고 있고, FMR은 플래시 메모리의 모드를 설정할 수 있는 레지스터이다.
메모리 컨트롤러의 FMR의 FWS (Flash Wait State)를 0x01로 설정한다. (리드 동작 : 2사이클 웨이트, 라이트 동작 : 3사이클 웨이트)
//내용추가

[매크로 분석]
1. AT91C_BASE_MC
#define AT91C_BASE_MC (AT91_CAST(AT91PS_MC)0xFFFF_FF00) // (MC) Base Address

#define AT91C_BASE_MC ((AT91PS_MC)0xFFFF_FF00)

#define AT91C_BASE_MC ((struct _AT91S_MC *)0xFFFF_FF00)

AT91_CAST(AT91PS_MC) --> (AT91PS_MC) (AT91SAM7S256.h 64 line)
AT91PS_MC --> struct _AT91S_MC (AT91SAM7S256.h 720 line)

2. MC_FMR (MC Flash Mode Register)
#define MC_FMR (AT91_CAST(AT91_REG *)0x0000_0060) // (MC_FMR) MC Flash Mode Register

#define MC_FMR (AT91_CAST(volatile unsigned int *)0x0000_0060)

#define MC_FMR ((volatile unsigned int *)0x0000_0060)

AT91_REG --> volatile unsigned int (AT91SAM7S256.h 63 line)
AT91_CAST(volatile unsigned int) --> (volatile unsigned int) (AT91SAM7S256.h 64 line)

3. AT91C_MC_FWS_1FWS
#define AT91C_MC_FWS_1FWS (0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations

#define AT91C_MC_FWS_1FWS (0x0100)

[매크로 분석 결과]
((struct _AT91S_MC *)0xFFFF_FF00) + ((volatile unsigned int *)0x0000_0060 = (0x0100);



[2단계 - PMC Init - STEP 1] (전력관리 컨트롤러 초기화)

[소스 코드]
1
2
AT91C_BASE_PMC->PMC_MOR = (((AT91C_CKGR_OSCOUNT & (0x40 << 8)) | AT91C_CKGR_MOSCEN));
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));

[소스 분석]
line 1: 전력관리 컨트롤러의 메인 오실레이터 레지스터를 로 설정한다.
line 2: 메인 오실리에이터가 안정화될 때까지 기다린다. 왜냐하면 클럭 속도가 서서히 올라가기 때문이다.

[매크로 분석]
1단계 분석 방법과 동일

[매크로 분석 결과]
((volatile unsigned int *)0xFFFFFC20) = (0xFF << 8) & (0x40 << 8) | (0x1 << 0) = 0x4000 | 0x01
= 0100_0000_0000_0000 | 0x01
OSCOUNT = 0100_0000 (메인 오실레이터의 스타트업 시간을 8 * 슬로우 클록 주기수로 지정한다.
MOSCEN = 1로 설정하면 동작이 개시된다.


[3단계 - PMC Init - STEP 2] (전력관리 컨트롤러 초기화)

[소스 코드]
1
2
3
4
5
6
7
AT91C_BASE_PMC->PMC_PLLR = AT91C_CKGR_USBDIV_1           |
	AT91C_CKGR_OUT_0              |
	(16 << 8)                     |
	(AT91C_CKGR_MUL & (72 << 16)) |
	(AT91C_CKGR_DIV & 14);
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK));
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));

[소스 분석]
크리스털의 클럭 주파수는 18.432Hz
 
(p310)
 
이다. 이 값을 DIV로 나눈 값에 ~를 곲하면 96MHz가 나온다.
이 값이 PLL의 클럭 주파수가 된다.

그리고 이 값을 2로 나눈 값인 48MHz가 UDP의 주파수가 된다.
UDP가 필요한 이유는 프로그램을 Write할 때 USB를 사용하기 때문이다.

line 1: CKGR_USBDIV_1 = (0x1 << 28) : (PLL 출력 주파수 / 2)를 사용한다.
line 2 : AT91C_CKGR_OUT_0 = (0x0 <<14) : PLL 출력 주파수가 80~160MHz의 범위에 있다.
line 4 : AT91C_CKGR_MUL (0x7FF << 16) : PLL 회로에 의하여 주파수가 (MUL + 1)배로 곱해진다.
line 5 : AT91C_CKGR_DIV (0xFF << 0) : 메인 클록이 DIV로 나누어져 PLL 회로에 공급된다.
line 6 : PMC_SR의 2번 비트가 1이 될 때까지 기다린다. (PLL이 lock될 때까지 기다린다.)
line 7 : PMC_SR의 8, 9, 10번 비트 중 하나가 1이 될 때까지 기다린다. (마스터 클록이 ready 상태가 될 때까지 기다린다.)

[매크로 분석]
1단계 분석 방법과 동일

[매크로 분석 결과]
((volatile unsigned int *)0xFFFFFC2C) = //내용 추가



-

'AT91SAM7S256' 카테고리의 다른 글

[lds]  (0) 2010.10.05
And