LM3S8962의 I2C 인터페이스에 대하여 알아본다.

우선 Luminary 홈페이지에서 LM3S8962 Datasheet를 다운 받는다.
Link : http://www.luminarymicro.com/products/LM3S8962.html#Datasheet

위의 링크에서 datasheet 및 각종 App Note, Software tool 등을 다운 받을 수 있다.

Datasheet를 토대로 LM3S8962 I2C 인터페이스에 대하여 분석해 보도록 한다.



Inter-Integrated Circuit (I2C) Interface
I2C 버스는 two-wire를 통해 양방향 데이터 통신을 제공하고 serial memory, networking devices, LCDs, tone generators 등과 같은 외부 디바이스와 interface 된다. i2C 버스는 또한 system testing과 제품 개발과 제조를 위한 diagnostic 목적으로 사용된다. LM3S8962 마이크로컨트롤러는 하나의 I2C 모듈을 가지고 있고 버스에서 다른 I2C 내부 동작을 가능하게 된다.

Stellaris I2C 인터페이스는 다음과 특징을 가지고 있다.

I2C 버스에서 Device는 master 나 slave로 지정된다.
    - master나 slave로서 데이터 송수신을 제공한다. 
    - master와 slave 동작은 동시에 동작한다
4개의 I2C 모드
    - Master transmit
    - Master receive
    - Slave transmit
    - Slave receive
■ 두개의 전송 속도 : Standard(100 Kbps), Fast(400 Kbps)
Master와 Slave interrupt generation
   - Master는 transmit 또는 receive 동작 완료할 때 interrupt를 발생한다. 
   - Slave는 master에 의해 데이터가 보내졌거나 요청되었을 때 인터럽트가 발생한다.
Master with arbitration and clock synchronization, multimaster support, and 7-bit addressing mode


1. Block Diagram



2. Functional Description
I2C 모듈은 독립된 peripherals로 동작하는 master와 slave로 구성된다. SDA와 SCL 핀은 양방햔 open-drain pads와 연결되어야만 한다. 전형적인 I2C 버스 configuration 은 아래 그림과 같다.

2.1 I2C Bus Functional Overview
I2C 버스는 단지 2개의 신호 SDA, SCL 만을 사용한다. Stellaris microcontroller에서는 I2CSDA, I2CSCL이라고 불린다.
SDA는 양방향 시리얼 데이터 라인이고 SCL은 양방향 시리얼 클럭라인이다. 버스는 두 신호 모두 High일때 idle 상태이다.

I2C 머스에서  모든 transaction은 9비트이다. 8비트의 데이터과 단일 응답 비트로 구성된다. 전송마다 byte의 수는 제한이 없지만, 각 byte는 응답비트가 따라와야 하며, 데이터는 MSB부터 전송되어야 한다. receiver가 another complete byte를 수신할 수 없을 때, receiver는 SCL 라인을 low 상태로 만들고, transmitter를 강제로 wati state 로 만든다.  receiver가 clock SCL을 방출할 때 데이터 전송은 계속된다.

2.1.1 START and STOP Conditions
I2C 버스의 프로토콜은 transaction을 start하고 end하기 위한 두가지 상태를 정의한다. : START와 STOP이다. SCL이 High인 동안 SDA 라인이 High에서 Low로 바뀌면 START 조건으로 정의 된다. 그리고 SCL 이 High인 동안 SDA 라인에서 Low에서 High로 바뀌면 STOP 조건으로 정의된다. 버스는 START 조건 후에 busy가 되고, STOP 조건 후에는 free가 된다.

2.1.2 Data Format with 7-Bit Address
데이터 전송은 아래 그림에서 보여지는 format을 따른다. START 조건 후에, slave address는 보내진다. 이 address는 7-bit의 길이 다음에 data의 방향을 비트인 여덟번째 비트가 따라온다(R/S bit in the I2CMSA register). zero는 전송동작(send)를 나타내고, 1은 데이타를 위한 요청(receive)을 나타낸다. 데이터 전송은 항상 master에 의해 발생하는 STOP 조건으로 종료된다.  그러나 master는 repeated START 조건을 발생함으로써 버스에서 다른 device와 같이 통신을 초기화 할 수 있다. STOP 조건의 발생하지 않고도 다른 slave를 addressing 할 수도 있다. 송/수신 format의 여러 조합은 단일 전송안에 가능하게 한다.

처음 byte의 첫 7 비트는 slave address를 구성한다. 여덟번째 비트는 message의 방향을 결정한다. 첫번째 byte의 R/S position에서 0은 master가 선택된 slave에 데이터를 write(send)할 것을 의미한다. 1은 master가 slave로부터 데이터를 수신할 것이라는 것을 의미한다.

2.1.3 Data Validity
SDA 라인에서의 데이터는 clock의 high 주기 동안 안정적이어야만 한다. 그리고 데이터 라인은 오로지 SCL이 Low일 때만 변하게 된다.

2.1.4 Acknowledge
모든 bus transaction은 master에서 발생되는 요구된 응답 클럭 사이클을 가지고 있다. 응답 사이클 동안 전송하는 쪽(which can be the master or slave)은 SDA line을 내본낸다. transaction을 응답하기 위해 수신하는 쪽은 응답 클럭 사이클 동안 SDA를 pull down해야 한다. 응답 사이클 동안 수신하는 쪽에 의해 보내지는 데이터는 data validity 요구사항을 따라야만 한다.

slave receiver가 slave address를 응답하지 못할 때, SDA는 slave에 의해 High로 남아 있어야만 한다. 그래야 master는 STOP 조건을 발생할 수있고 현재 전송을 취소할 수 있다. 만약 master device가 전송하는 동안 receiver로서 동작하고 있다면, 그것은 slave에 의해 만들어진 각각의 전송에 응답하기 위한 책임을 가질 수 있다. master가 전송에서 byte 수를 제어하기 때문에, 그것은 마지막 data byte에서 응답을 발생하지 않음으로서 slave transmitter에게 데이터의 끝이라는 신호를 준다. slave transmitter는 그때 master에게 STOP 또는  repeated START 조건을 발생하도록 허락하기 위해 SDA를 release해야 한다.

2.1.5 Arbitration
master는 bus가 idle상태라면 전송을 시작할 수 도 있다. START 조건의 최소 hold time을 가지고 START 조건을 발생시키는 것을 두 개 이상의 master에서 가능하다. 이 경우에 arbitration scheme은 SCL이 High인 동안 SDA 라인에서 이루어진다. arbitration 동안, 다른 master가 0을 전송하는 동안 SDA에서 '1'이 되도록 경쟁하는 master device 중 첫번째는 데이터의 출력 상태를 switch off 할 것이고 bus가 다시 idle 상태가 될때 까지 물러나 있을 것이다.

