이 블로그 검색

2011년 12월 19일 월요일

PWM Controller

블랙핀 프로세서중 BF506F등에 PWM 모듈이 포함되어 있다.

우리는 여기에서 PWM의 기본적인 개념과 블랙핀에서의 PWM대해 다루어 보고자 한다.

PWM은 프로세서의 디지털 출력으로 아날로그 회로를 제어하는 강력한 기법이다. PWM은 계측과 통신에서 전력제어와 전력변환에 이르기까지 광범위한 영역에서 사용되고 있다.

PWM은 펄스폭 변조이다. 스위칭 주파수, 튜티사이클등의 주요변수들이 있게 된다.

PWM을 이용한 제어의 원리에 간단히 설명하면

PWM은 스위치의 ON/OFF시간(Duty cycle)을 이용하여 대상을 제어한다.

예를 들면  9V 최대출력의 램프가 있다고 가정하면 50%듀티 사이클로 대상을 제어 할때는 4.5V의 효과를 나타낼것이다. 이때의 스위칭주파수는 램프의 ON/OFF에 대한 반응시간 보다 빨라야 할것이다. 만약 제어 대상이 모터이라면 해당 RPM(속도)가 스위칭주파수 설정에 중요한 변수가 될것이다.  제어대상의 상태를 체크하는 센서가 부착되면 우리는 폐루프제어를 통해 정확한 Duty Cycle를 찾는 부분이 필요할것이다.

따라서 우리의 관심은 대상의 상태변화감지와 이에 대한 스위칭 주파수 설정, 해당 Duty Cycle 계산 등이 될것이다.
 보통의 MCU/DSP에서 PWM블록이 있다면 다음과 같은 조건을 만족해야 한다.

 1. 사각형파 변조를 제공하는 칩에 내장된 타이머와 카운터의 길이를 설정
 2. PWM레지스터의 ON-TIME을 설정
 3. 범용 목적의 I/O핀인 PWM OUTPUT의 방향을 설정
 4. 타이머시작
 5. PWM컨트롤러를 가능으로설정


Blackfin에서의 PWM

PWM은 AC유도모터(ac induction motor)(ACIM), 영구자석동기모터(permanent magnet synchronous motor(PMSM)), BLDC,전기정류모터(electronically commutated motors(ECMs))등을 제어하는 3상 PWM패턴을 생성한다.

또한 PWM_CTRL의 PWM_SRMODE bit를 세팅함으로 switched reluctance motors (SRMs)을 위한 특정모드도 지원한다.



그림 1
블랙핀은 PWM 생성을 위해 6개의 UNIT으로 나누어진다.
1. PWM SHUTDOWN AND INTERRUPT CONTROL UNIT
   - /PWM_TRIP pin과 PWM_CTRL register에 의해서 다양한 PWM shutdown modes를
      제공한다.
   - Three-Phase PWM Timing Unit을 위한 정확한 reset signal과 Interrupt Control Unit
     을 위한 interrupt signals를 생성한다.
2. PWM SYNC PULSE CONTROL UNIT
  - 내부 PWM 동기화 pulse를 생성하고, 외부 PWM_SYNC pulse를 이용할 것인지를 제어
     한다.
3. THREE-PHASE PWM TIMMING UNIT
  - 3-pairs Complemented, center-based PWM signals와 PWM_SYNC signal을 생성한
     다.

4. DEAD TIME CONTROL UNIT
5. OUTPUT CONTROL UNIT
   - 6개의 PWM output signals 각각에 대해서 enabling/disabling을 할 수 있다.

6. GATE DRIVE UNIT
  - PWM_CTRL register의 PWM_POLARITY bit의 state에 근거하여 정확한 극성을 가지는
    PWM signals의 출력을 제공한다. 또한, 고주파 chopping waveform를 생성한다.