Arbitration은 여러개의 비트를 발생할 수 있다. 그것의 첫번째 stage는 address 비트의 비교이다, 만약 양쪽 master 모두 같은 device를 접근하려고 시도하면, arbitration은 data bit의 비교를 계속한다.



2.2 Available Speed Modes
I2C clock rate는 CLK_PRD, TIMER_PRD, SCL_LP, SCL_HP parameter에 의해 결정된다.

여기서 :
CLK_PRD : system clock period
SCL_LP : SCL의 low phase(fixed at 6)
SCL_LP : SCL의 high phase(fixed at 4)
TIMER_PRD : I2C Master Timer Period (I2CMTPR) register에서 프로그램된 값

I2C clock 주기는 다음 식으로 계산된다.
SCL_PERIOD = 2*(1 + TIMER_PRD)*(SCL_LP + SCL_HP)*CLK_PRD

예를들어,
CLK_PRD = 50 ns
TIMER_PRD = 2
SCL_LP=6
SCL_HP=4
yields a SCL frequency of:
1/T = 333 Khz

아래 테이블은 타이머 주기, 시스템 클럭, 스피드 모드의 예시를 보여준다. (Standard or Fast).



2.3 Interrupts
아래 조건들이 관찰되었을 때 I2C는 인터럽트를 발생할 수 있다.

■ Master transaction completed
■ Master transaction error
■ Slave transaction received
■ Slave transaction requested

I2C master와 I2C slave 모듈은 분리된 interrupt signal을 가지고 있다. 양 쪽 모듈이 여러개의 조건에 의한 인터럽트를 발생할 수 있는 동안 단지 하나의 인터럽트 신호가 interrupt controller로 보내진다.

2.3.1 I2C Master Interrupts
I2C master 모듈은 transaction이 완료되거나, error가 transaction 동안 발생했을 때, 인터럽트를 발생한다. I2C master 인터럽트를 enable하기 위해, 소프트웨어는 I2C Master Interrupt Mask (I2CMIMR) register에 '1'을 write해야 한다. 인터럽트 조건이 발생했을 때, 소프트웨어는 I2C Master Control/Status (I2CMCS) register에서 ERROR 비트를 확인해야 한다. 이것은 error가 마지막 transaction 동안 발생하지 않았다는 것을 증명하기 위해서이다. error 조건은 마지막 transaction이 slave에 의해 응답하지 않았다면 asserted 된다. 또한 master가 다른 master로 arbitration을 잃었기 때문에 bus의 ownership을 포기하도록 강제되었을 경우에도 error 조건은 asserted 된다.  error가 감지되지 않았다면, application은 전송을 게속할 수 있다. 인터럽트는 I2C Master Interrupt Clear (I2CMICR) register에 '1'을write 함으로써 clear 된다.
applicaiton이 인터럽트의 사용을 요구하지 않는다면, raw interurpt status는 항상 I2C Master Raw Interrupt Status (I2CMRIS) register를 통해 확인할 수 있다

2.3.2 I2C Slave Interrupts
slave 모듈은 데이터가 수신되었거나 요청되었을 때 인터럽트를 발생할 수 있다. 이 인터럽트는 I2C Slave Interrupt Mask (I2CSIMR) register에서 DATAIM 비트에 '1'을 write함으로서 enable 된다. 소프트웨어는 모듈이 I2C Slave Data (I2CSDR) register로부터 데이터를 write(transmit) 또는 read(receive) 해야만 하는지를 결정한다. 이것은 I2C Slave Control/Status (I2CSCSR) register의 RREQ, TREQ 비트를 확인함으로써 이루어진다. 만약 slave 모듈이 receive 모드에 있고 전송의 첫번째 byte가 수신되었다면, FBR 비트는 RREQ와 함께 set 된다. 인터럽트는 I2C Slave Interrupt Clear (I2CSICR) register에서 DATAIC 비트에 1dmf write함으로써 clear된다.

만약 application에서 인터럽트의 사용을 요구하지 않는다면, raw interrupt status는 항상 I2C Slave Raw Interrupt Status (I2CSRIS) register를 통해 확인할 수 있다.

2.4 Loopback Operation
I2C 모듈은 진단 및 debug 작업을 위해 내부 loopback 모드로 바뀔 수 있다. 이것은 I2C Master Configuration I2CMCR) register에서 LPBK 비트를 셋팅함으로써 이루어진다. loopback 모드에서 SDA, SCL 신호는 함께 묶인다.

2.5 Command Sequence Flow Charts
이 setcion은 master나 slave 모두 양쪽에서 여러개의 I2C 전송 타입을 수행하기 위해 요구되는 단계를 자세히 설명한다.

2.5.1 I2C Master Command Sequences
아래의 그림은 I2C master에서 사용할 수 있는 command sequence를 나타낸다.






2.5.2 I2C Slave Command Sequences
아래 그림은 I2C slave에서 사용할 수 있는 command sequence를 나타낸다.



3. Initialization and Configuration
아래의 예시는 master에서 단일 byte를 전송하기 위해 I2C module을 configure하는 방법을 보여준다.
이것은 system clock이 20MHZ라고 가정한다.

(1) System Control 모듈에서 RCGC1 레지스터에 0x0000.1000의 값을 writing함으로써 I2C clock을 enable한다.

(2) System Control 모듈에서 RCGC2 레지스터를 통해 적절한 GPIO의 clock을 enable 한다.

(3) GPIO 모듈에서, GPIOAFSEL 레지스터를 사용함으로써 alternate function을 위한 적절한 pin을 enable 한다.

(4) I2CMCR 레지스터에 0x0000.0020의 값을 writing함으로써 I2C Master를 초기화 한다.

(5) 정확한 값을 I2CMTPR 레지스터에 writing함으로써 희망하는 SCL clock speed를 100 Kbps로 설정한다. 
     I2CMTPR 레지스터에 쓰여진 값은 하나의 SCL clock 주기에서 시스템 클럭 주기의 수를 나타낸다. TPR 값은 다음
    수식에 의해 결정된다.

    TPR = (System Clock / (2 * (SCL_LP + SCL_HP) * SCL_CLK)) - 1;
    TPR = (20MHz / (2 * (6 + 4) * 100000)) - 1;
    TPR = 9
 
    I2CMTPR 레지스터에 0x0000.0009의값을 write 한다. 