PWM Controller는 SCLK로 구동된다.
생성된 PWM patterns의 switching 주파수와 dead time은 PWM_TM과 PWM_DT
registers에 의해서 programming된다. 또한, 3개의 duty-cycle control registers
(PWM_CHA, PWM_CHB, 그리고, PWM_CHC)는 3-pairs PWM signals의 duty cycles를
직접 제어한다.


6개의 PWM output signals 각각은 PWM_SEG register의 독립적인 output enable bits에
의해서 enabled 또는 disabled될 수 있다.

16-bit read/write PWM period register(PWM_TM)는 PWM switching frequency를 제
어한다.
 PWM_TM register에 작성되는 값은 실질적으로 PWM period의 절반에 대한
fundamental time increment(tsclk) clock 증가량이다.
예를 들어서, 원하는 PWM switching frequency(f PWM )의 함수로서 요구되는 PWM_TM의 값은 다음의 수식에 의해서 얻어진다.
 PWMTM = fSCLK  / (2 * fPWM(수식 3-1)
그러므로, PWM switching period(Ts)는 다음 수식으로서 작성될 수 있다.
Ts = 2 *PWMTM * t SCLK (수식 3-2)
단, Ts = 1/ fPWM 인데 주의하자

 예를 들어서 fSCLK  = 100Mhz이고 원하는 fPWM = 10Khz 인경우 PWM_TM register에서loading될 정확한 값은 수식 3-1을 이용하여 계산하면 5000이 된다. 16진수로 1388이다.
16-bit PWM_TM register에 작성될 수 있는 가장 큰 값은 0xFFFF이고,  fSCLK  = 100Mhz 일 때, 최소 PWM switching frequency는 수식 3-1을 이용하여 계산하면 762[Hz]가 된다. 이는 PWM이 발생할수 있는 최소 스위칭 주파수이다.

예를 들어 PWM_TM register값이 4166이면  fPWM  은  120002가 되어 12Khz가 된다.

 PWM_TMregister에 0,1은 세팅할수 없다. PWM outputs 또는 PWM sync가 enabling되어 있을 때는 지정하면 안 된다

다음으로 10-bit read/write PWM_DT register는 PWM output signals 3상에 삽입되는 dead time
을 제어한다. Dead time (Td )는 다음의 수식에 의해서 PWM_DT register안에 값을 지정
한다.
Td = 2 *PWMDT * t SCLK (수식 3-3)

결국, dead time은 2t SCLK 의 단위로 programming 될 수 있다.
예를 들면,  fSCLK  = 100Mhz인 경우에는 20[ns]의 단위로 programming 될 수 있다.

PWM_DT register는 10-bit이므로 최대값은 0x3FF가 된다. 이를 수식 3-3으로 계산하면 20.5us가 나오게 된다. 식에 의하면 PWM_DT register에 0을 대입하면 Dead time이 0이 됨으로 시스템에 Short의 빌미가 될수 있기에 주의해야 한다. 물론 이를 원천 차단하는 회로가 포함되어 소프트웨어의 실수를 지원해 준다.

예를 들어 PWM_DT 가 0x0096이면 Td 는 수식 3-3의해 3[us]가 된다


왼쪽의 그림에서 노란색과 초록색의 falling과 rising의 간격이 dead time이다. PWM_CTRL register에서 PWM output polarity를 active high로 바꾸었다. 그리고,
3[us]의 dead time을 적용한 경우이다.
만일, PWM output polarity를 active low로 하면 극성이 반대가 되어서 나타난다.








그림 2


그림 3

 
그림 4
Typical PWM Outputs of Three-Phase Timing Unit
in Single-Update Mode (Active-Low Waveforms)

일단, PWM_AH에 대한 on time과 off time을 SVPWM에 의해서 계산한다. 그
리고, 이 on time과 off time에 도달하기 위한 counter 값을 찾아서 PWM_CHA에 setting
해 준다. 그리고 나서, dead time을 첨가해 주면 원하는 PWM_AH pulse를 DSP PWM
port에서 발생하게 된다.

PWM_AL은 그것에 대한 not gate로 생성되고, PWM_SYNC
signal에 맞추어서 120도 phase delay된 PWM_BH, 그리고 또 다시 120도 phase delay된
PWM_CH pulse를 생성하게 된다.

위의 그림에서 보여준 것과 같이 예를 들어서, 외부 XTAL에서 30[MHz]를 공급한 경우
에 내부 PLL을 거쳐서 150[MHz]를 만든다. 그리고, 이것을 절반한 75[MHz]로 counter를
돌리면, 현재 10[KHz]의 switching frequency를 가지므로 하나의 switching period에 총 7500개의 pulse를 생성하게 된다.

그러나, BF506F의 경우, PWM_STAT register의 PWM_PHASE bit default 값은 clear이
고, 이때 오른쪽 그림과 같이 counter의 증가 및 감소 방향이 바뀌게 되는데, 주의하자. 즉,
3상 PWM Timing Unit은 +PWMTM/2로부터 -PWMTM/2까지 2의 보수 counting을 이용
하여 감소하고, 그리고 나서, count 방향이 바뀌어서 -PWMTM/2로부터 PWMTM/2 값으
로 증가하게 된다.
PWM_TM은 double-buffered이다. 즉, PWM switching period의 절반에서의 변화는 단지,
다음 절반 주기 기간안에 효과를 줄 것이다.
또한, 12channel 2MSPS의 ADC를 가지는 BF506F의 경우, [그림 5]에서 보는 것과 같
이 각각의 channel 마다 2MSPS/12 = 166.7kHz, 즉, 6[us]의 time 구간만 있으면, sample
& hold, ADC, buffering까지 끝나고, 이어서 SVPWM 및 여타 관련 code를 동작시키고,
마지막으로 [그림 4]와 같이 PWM pulses를 생성하는 데 걸리는 총 시간은 결코,
10[kHz]보다 크지 않다.

그림 5 ADC & PWM 생성 시간과 Switching 주파수와의 관계.

즉, [그림 5]에서 보듯이 매 PWMSYNC_out이 10[kHz]마다 interrupt를 발생시키고, 그
리고, 위와 같은 일련의 과정을 수행하여 PWM pulses를 생성하는 경우에 interrupt 구간이
PWM pulses를 생성하는 일련의 과정에 비해서 상당히 짧은 시간을 요구하므로 동작하는
데 아무런 문제가 될 것이 없다.
만일, [그림 4]에서 counter의 값을 7500개가 아닌, 7500*2=15000개로 setting하였다
면, switching 주파수는 10[kHz]가 아니라 계산에 의해서 5[kHz]가 되는데 주의하기 바란
다.
또한, 일반적으로 counter의 값은 음의 정수를 사용하지 않으며, 대부분의 IGBT/FET gate
driver 특성 때문에 low active switching을 사용하지만, 이것은 DSP PWM port와 관련
된 register에서 그 극성을 바꿀 수 있다.
3개의 16-bit read/write duty cycle registers(PWM_CHA, PWM_CHB, 그리고
PWM_CHC)는 PWM_AH/AL, PWM_BH/BL, PWM_CH/CL pins에 대한 6개의 PWM
output signals의 duty cycles를 제어한다.
duty cycle registers는 fundamental time unit(t SCLK )에 대한 2의 보수 정수 개수로
programming되고, 1/2 PWM period에 대해서 high-side PWM signal에 대한 원하는
on-time을 정의한다.

각각의 duty cycle register 범위는 -PWMTM/2 - PWMDT ~ PWMTM/2 + PWMDT이
다. 정의에 의해서 결국, “0”의 값은 50% PWM duty cycle을 표현한다
PWM_CTRL안에 active low polarity를 programming 함에 의해서 PWM_DT register안
에 있는 programming 된 dead time 값을 적용하여 조정된다. 즉, programming 된 duty
cycles는 PWM_AH와 PWM_AL 양쪽의 PWM signals의 switching 순간들을 PWM_CHA
register에 의해서 조정된 순간으로부터 dead time을 합쳐서 PWM signals pair옮김으로
인해서 조정된다. 양쪽의 switching edges는 대칭 output patterns를 유지하기 위해서 동
일한 PWMDT × t SCLK 만큼 옮겨진다.

[그림 4]에서 PWM_SYNC pulse의 rising edge는 switching period의 시작을 나타내고,
그리고, PWM_SYNC의 폭은 PWM_SYNCWT register에 의해서 조정된다. 그리고,
PWM_STAT register의 PWM_PHASE bit는 동작이 PWM period의 첫 번째 절반 또는 두
번째 절반 cycle 중에서 어디에 있는지를 가리킨다.
[그림 4]에서 설명한 3상 PWM Timing Unit에 의해서 생성된 full PWM period에 대한
PWM signals의 주기적인 pulse의 active low 구간은 다음과 같이 계산될 수 있다.
 TAH = (PWMTM+ 2*(PWMCHA-PWMDT)) * tSCLK
Rangeof TAH = [0,2*PWMTM*tSCLK]

TAL = (PWMTM- 2*(PWMCHA+PWMDT)) * tSCLK
Rangeof TAH = [0,2*PWMTM*tSCLK]

그러므로, 대응하는 duty cycles는 다음수식과 같다.
 dAH = TAH/TS = 1/2 + (PWMCHA-PWMDT)/PWMTM
 dAL = TAL/TS = 1/2 - (PWMCHA+PWMDT)/PWMTM

단, [그림 4]에서 보면 알 수 있듯이 switching period TS = 2 * PWMTM인데, 주의하
자.

3상 PWM Timing Unit이 PWM output pins에 가변 duty-cycle 값들로 PWM signals를
생성하는 경우, 변조의 끝에서 0% modulation(full off mode)과 100% modulation(full on
mode)이 발생할 수 있다.

1) Full On Mode :
PWM signals의 임의의 pair를 위한 PWM이 3상 PWM Timing Unit에서 desired high
side output이 연속적인 PWM_SYNC rising edges 사이에 “on" 상태에 있을 때를 의미
한다. 여기서 ”on" 상태는 PWM_CTRL register의 PWM_POLARITY bit에 의해서 지정
된 active low 또는 active high에 대한 것임.
2) Full Off Mode :
PWM signals의 임의의 pair를 위한 PWM이 3상 PWM Timing Unit에서 desired high
side output이 연속적인 PWM_SYNC rising edges 사이에 “off" 상태에 있을 때를 의미
한다.
3) Normal Operation :
PWM signals의 임의의 pair를 위한 PWM이 연속적인 PWM_SYNC 사이에 desired
output duty cycle이 0% 또는 100%와 다른 값을 가질 때를 의미한다.