(6) master의 slave address를 명시하고 다음 동작은 I2CMSA 레지스터에 0x0000.0076의 값을 write함으로써 Send 될
    것이라고 명시한다.   이것은 0x3B로 slave address를 설정한다.

(7) 희망하는 데이터를 I2CMDR에 writing함으로써 데이터 레지스터에서 보내지기 위한 데이터를 위치시킨다.

(8) I2CMCS 레지스터에 0x0000.0007 의 값을 writing함으로써 Master로부터 Slave로 데이터의 단일 byte 전송을
    초기화
한다.

(9) I2CMCS 레지스터의 BUSBSY비트가 clear 될때까지 polling함으로써 전송이 완료될 때까지 기다린다.


4. Register Map
아래의 테이블은 I2C 레지스트터를 list한다. 모든 address는 I2C base address와 관련되어 주어진다.

■ I2C Master 0: 0x4002.0000
■ I2C Slave 0: 0x4002.0800




5. API Functions



I2CMasterInitExpClk - I2C Master Block을 초기화한다.
master를 위한 bus speed를 설정하고, I2C Master block을 enable 한다.
        bFast : true -> transfer data at 400kbps                                            
        bFast : otherwise -> transfer data at 100kbps


I2CMasterEnable - I2C Master block를 enable한다.

I2CMasterDisable - I2C master  block를 disable 한다.

I2CMasterSlaveAddrSet - transction을 초기화할 때 bus에서 I2C master를 위치시킬 address를 설정한다.
        bReceive : true -> I2C Master가 slave로부터 read하도록 초기화 
        bReceive : otherwise -> I2C Master가 slave로 write하도록 초기화

I2CMasterDataPut - I2C Master로부터 1 byte를 전송한다.
이 함수는 I2C Master Data Register로 제공된 데이터를 넣게된다.

I2CMasterDataGet - I2C Master로 보내진 1 byte를 수신한다.
이 함수는 I2C Master Data Register로부터 1byte data를 read한다.

I2CMasterControl - I2C Master module의 상태를 제어한다.
이 함수는 Master module send/receive 동작의 상태를 제어하기 위해 사용된다.

I2CMasterBusy - I2C Master가 busy인지 아닌지를 나타낸다.
이 함수는 I2C Master가 data를 전송/수신 중 인지 여부를 나타낸다.

I2CMasterBusy - I2C bus 가  busy인지 아닌지를 나타낸다.
이 함수는  I2C bus의  busy여부를 return한다. multi-master 환경에서 다른 master 가 현재 bus에서 사용되는지를 결정하기 위해 사용된다.

I2CMasterErr - I2C Master module의 errt 상태를 얻어온다.
이 함수는 Master module send/receive 동작의 error 상태를 얻어오는 데 사용한다.

I2CMasterIntEnable - I2C Master interrupt suorce를  enable한다.

I2CMasterIntDisable - I2C Master interrupt source를 disable 한다.

I2CMasterIntStatus - 현재 I2C Master interrupt 상태를 얻어온다.
processor를 반영하도록 허락된 raw interrupt 상태나 interrupt 상태가 return 될 수 있다.
        bMasked : false -> raw interrupt status가 요청됨.
        bMasteed : true -> interrupt status가 요청됨.

I2CMasterIntClear - I2C Master interrupt source를 clear한다.
I2C Master interrupt source가 clear되고 더이상 assert 되지 않는다. 이것은 exit 후에 즉시 다시 호출되도록 하기위해 interrupt handler 내에서 수행되어야 한다.



I2CSlaveInit - I2C slave block을 초기화한다.
I2C block을 성공적으로 초기화하면, 이 함수는 slave address를 설정하고, I2C slave block을 enable하게 된다.
ucSlaveAddr은 I2C master에 의해 보내진 slave address와 비교될 값이다.

I2CSlaveEnable - I2C Slave block 을 enable 한다.

I2CSlaveDisable - I2C Slave block을 disable 한다.

I2CSlaveStatus - I2C Slave module 상태를 가져온다.
이 함수는 master 로부터 요청된 동작을 return 한다.
    I2C_SLAVE_ACT_NONE : I2C Slave modue 요청된 어떤 동작도 없다.
    I2C_SLAVE_ACT_RREQ : I2C master가 I2C Slave module로 데이터를 보냈다.
    I2C_SLAVE_ACT_TREQ : I2C master가 I2C Slave module이 data를 보내도록 요청했다.
    I2C_SLAVE_ACT_RREQ_FBR : I2C master가 I2C slave에게 data를 보내고, slave 자신의 address를 따라 첫번째 
                                                byte가 수신되었다. 

I2CSlaveDataGet - I2C slave로 보내진 1 byte를 수신한다.
이 함수는 I2C Slave Data Register로부터 1 byte의 data를 읽는다.

I2CSlaveDataPut - I2C Slave로부터 1 byte을 전송한다.
이 함수는 I2C Slave Data Register로 제공된 data를 넣는다.


I2CSlaveIntEnable - I2C Slave interrupt source를 enable한다.

I2CSlaveIntDisable - I2C Salve interrupt source를 disable한다.

I2CSlaveIntStatus - 현재 I2C Slave interrupt 상태를 얻어온다.
processor를 반영하도록 허락된 raw interrupt 상태 또는 interrupt 상태가 return될 수 있다.
        bMasked : false -> raw interrupt 상태가 요청됨.
        bMasked : true -> interrupt 상태가 요청됨.

I2CSlaveIntClear - I2C Slave interrupt source를 clear한다.
I2C Slave interrupt source는 clear되고 더이상 assert되지 않는다. 이것은 exit 후에 즉시 다시 호출되게 하기 위해 interrupt handler 내에서 수행되어야 한다.

I2CIntRegister - I2C module을 위해 interrupt handler를 등록한다.
이것은 I2C 인터럽트가 발생했을 때 호출될 handler를 설정한다.

I2CIntUnregister - I2C module을 위한 interrupt handler를 등록해제한다.
이 함수는 I2C 인터럽트가 발생했을 때 호출될 handler를 clear할 것이다. interrupt handler에서 interrupt를 mask off하므로 더이상 호출되지 않을 것이다.






Posted by eoseontaek

LM3S8962의 Timer에 대해서 알아본다.

우선 예제코드를 다운 받는다.
Link  : http://www.zlgmcu.com/luminary/exploitation_guide.asp


위의 링크된 사이트에서 timer 관련 파일을 모두 다운 받는다.
timer 관련 문서
LM3SLib_Timer.pdf