[그림 4]로부터 유추 할 수 있듯이 PWM controller는 16-bit resolution을 가진다. 그
러나, 정확성은 PWM period에 의존한다.
PWM_CHA, PWM_CHB 그리고 PWM_CHC의 동일한 값들은 PWM 주기의 양쪽 절반안에
서 주기적으로 정의한다. 결국, PWM 생성과정에서 유효 정밀도는 2 × tSCLK 즉,fSCLK = 100MHz의 경우, 20[ns]가 된다. 그러므로, duty cycle registers 중에서 어느 하나를 “1”만큼 증가시키면, 각각의 절반 주기 안에서 tSCLK만큼 관련된 PWM signals를
주기적으로 바꾸어 준다.
[표 1]은 최소 얻을 수 있는 PWM 주파수와 bit resolution을 비교한 table이다.
단, SCLK=100[MHz]이다.

표 1
[표 1]에서 Single Update mode에서 resolution bits가 8bits일 때, 얻을 수 있는 최소
PWM 주파수는 다음과 같이 계산된 것이다. 즉,
8bits는 [그림 4]의 오른쪽 그림 부분에 나와 있듯이 PWM 주기의 절반에 대한
counting bits이므로 256개의 counting number를 가질 수 있다. 그러나, 나머지 절반도 대
칭적으로 동작하므로 결국, 각각의 counting number는 SCLK 100[MHz]에서 20[ns]를 필
요하게 되므로, 총 256개의 counting을 수행하는 데 필요한 시간은 256☓20[ns]=5.12[us]
가 된다. 이것이 하나의 PWM signal을 만들 때 필요한 시간이 되므로, 주파수는
1/5.12[us]=195.3125[kHz]가 된다.
일반적으로 10[kHz]를 switching 주파수로 사용하므로 12bit resolution을 가지는 counter
를 사용하여 PWM을 생성하면 된다.