timer 관련 예제 코드
LM3SLib_Timer_16_CapCount.zip
LM3SLib_Timer_16_CapTime.zip
LM3SLib_Timer_16_OneShot.zip
LM3SLib_Timer_16_Periodic.zip
LM3SLib_Timer_16_PWM.zip
LM3SLib_Timer_32_OneShot.zip
LM3SLib_Timer_32_Periodic.zip
LM3SLib_Timer_32_RTC.zip
LM3SLib_Timer_APP_Buzzer.zip
LM3SLib_Timer_APP_Music.zip

제1장 General-Purpose Timers



1.1 Timer의 일반적인 특성
 Programmable timers는 Timer input pins으로 drive 하는 외부 이베트를 count하고 시간을 재기위해 사용할 수 있다. Stellaris General-Purpose Timer Module(GPTM)은 4개의 GPTM Block(Timer0, Timer1, Timer2, Timer3)을 가지고 있다. 각 GPTM block은 독립적으로 타이머와 이벤트 카운터로 동작하도록 설정하거나,  하나의 32비트 타이머와 하나의 32비트 Real-Time Clock(RTC)로 동작하도록 설정할 수  있는 2개의 16비트 타이머/카운터(TimerA, TimerB)를 제공한다. 

게다가 타이머는 analog-to-digital conversion(ADC)로 사용할 수 있다. 

GPT Module은 Stellaris microcontroller에서 하나의 timing resource 를 사용할 수 있다. 다른 timer resource는 System Timer(SysTick)과 PWM Module에서 PWM timer를 가지고 있다.

GPTM은 다음과 같은 특징을 가지고 있다.

4개의 GPTM은 두개의 16비트 타이머를 제공한다. 각각은 독립적으로 동작을 설정할 수 있다.
    – As a single 32-bit timer
    – As one 32-bit Real-Time Clock (RTC) to event capture
    – For Pulse Width Modulation (PWM)
    – To trigger analog-to-digital conversions

32비트 타이머 모드
    – Programmable one-shot timer
    – Programmable periodic timer
    – Real-Time Clock when using an external 32.768-KHz clock as the input
    – Software-controlled event stalling (excluding RTC mode)
    – ADC event trigger

16비트 타이머 모드
    – General-purpose timer function with an 8-bit prescaler (for one-shot and periodic modes only)
    – Programmable one-shot timer
    – Programmable periodic timer
    – User-enabled stalling when the controller asserts CPU Halt flag during debug
    – ADC event trigger

16비트 입력 캡쳐 모드
    – Input edge count capture
    – Input edge time capture

16비트 PWM 모드
    – Simple PWM mode with software-programmable output inversion of the PWM signal


Block Diagram
Note : 사용가능한 CCP 핀은 Stellaris device에 의존적이다.


사용가능한 CCP 핀은 다음과 같다.



1.2 Timer 기능 설명
각 GPTM block의 main component는 두개의 free-running 16비트 up/down 카운터, 두개의 16비트 match 레지스터, 두개의 prescaler match 레지스터, 두개의 16비트 load/initialization 레지스터, 그리고 관련 control function이다. 각 GPTM의 정확한 기능은 소프트웨어로 제어되고 레지스터 인터페이스를 통해 설정된다.

소프트웨어는 GPTM Configuration (GPTMCFG) register, GPTM TimerA Mode (GPTMTAMR) register, GPTM TimerB Mode (GPTMTBMR)를 사용하여 GPTM을 설정한다. 32비트 모드에서, 타이머는 오로지 32비트 타이머로만 동작할 수 있다. 하지만 16비트 모드에서는, GPTM은 16비트 모드의 조합을 통해 설정된 두개의 16비트 타이머로 동작할 수 있다. 

GPTM Reset Conditions
GPTM 모듈이 reset 된 후에, 모듈은 inactive 상태이고 모든 control 레지스터는 cleared 되거나 그들의 default 상태가 된다. 
Counters TimerA and TimerB는 0xFFFF로 초괴화 된다. 
    the GPTM TimerA Interval Load (GPTMTAILR) register 
    the GPTM TimerB Interval Load (GPTMTBILR) register
prescale  counter는 0x00으로 초괴화된다.
    the GPTM TimerA Prescale (GPTMTAPR) register
    the GPTM TimerB Prescale (GPTMTBPR) register

32-Bit Timer Operating Modes
GPTM은 GPTM Configuration(GPTMCFG) 레지스터에 0(One-Shot/Periodic 32-bit timer mode) 또는 1(RTC mode)을 Writing 함으로써 동작한다. 어느쪽 설정이든 정확한 GPTM 레지스터들은 pseudo 32-bit 레지스터를 형성하기 위해 연결된다. 이 레지스터드들은 다음과 같다.

    ■ GPTM TimerA Interval Load (GPTMTAILR) register [15:0]
    ■ GPTM TimerB Interval Load (GPTMTBILR) register [15:0]
    ■ GPTM TimerA (GPTMTAR) register [15:0]
    ■ GPTM TimerB (GPTMTBR) register [15:0]

32비트 모드에서, GPTM은 GPTMTAILR에 32비트 wrtie access 하는 것은  GPTMTAILR과 GPTMTBILR 양쪽으로 write access하는 것으로 바뀌게 된다. 이러한 write 동작을 위한 결과적인 word ordering 은 다음과 같다.
    GPTMTBILR[15:0]:GPTMTAILR[15:0]
GPTMTAR에 read access 하는 것도 유사하다, 리턴 값은 다음과 같다.
    GPTMTBR[15:0]:GPTMTAR[15:0]


[32-Bit One-Shot/Periodic Timer Mode]
  - TimerA와 TimerB 레지스터에 연결된 버전은 32비트 down-counter로서 설정된다. 
  - one-shot과 periodic 모드의 선택은 GPTM TimerA Mode(GPTMTAMR) 레지스터의 TAMR field에 쓰여지는
     값으로 결정된다.
  - GPTM TimerB Mode (GPTMTBMR) register에 wrtie 할 필요는 없다.
  - 소프트웨어에서 GPTM Control(GPTMCTL) 레지스터의 TAEN 비트를 write할때, 타이머는 preloaded value로부터
     counting down 한다. 
  - 0x0000.0000 상태가 되었을때, 타이머는 다음 cycle에 연결된 GPTMTAILR로부터 start value를 reload 한다.
  - One-shot 타이머로 설정되어 있다면, 타이머는 counting을 멈추고 GPTMCTL레지스터의 TAEN 비트를 clear한다.
  - periodic 타이머고 설정되어 있다면, counting을 계속한다.

  - 카운트 값을 reloading 하는 것 외에 GPTM은 0x0000.0000 상태가 되었을 때 interrupt와 trigger를 발생한다. 
  - GPTM은 GPTM Raw Interrupt Status(GPTMRIS) 레지스터의 TATORIS bit를 set하고 GPTM Interrupt Clear
    (GPTMICR) 레지스터를 writing함으로써 clear 할때까지 hold 한다.
  - GPTM Interrupt Mask(GPTIMR)레지스터에서 time-out interrupt가 enable되면 GPTM은GPTM Masked Interrupt
    Status(GPTMMIS)레지스터에서 TATOMIS비트를 set 한다.
  - ADC trigger는 GPTMCTL에서 TAOTE 비트를 setting 함으로써 enable 된다.

  - counter가 running 하는 동안 소프트웨어가 GPTMTAILR 레지스터를 reload 하면, counter는 다음 clock cycle에
    새로운 value을 load 한고 새로운 value로부터 conuting을 계속한다.

  - GPTMCTL 레지스터의  TASTALL비트가 asserted 되면 타이머는 signal이 deasserted 될때까지 freeze 된다.

[32-Bit Real-Time Clock Timer Mode]
  - RTC 모드에서 TimerA와 TimerB  레지스터에 연결된 버전은 32-bit up-counter로서 설정된다.
  - RTC 모드가 처음으로 선택되었을 때, 카운터는 0x0000.0001 값으로 load된다. 이후의 load value는 controller에
    의해 GPTM TimerA Match(GPTMTAMATCHR) 레지스터에 write 되어야만 한다. 
 
  - CCP0, CCP2, CCP4 핀의 input clock은 RTC  모드에서 32.768KHz가 요구된다.
  - clock signal은 1Hz 아래로 나누어지며 32비트 counter의 입력으로 전달된다.

  - 소프트웨어가 GPTMCTL 레지스터의 TAEN 비트를  write 할 때, counter는 0x0000.0001의 preload 값으로부터
    counting up을 시작한다.
  - 현재 count value가 GPTMMATCHR 레지스터에서 preloaded value로 match 되었을 때 , 0x0000.0000으로 
    roll over 히고 hardware reset이 되거나 소프트웨어에 의해 clear 될때까지 counting을 계속한다.
  - match 되었을 때 GPTM은 GPTMRIS의 RTCIS 비트를 assert 한다. GPTIMR에서 RTC  인터럽트가 enable 되었을
   때, GPTMISR의 RTCMIS 비트를 set하고 controller interrupt가 발생한다.
  - 상태 플래그는 GPTMICR에서 RTCCINT 비트를 writing 함으로써 clear 된다.
 


16-Bit Timer Operating Modes
GPTM은 GPTM Configuration(GPTMCFG) 레지스터에 0x4를 writing 함으로써 global 16-bit 모드가 된다.  TimerA와 TimerB는 동일하게 동작한다.

[16-Bit One-Shot/Periodic Timer Mode]
  - 16비트 one-shot와 periodic timer 모드에서, 타이머는 24비트로 카운트 범위를 확장하기 위한 선택적인 8비트
    prescaler를 갖는 16비트 down-counter로 설정된다.  
  - one-shot과 periodic 모드의 선택은 GPTMTnMR 레지스터의 TnMR field에 written 하므로서 결정된다. 
  - 선택가능한 prescaler는 GPTM Timern Prescale(GPTMTnPR) 레지스터로 load된다.
  
  - 아래 Table은 prescaler를 사용할 때, 16비트 free-running 타이머를 위한 여러 설정을 보여준다. 모든 값은
    Tc=20ns의 clock period를 갖는 50MHz에서 동작한다고 가정한다.


[16-Bit Input Edge Count Mode]
Note
: rising-edge detection을 위해, input signal은 rising-edge가 발생한 다음 적어도 두개의 systel clock periods
         동안 High 상태를 유지해야 만 한다. 유사하게 falling-edge detection을 위해, input signal은 falling-edge
         으로 적어도 두개의 system clock periods 동안 Low 상태를 유지해야 한다. 이런 이유로 edeg-detection을 위한
          maximum input frequencysms system frequency의 1/4 이 된다.

Note : Prescaler는 16-Bit Input Edge Count 모드에서 사용할 수 없다.
 
  - Edge Count 모드에서 타이머는 riding edge, falling edge, both 이렇게 3개의 이벤트 type을 captureing 할 수 있는 
    down-counter로서 설정된다.
  - Edge count 모드에서 타이머를 사용하기 위해, GPTMRnMR 레지스터의 TnCMR비트는 0으로 set 되어야 한다.
  - 타이머 카운터의 edge type은 GPTMCTL 레지스터의 TnEVENT fields에 의해 결정된다.
  - 초기화 동안, GPTM Timern Match(GPTMTnMATCHR) 레지스터는 GPTMTnILR 레지스터의 값과
    GPTMTnMATCHR 레지스터의 차이가 카운트 되어야만 edge event의 수가 같아질 수 있게 설정된다. 
 
  - 소프트웨어가 GPTM Control(GPTMCTL) 레지스터의 TnEN 비트를 write 할 때, 타이머는 envent capture로
    enable 된다.
  - CCP 핀에서 각 input event는  event count가 GPTMTnMATCHR과 match 될때까지 1씩 감소한다.
  - count가 match 될 때 GPTM은 GPTMRIS 레지스터의 CnRIS bit를 assert 한다.
  - 카운터는 GPTMTnILR에서 value를 이용해 reload 되고, GPTMCTL 레지스터의 TnEN 비트를 자동으로
    clear 함으로써 stop 한다.
  - event count가 완료되었을 때 모든 event는 TnEN이 소프트웨어적으로 re-enabled 될 때 까지 무시된다.
 



[16-Bit Input Edge Time Mode]
Note : rising-edge detection을 위해, input signal은 rising-edge가 발생한 다음 적어도 두개의 systel clock periods
         동안 High 상태를 유지해야 만 한다. 유사하게 falling-edge detection을 위해, input signal은 falling-edge
         으로 적어도 두개의 system clock periods 동안 Low 상태를 유지해야 한다. 이런 이유로 edeg-detection을 위한
          maximum input frequencysms system frequency의 1/4 이 된다.