PWM sync는 PWM_TM과 PWMSYNCWT register 값들의 함수로서 내부적으로 생성될
수 있거나 외부에서 입력으로 들어올 수 있다.
이 PWM SYNC pulse의 폭은 10bit read/write PWM_SYNCWT register에 의해서
programming 될 수 있다. PWM SYNC pulse의 폭은 다음과 같이 계산된다


그림 6 PWM_SYNCWT

TPWMSYNC = tSYNC *(PWM_SYNCWT +1)

결국, pulse의 폭은tSCLK로부터 1024× tSCLK 까지이다. 즉, fSCLK = 100MHz의 경우,10[ns] ~ 10.24[us]이다. default 값은 [그림 3-7]과 같이 0x03FF이다. 그러므로, fSCLK = 100MHz의 경우, 10.24[us]이다

PWM_SYNC로부터 PWM outputs안에서 결과까지의 latency는 동기화 mode에서는 3
SCLK cycles이고, 비동기화 mode에서는 5 SCLK cycles이다

/PWM_TRIP pin의 falling edge는 순간적으로 그리고 processor clock과 비동기적으로
PWM controller의 shutdown을 제공한다. 단, PWM_CTRL register의 PWM_TRIP_DSBL
bit가 disabling되지 않은 경우.
그러나, 만일, 이전에 PWM_SYNC가 enabling되어 있다면, PWM_SYNC pulse는 계속해서
발생하고, 그로 인한 interrupt도 계속해서 발생하여 ISR이 동작한다는 데 주의하기 바란다.
또한, trip이 발생하면, dead time counters는 reset되는 데 주의하기 바란다.