Note : Prescaler는 16-Bit Input Edge Time 모드에서 사용할 수 없다.
 
  - Edge Time 모드에서 타이머는 GPTMTnILR 레지스터에서 loaded 된 값은 초기값으로 갖는 free-running
    down-counter로서 설정된다.
  - 이 모드는 rising edge, falling edge event capture 로 동작하지만 both로는 동작하지 않는다.
  - GPTMTnMR 레지스터의 TnCMR 비트를 setting함으로써 Edge Time  모드로 설정되고, event type은
    GPTMCnTL 레지스터의 TnEVENT field에 의해 결정된다.

  - 소프트웨어가 GPTMCTL 레지스터의 TnEN 비트를 write 할 때, 타이머는 event capture로 동작한다.
  - 선택된 input event가 detect되었을 때, 현재 Tn counter 값은 GPTMTnR 레지스터에서 capture 되고, controller에
    의해 read되어 사용할 수 있게 된다.
  - 그때 GPTM은 CnERIS 비트를 assert 한다 

  - event가 capture 된 후에 타이머는 counting을 stop 하지 않는다.
  - TnEN 비트가 clear될때 까지 count를 계속한다.
  - 타이머가 0x0000 상태가 되었을 때, GPTMnILR 레지스터로부터 값을 reloaded 한다.



[16-Bit PWM Mode]
Note
: Prescaler는 16-Bit PWM 모드에서 사용할 수 없다.

  - GPTM은 간단한 PWM generation 모드를 제공한다.
  - PWM 모드에서, 타이머는 GPTMTnILR에 의해 정의돈 start value를 갖는 down-counter로서 설정된다.
  - PWM 모드는 GPTMTnMR 레지스터의 TnAMS bit를 0x01, TnCMR bit를 0x0, TnMR field를 0x2로 setting
    함으로써  enable 된다.
 
  - 소프트웨어가 GPTMCTL 레지스터의 TnEN 비트를 write 할 때, 카운터는 0x0000이 될 때까지 counting down을
     시작한다.
  - 다음 counter cycle에서, 카운터는 GPTMTnILR로부터 start value를 reload하고 GPTMCTL레지스터의 TnEN
    비트를 소프트웨어 clear 함으로써 disable 될때까지 counting을 계속한다.
  - 어떤 인터럽트나 상태 비트도 PWM 모드에서는 assert 될 수 없다.

  - output PWM signal은 카운터가 GPTMTnILR 레지스트의 값일 때 assert 하고, 카운터가 GPTM Timern Match
     Register(GPTMnMATCHR)과 값이 같은 때 deassert 된다.
  - 소프트웨어는 GPTMCTL 레지스터의 TnPWML 비트를 setting 함으로써 output PWN signal을 반전 할 수 있다.




1.3 Timer 라이브러리 함수
Timer 모듈을 사용하기 위해서는 먼저 timer를 Enable 해야 한다. Enable 방법은 다음과 같다.

#define     SysCtlPeriEnable     SysCtlPeripheralEnable

SysCtlPeriEnable(SYSCTL_PERIPH_TIMERn);  
                              // 末尾的n取0、1、2或3

RTC, Input Edge Count, Input Edge Time, PWM 함수를 사용하기 위해서는  CCP의 입력 또는 출력 신호에 해당하는 핀을 사용해야 한다. 따라서 CCP에 해당하는 GPIO  포트를 구성해야 한다.

#define   CCP2_PERIPH   SYSCTL_PERIPH_GPIOD
#define   CCP2_PORT     GPIO_PORTD_BASE
#define   CCP2_PIN        GPIO_PIN_5

SysCtlPeripheralEnable(CCP2_PERIPH);           // 使能CCP2管脚所在的GPIOD
GPIOPinTypeTimer(CCP2_PORT, CCP2_PIN);   // 配置CCP2管脚为Timer功能




Configure & Control

TimerConfigure() - 타이머의 동작 모드를 설정한다.

TimerControlStall( ) - 명시된 timer를 위한 stall response를 제어한다.

TimerControlTrigger( ) - 명시된 타이머를 위한 trigger output을 제어한다.

TimerControlEvent( ) - capture mode일때 타이머를 trigger할 signal edge를 set한다.

TimerControlLevel( ) - 명시된 타이머를 위한  PWM output level을 set 한다.



Load & Value Get

TimerLoadSet( ) - 타이머 load value를 set한다.

TimerLoadGet( ) - 명시된 타이머에서 현재 프로그램된 interval load value 를 가져온다.

TimerValueGet( ) - 명시된 타이머의 현재값을 읽어온다.



Mode Enable/Disable

TimerEnable( ) - timer module의 동작을 enable 한다.

TimerDisable() - timer module의 동작을 disable 한다.

TimerRTCEnable( ) - RTC mode에서 타이머로 하여금 counting을 시작하도록 한다.

TimerRTCDisable( ) - RTC 모드에서 타이머로 하여금 counting을 멈추게 한다.

TimerQuiesce( ) -  타이머를 초기화 상태로 바꾼다


Match &  Prescaler

TimerMatchSet( ) - 타이머를 위한 match value를 set 한다.

TimerMatchGet( ) - 명시된 타이머에서 match value를 가져온다.

TimerPrescaleSet( ) - input clock prescaler의 값을 set 한다.

TimerPrescaleGet( ) - input clock prescaler의 값을 가져온다.




Interrupt Control

TimerIntEnable( ) - 타이머 인터럽트 source를 enable 한다.

TimerIntDisable( ) - 타이머 인터럽트 source를 Disable한다.

TimerIntClear( ) - 명시된 timer interrupt source가 clear 된다.

TimerIntStatus( ) - timer module의 인터럽트 상태를 return한다.

TimerIntRegister( ) - 타이머 인터럽트가 발생했을 때 호출될 handler를 set 한다.

TimerIntUnregister( ) - 타이머 인터럽트가 발생했을 때 호출될 handler를 clear 한다.

Posted by eoseontaek

LM3S8962  Interrupt 예제에 대하여 분석해 보았다.

우선 예제코드를 다운받는다.
Link : http://www.zlgmcu.com/luminary/exploitation_guide.asp


위의 링크된 사이트에 가서 3개의 파일 모두를 받는다.
맨 위의 pdf 문서는 interrupt libary를 설명한 문서이고, 아래의 두개의 zip 파일은 예제코드이다.

제1장. 인터럽트 제어
LM3SLib_Interrupt.pdf 문서의 초반부에 함수의 prototype에 대하여 설명하고 있다.


1.1 인터럽트 기본 프로그래밍 방법

Stellaris는 인터럽트를 위해 다음과 같은 Periperal Driver library가지고 있다.

1. Periperal 활성화
관련 인터럽트를 사용하기 위해서는 <sysctl.h>에 정의되어 있는 헤더 파일을 이용하여 SysCtlPeriperalEnable() 함수를 호출한다.

2. 인터럽트 type 설정
인터럽트를 활성화하기 전에 인터럽트 type을 정확히 설정한다.

3. 인터럽트 활성화
ARM core의 Stellaris 제품군은 3단계의 인터럽트를 활성화 순서를 거친다.
    ● 특정 핀 인터럽트 활성화
    ● 특정 전체 인터럽트 활성화 ( IntEnable() )
    ● 전체 프로세스 인터럽트 활성화 ( IntMasterEnable() )

4. 인터럽트 서비스 루틴
인터럽트 서비스 함수 이름 GCC 컴파일러는 인터럽트 서비스 함수의 이름을 사전에 예약해 놓고 있다. 인터럽트 서비스 함수는 "LM3S_Startup.s"에서 확인할 수 있다. 예를 들어 GPIOB 포트 인터럽트 함수의 이름은 GPIOB_Port_B_ISR이며, parameter와 return value는 void 형이어야 한다. void GPIO_Port_B_ISR(void) 
KEIL 또는 IAR 개발환경에서는 인터럽트 서비스 함수 이름은 프로그래머가 자체적으로 지정할 수 있다. 하지만 GCC의 표준을 따르기를 권장하고 있다.

인터럽트 상태 확인 하나의 PIN은 몇가지 인터럽트 소스를 갖는 Periperal 이지만 인터럽트 vector는 공유할 수 있다. 예를 들어 GPIOA는 8가지의 기능을 갖지만 Vector number는 16번으로 인터럽트 vector를 공유한다. 각 인터럽트 소스를 정확히 구분하기 위한 쿼리 함수를 통해 인터럽트의 상태를 읽오 온다. 예를들어 GPIO의 상태 쿼리 함수로 GPIOPinIntStatus()를 사용한다.

인터럽트 허가 ARM 코어의 Stellaris 제품군의 모든 periperal interrupt는 인터럽트 상태를 자동으로 clear하지 않는다. 따라서 소프트웨어적으로 clear 시켜주어야 한다. (Periperal에 속하지 않는 Cortex-M3 코어 Exception 은 자동 clear한다.). 만약 clear 시키지 않으면 인터럽트 서비스가 종료되는 즉시 다시 인터럽트가 발생한게 된다. clear를 통해 인터럽트 상태를 clear한다. 예를 들어 GPIO의 인터럽트 상태 clear 함수는 GPIOPinIntClear()이다.

5. 인터럽스 서비스 등록
인터럽트 서비스를 등록하는 방법에는 두가지가 있다. 첫번째는 인터럽트 서비스 함수를 직접 등록하는 것이다. 구현이 간단하다는 장점이 있는 반면에 SRAM에 매번 인터럽트 vector를 등록해 줘야하기 때문에 효율성이 감소되는 단점이 있다. 다른 방법은 시작파일을 수정하는 방법인데 구현이 효율적인 반면에 이동성이 없다는 단점이 있다.

개발환경마다 인터럽트 서비스 함수를 등록하는 방법에는 차이가 있다.
GCC GCC 컴파일러에서는 "LM3S_Startup.s" 파일안에 표준 함수들이 등록되어 있어서 수정없이 바로 사용할 수 있다.
Keil Keil 개발환경에서는 "Startup.s"  어셈블러 파일을 활용한다. 예를들어 "void I2C_ISR(void)" 인터럽트 핸들러를  Vector Table 등록하려면 "IntDefaultHandler"을 "I2C_ISR"로 바꾸어 주고, "EXTERN I2C_ISR"로 선언해 주면 된다.
IAR IAR 개발환경에서는 "startup_ewarm.c" 파일을 사용한다. 예를 들어 "void I2C_ISR(void)" 인터럽트 핸들러를 선언하고 인터럽트 vector table에 해당 "IntDefaultHandler"를 "I2C_ISR"로 교체해준다.

위의 단계를 완료하면 이벤트 발생시 프로그램이 자동적으로 해당 인터럽트 서비스 함수로 분기하여 처리하게 된다.

아래는 GCC 컴파일러의 인터럽스 서비스 함수를 나타낸다.


1.2 인터럽트 라이브러리 함수

1.인터럽트 Enable & Disable
전체인터럽트 Enable : IntMasterEnable()
전체인터럽트 Disable : IntMasterDisable()
    (예외 : Reset ISR, NMI ISR, Fault ISR - 언제든지 발생할 수 있으므로 소프트웨어적으로 Disable되지 않을 수 있다)

반면 IntEnable(), IntDisable() 라이브러리 함수는 칩 전체의 인터럽트 설정을 제어한다.
인터럽트는 두가지 범주로 구분이 되는데, 그 중 하나는  NMI, SysTick 과 같은 ARM Cortex-M3 프로세서 내부에서 발생하는 인터럽트 vector가 15이하인 인터럽트를 나타내며, 다른 하나는 GPIO, UART, PWM 과 같은 Vector 번호가 16 이상인 Stellaris 제품군에 의존적인 인터럽트이다.


IntMasterEnable() - 프로세스 인터럽트 Enable한다.


IntMasterDisable() - 프로세스 인터럽트 Disable한다.


IntDisable() - 명시된 인터럽트를 Disable한다.


IntEnable() - 명시된 인터럽트를 Enable한다.



Stellaris 제품군의 ARM 인터럽트 소스는 다음과 같다.


2. 인터럽트 우선순위

ARM Cortex-M3는 256개까지 인터럽트 우선순위 레벨을 조절할 수 있다. 하지만 Stellaris 제품군은 8개의 우선순위 레벨을 지원한다. 인터럽트 우선순위를 설정하는 것은 복잡한 제어시스템에서 매우 중요한 요소이다.

우선순위를 설정하기 위해 IntPrioritySet(), IntPriorityGet() 함수를 사용한다. 하나 이상의 인터럽트가 발생할 경우 가장 높은 우선순위를 갖는 인터럽트의 순서대로 먼저 처리하며, 동일한 시간에 생성된 인터럽트의 경우 우선순위가 높은 인터럽트를 먼저 처리한다. 낮은 우선순위의 인터럽트가 처리되는 동안 우선순위가 높은 인터럽트가 발생하면 프로세서는 즉시 높은 인터럽트 처리 루틴으로 전환한다.

IntPriorityGroupingSet(), IntPriorityGroupingGet()함수는 preemptable priority 레벨과 subpriority레벨의 그룹화 설정을 관리하는데 사용한다.