Core Timer

Core timer는 주기적인 interrupts를 발생할 수 있는 programmable 32-bit interval
timer이다. 다른 peripherals와 다르게 core timer는 Blackfin core 안에 위치하며 core
clock 즉, CCLK로 동작한다.

다음은 Core Timer의 특징들을 요약 정리한 것이다.
1) 8-bit prescaler를 가진 32-bit timer.
2) CCLK로 동작.
3) 전용 high-priority interrupt channel.
4) Single-shot 또는 연속적인 동작.


다음은 Core timer에 대한 block diagram이다.

















[그림 4-1] Core Timer Block Diagram

Core timer는 임의의 chip pins와 직접적으로 상호작용하지 않는다.
우선, timer가 enabling되기 전에 TCOUNT register를 초기화해야 한다. 물론, 직접
TCOUNT register에 작성할 수도 있지만, TPERIOD register를 통하여 작성될 수도 있다.
[그림 4-2]는 Core timer Control Register TCNTL을 보여주고 있다.
[그림 4-2] TCNTL register.
TCNTL 안에 있는 TMREN bit를 setting함에 의해서 timer가 enabling되면, TCOUNT
register는 prescaler TSCALE이 만료될 때마다 한번 감소하게 된다. 즉, TSCALE +
CCLK clock cyles 1개마다 한번 감소한다. 예를 들면, TSCALE register의 값이 “0”이면,
TCOUNT register의 값은 모든 CCLK clock cycle마다 한번 감소하고, TSCALE이 “1”이
면, 모든 2개의 CCLK clock cycles마다 한번 감소한다.
TCOUNT register의 값이 “0”이 되면, interrupt가 발생하게 되고, TINT bit는 TCNTL
register안에서 set된다.
만일, TAUTORLD bit가 set되어 있다면, TCOUNT register는 TPERIOD register의 내용
을 다시 loading하고, counting을 시작한다. 그러나, 만일, TAUTORLD bit가 clear되어 있
다면, timer는 동작을 멈춘다.
또한, TMPWR=0일 때, TMREN=1이면, undefined 동작을 하는 데 주의하자.
Core timer interrupt request는 edge-sensitive이고, interrupt가 servicing되면 바로 자
동으로 hardware에 의해서 clearing된다.






예로 TPERIOD에 15000을 세팅하면 CCLK=400[MHz]이므로, 150[us]마다 Core Timer
Interrupt가 발생하게 된다

2011년 12월 18일 일요일

Flag(GPIO)-General-Purpose Ports

ADSP-BF506F인 경우에는 3개의 Port modules로 분류할 수 있다
port F/G/H 이다. 다른 ADSP-BFXXX프로세서의 GPIO는 해당 프로세서에 맞게 특화되었지만 제어레지스터는 동일하다.

1) Port F : 16 pins.
(1) PPI data signals.
(2) UART0/1 signals.
(3) SPORT0 signals
(4) SPI0 signals.
(5) CNT0(GP Counter 0) signals.
(6) PWM0 signals.
(7) GP Timer signals.
(8) 부가적인 SPI0/1 slave selects.
(9) GPIOs.
2) Port G : 16 pins.
(1) SPORT1 signals
(2) CAN signals.
(3) ACM signals.
(4) PPI signals.
(5) GP Timer signals.
(6) PWM1 signals.
(7) CNT1(GP Counter 1) signals.
(8) SPI1 signals.
(9) UART0 signals
(10) RSI signals.
(11) GPIOs.
3) Port H : 3 pins.
(1) SPORT1 signals
(2) ACM signals.
(3) SPI0/1 slave select signals.
(4) GP Timer signals
(5) GPIOs.
부가적으로 독립적인 pins로 구성된 TWI signals를 제공한다.

Port의 초기모드는 GPIO Mode이다.
만약 Peripheral기능을 사용하고 싶다면
    1. PORTx_FER의 해당 비트를 셋하여 Enable시킴
    2. PORTx_MUX로 해당 기능을 선택해 주어야 한다.
하나의 물리적인 포트는 다양한 기능의 입출력으로 사용됨으로 내부 레지스터를 통해 스위칭이 되어야 한다.

floating pin 즉, 입,출력으로 사용하지 않는 GPIO pin은 특별히, pull-up/down해 줄 필요
가 없다.

GPIO로 사용될 경우

(1) 출력으로 사용될 때 :
① SCLK에 동기
② 레지스터
     -  PORTxIO_DIR : 방향 설정(입/출력, 초기값 입력)
     - PORTFIO, PORTGIO, PORTHIO - GPIO data registers이며 쓰기동작에서 동시에 값이 변하므로 주의해야 한다.
     - PORTxIO_SET,PORTxIO_CLEAR, PORTxIO_TOGGLE - 비트 단위로 동작하며 그 결과가 위의 GPIO data registers에도 반영되며 이것을 interrupt source로 사용할 수 있다는
것이다. 이때, edge-sensitive pin이 interrupt request를 생성하는 경우에 ISR은 clear
register를 통하여 각각의 GPIO latch를 clearing함에 의해서 그 request를 인정해야 한
다는 것이다. 또한, PORTxIO register는 PORTxIO_INEN register에 의해서 enabling된 input pin의
상태도 반영해 주는 데 주의하기 바란다.