IntPrioritySet() - 인터럽트의 priority를 설정한다.


IntPriorityGet() - 인터럽트의 priority를 가져온다.



IntPriorityGroupingSet() - 인터럽트 컨트롤러의 Priority grouping을 설정한다.


IntPriorityGroupingGet() - 인터럽트 컨트롤러의 Priority grouping을 가져온다.



3. 인터럽트 서비스 함수 등록 및 취소

IntRegister() - 인터럽트가 발생했을 경우 호출될 함수를 등록한다.


IntUnregister() - 인터럽트가 발생했을 경우 호출될 함수를 등록해지한다.


Posted by eoseontaek


"C:\StellarisWare\boards\ek-lm3s8962\qs_ek-lm3s8962"에 있는 "qs_ek-lm3s8962.icf"를 분석해 보았다.

//*****************************************************************************
//
// qs_ek-lm3s8962.icf - Linker configuration file for qs_ek-lm3s8962.
//
// Copyright (c) 2007-2009 Texas Instruments Incorporated. All rights reserved.
// Software License Agreement
//
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
//
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
//
// This is part of revision 5450 of the EK-LM3S8962 Firmware Package.
//
//*****************************************************************************

//
// Define a memory region that covers the entire 4 GB addressible space of the
// processor.
//
define memory mem with size = 4G; 
// 전체 메모리 영역의 크기 정의 :: 4G
define memory mem with size = 4G;

//
// Define a region for the on-chip flash.
//
define region FLASH = mem:[from 0x00000000 to 0x0003ffff];
// on-chip flash 영역의 크기 지정
define region FLASH = mem:[from 0x00000000 to 0x0003ffff];


LM3S8962 메모리 맵에서 On-chip Flash 영역은 0x0000 0000 ~ 0x0003 FFFF (256KB) 인 것을 확인 할 수 있다.


//
// Define a region for the on-chip SRAM.
//
define region SRAM = mem:[from 0x20000000 to 0x2000ffff];
// on-chip SRAM영역의 크기 지정
define region SRAM = mem:[from 0x20000000 to 0x2000ffff];


LM3S8962 메모리 맵에서 Bit-banede on-chip SRAM 영역은 0x2000 0000 ~ 0x2000 FFFF (64KB) 인 것을 확인 할 수 있다.



//
// Define a block for the heap.  The size should be set to something other
// than zero if things in the C library that require the heap are used.
//
define block HEAP with alignment = 8, size = 0x00000000 { };

// Heap을 위한 block 영역을 정의
// Heap 이 사용되도록 하는  C 라이브러리가 있다면 heap의 size는 0보다 크게 설정해야 한다.
define block HEAP with alignment = 8, size = 0x00000000 { };

여기서는 Heap영역을 사용하지 않는다.


//
// Indicate that the read/write values should be initialized by copying from
// flash.
//
initialize by copy { readwrite };
// read/write value는 flash로부터 복사됨에 의해 초기화 되어야만 하는 것을 나타냄.
initialize by copy { readwrite };


//
// Indicate that the noinit values should be left alone.  This includes the
// stack, which if initialized will destroy the return address from the
// initialization code, causing the processor to branch to zero and fault.
//
do not initialize { section .noinit };
//noinit values 는 홀로 남아있어야만 함을 나타냄(초기화 되지 말야야 함). 이것은 stack을 포함하고, 만약 초기화되면 initialization code로부터 return address를 파괴하고 processor를 zero나 fault로 분기시키는 원인이 됨.
do not initialize { section .noinit };


//
// Place the interrupt vectors at the start of flash.
//
place at start of FLASH { readonly section .intvec };
// Flash의 시작에 interrupt vectors를 위치시킴.
place at start of FLASH { readonly section .intvec };


//
// Place the remainder of the read-only items into flash.
//
place in FLASH { readonly };
// read-only items의 나머지를 Flash로 위치시킴.
place in FLASH { readonly };


//
// Place the RAM vector table at the start of SRAM.
//
place at start of SRAM { section VTABLE };
// SRAM의 시작에 RAM vector table을 위치시킴.
place at start of SRAM { section VTABLE };


* 런타임시 인터럽트 벡터를 바꾸기 위해 SRAM 영역 사용.
* 어플에서 벡터테이블 위치를 바꾸게 하기 위해 사용.



//
// Place all read/write items into SRAM.
//
place in SRAM { readwrite, block HEAP };
// SRAM으로 모든 read/write items를 위치시킴.
place in SRAM { readwrite, block HEAP };


Posted by eoseontaek

1. IAR EWARM을 시작하고 File 메뉴에서 "New -> Workspace"를 클릭하여 새로운 Workspace를 생성한다.

2. Project 메뉴에서 "Add Existing Project..."를 선택하고, "C:\StellarisWare\driverlib"에서 "driverlib.ewp" 프로젝트 파일을 추가한다. 정상적으로 등록되면 아래 처럼 등록된다.

3. "C:\StellarisWare\driverlib"에 "LM3S_DriverLib.eww" 로 Worksapce를 저장한다.

4. "driverlib - Debug"에 오른쪽 마우스를 클릭하여 "Options..."를 선택하고, 필요한 옵션을 지정한다.

    ● "Generral Options" Category에서 "Target" 탭을 선택하고 "Device"를 "Luminary LM3Sx9xx"를 선택한다.

    ● "Generral Options" Category에서 "Output" 탭을 선택하고 "Library"를 선택한다.


    ● "C/C++ Complier" Category에서 "Optimizations" 탭을 선택하고 최적화 level을 "None"을 선택한다.
         이후에 온라인 시뮬레이션 및 디버깅을 수행할 수 있다.



     ● "Library Builder" Category에서 "Output" 탭을 선택하고 "Override default"를 체크후, 라이브러리 파일의 출력
        path를 설정한다.
        여기서는 "C:\StellarisWare\driverlib\ewarm\Exe\driverlib.a"에 driverlib.a 파일이 위치한다.


5. Project를 "Make"한다.
    "C:\StellarisWare\driverlib\ewarm\Exe"에 driverlib.a 파일이 위치하는 것을 확인 한다.


Posted by eoseontaek



[1] Luminary 공식 웹사이트(http://www.luminarymicro.com/) 에서 최신 드라이버 라이브러리를 다운로드 한다.
 StellarisWare complete Firmware Development Package(SW-LM3S-5450)을 다운로드한다.
 



[2] 기본 설정대로 install 한다.
C:\StellarisWare 에 기본으로 install된다.


Posted by eoseontaek
이전버튼 1 이전버튼