(2) 입력으로 사용될 때 :
① core와 system clocks 사이의 potential latency를 고려해야 한다. 즉, processor에
의해서 입력의 변화가 받아들여지기 위해서는 3 SCLK latency를 가진다.

② 기본적으로 모든 peripheral pins는 reset 이후에 GPIO 입력으로 setting된다. 그러
나, GPIO input drivers는 power 소비를 최소하기 위해서 disabling되어 있다는 데 주의
하자. 그러므로, digial input 또는 interrupt input으로 사용하려면, PORTxIO_INEN
register에서 enabling해 주어야 한다. 만일, enabling해 주지 않는다면, input pins에 변
화가 processor에 의해서 인식되지 않는다. GPIO input enable registers(
PORTFIO_INEN, PORTGIO_INEN, 그리고, PORTHIO_INEN)는 input으로 사용될 임의
의 GPIO에 대한 input buffers를 enable하기 위해서 사용된다. 임의의 GPIO pin의 입력
driver가 enabling되면, 그 GPIO는 더 이상 output으로 작동하지 않는다. 즉, 동일한
GPIO에 대해서 input driver와 output driver를 동시에 enabling할 수 없다.
또한, 외부 pull-up resistors를 사용해 주는 것이 좋다.

(3) Interrupt에 사용될 때 :
각각의 GPIO는 interrupt를 발생하도록 구성될 수 있다. processor는 6개의 interrupt
channels를 통하여 interrupts를 요청하는 최대 35개의 비동기 off-chip signals까지 분별
할 수 있다. 임의의 pin을 interrupt pin으로 만들기 위해서는 해당 PORTxIO_INEN
register 안에 bit가 set되어야 한다. 물론, GPIO 기능을 가지도록 PORTx_FER register
안의 function enable bit는 clear되어 있어야 한다. edge의 경우에 both edge에 대해서
도 사용할 수 있다. interrupt 입력에 대한 triggering 시점은 GPIO polarity registers와
GPIO interrupt sensitivity registers 에 의한 bit별 정의되어 있다.
또한, PORTxIO_DIR registers는 출력으로 구성되어 있을 때, 그 GPIO의 input drivers가
enable 되었다면, software가 data/set/toggle registers에 writing함에 의해서 GPIO
interrupt를 triggering할 수 있다. ISR은 request를 인정하기 위해서는 GPIO를 clearing
해야 한다.


위의 그림은 GPIO interrupt flow이다.

3개의 GPIO modules의 각각은 2개의 독립적인 interrupt channels를 제공하는데, 기능은
동일하고, interrupt A/B라고 불린다. 양쪽의 interrupt channels는 각각의 GPIOs를
none, 어느 하나, 또는 양쪽의 interrupt channels에 할당하는 것을 허락하는 자신만의
mask register를 가지고 있다. 또한, 모든 mask registers는 “0”로 reset되어 있기 때문
에 어떠한 GPIOs도 default에서는 interrupt가 할당되어 있지 않다.
임의의 GPIO interrupt는 그 interrupt를 위한 모든 unmasked GPIOs의 logical OR에 의
해서 발생한다. 예를 들어서, 만일, PF0/1이 GPIO interrupt channel A를 위해서 양쪽이
모두 unmasked되었다면, GPIO interrupt A는 PF0 또는 PF1 어느 하나에 의해서
triggering되었을 때 발생될 것이다. 그러므로, ISR은 실질적으로 interrupt를 발생한
source를 알아내기 위해서 GPIO data register를 check해야 한다.


다음은 지금까지 설명한 GPIO interrupt 처리 routine으로서 임의의 GPIO module의
interrupt A channel에 대한 interrupt flow를 설명한 것이다.






























① level-sensitive interrupt로 사용될 때 :
㉠ signal이 pin에 asserting되고, program flow가 interrupt 되는 시간 사이에 최소 4
SCLK cycles의 latency가 존재한다.
② edge-sensitive interrupt로 사용될 때 :
㉠ 총 5 SCLK latency가 필요하다.
㉡ ISR은 GPIO clear register를 통하여 해당 GPIO latch를 clearing하는 부분을 사용
해야 한다.
그 밖에도 PORTxIO_POLAR, PORTxIO_EDGE 그리고, PORTxIO_BOTH registers를 가
지고 있다. default 값은 active high level이며, single edge이다.




Dynamic Power Management(PLL..)











왼쪽의 그림은 PLL관련한 블록도이다.
CLKIN를 통해 외부클락을 받아 CCLK, SCLK를 생성한다.
CCLK는 코어 클럭을 SCLK는 시스템 클럭을 의미한다.
CCLK >= SCLK의 등식이 성립한다.
해당 제어 부부은 아래의 레지스터 리스트에서 볼수 있다.




















표1. MSEL Encodings
Signal name
MSEL[]
VCO Frequency
DF = 0                      DF = 1
0
64x
32x
1
1x
0.5x
2
2x
1x
N = 3-62
Nx
0.5Nx
63
63x
31.5x
1 MSEL DF parameter를 조정하여, CLKIN VCO로 만드는 배율을 나타내고 있다.


표 2. Core Clock Ratio

Signal Name
CSEL[]
Divider Ratio
VCO/CCLK
Example Frequency Ratio(MHz)
VCO                 CCLK
00
1
300
300
01
2
300
150
10
4
400
100
11
8
400
50

2 VCO CCLK 비율을 나타내고 있다. CSEL parameter 조정하여 Core clock 조정한다


Table 3. System Clock Ratio

Signal Name
SSEL[]
Divider Ratio
VCO/SCLK
Example Frequency Ratio(MHz)
VCO                 SCLK
0000
Reserved
N/A
N/A
0001
50
50
0010
150
75
0011
150
50
0100
200
50
0101
300
60
0110
360
60
N = 7-15
N:1
400
400/N

3 VCO SCLK의 비율을 나타내고 있다. SSEL parameter를 조정하여 System clock을 조정한다.
만일,
 SSEL을 변경한다면,SCLK가 변하면서 주변장치의 data를 잃어버릴수도 있으니 주의하시오.















 -  PLL output clock SCLK CCLK로 나눈다
 -  PLL_DIV parameter 변경하여, CCLK SCLK frequency 변경 있다













PLL control 하는 operation이다
- 여러 register 값을 변경하여 PLL 동작을 제어한다.

 
- PLL processor operating mode 지시한다









-  Processor PLL_LOCKED bit set할떄까지의 SCLK를 정의한다.
-  Lock counter SCLK 1cycle 1 증가한다
-  Lock counter PLL_LOCKCNT register 정의된 값까지 증가하면, PLL_LOCKED bit setting된다.
















아래에는 간단 pll 세팅 예제 프로그램이다.


 void init_pll()
{
     unsigned int imask;
    *pPLL_CTL = SET_MSEL(16); /* Write new value for (400MHz)to PLL_CTL.*/
    ssync();
    *pVR_CTL = /*--- REPROGRAM VR_CTL ---*/
                          0x00B0 | /* Bits #7,6 set by default */
                          0x3000 | /* FREQ=00 indicates hibernate. FREQ=11 indicates non-Hibernate */
                          0;
     imask = cli(); /* VR_CTL Re-programming Sequence. */
     idle(); /* Core is idle'ed to allow the PPL to re-lock. */
     sti( imask );
/*----- REPROGRAM PLL_DIV ------*/
     *pPLL_DIV = SET_SSEL(4); /* PLL_DIV can be re-programmed on the fly.*/
   /* No core idling required. */
     ssync();
}