1. LM3S8962 Luminary Micro 社에서개발한임베디드컨트롤러이다. 칩크기는기존 8bit, 16bit 컨트롤러수준이지만 ARM Cortex-M3 core (Thumb 2만지원 ) 를사용하여 32bit급성능을낼수있는 LM3S8xxx 시리즈의칩구성은아래그림과같다. 2. S/W Support 빠르고편리한개발을위해 LM 社에서 S/W지원을지속적으로해준다. C언어환경에서편하게 H/W 레지스터에접근할수있도록 driverlib를배포한다. 현재 3740 build가나와있다. (2008/12/08) URL: http:www.luminarymicro.com/products/software_updates.html Full version을사용해도되지만용량이큰관계로 LM3S8962에관련된 SW-EK-LM3S8962-3740을다운받아사용한다.
3. mycortex-lm8962 우리가사용한타겟은 Withrobot 社에서개발한 mycortex-lm8962보드를사용하였다. (http:www.withrobot.com/entry/mycortex-lm8962) 같은회사에서발매하는 Stellaris J-TAG을이용해디버깅한다. Tool-chain은타겟보드개발사인 Withrobot 社에서는 Opensource 개발툴들을추천하고있으나설치방법및활용에도많은노력이필요한관계로상용IDE인 IAR 社의 Embedded Workbench for ARM ( 이하 EWARM) 5.20를사용한다. 실제개발에사용할때는구입하여사용하여야하지만간단한테스트에는 Evaluation version을이용해볼수있다. (http:www.iar.com/website1/1.0.1.0/68/1/index.php) 4. Installation How-to 개발환경설치준비물 : PC (Windows XP가설치되고 USB 1 port 남는것 ) mycortex-lm8962 Stellaris J-TAG EWARM 5.20 StellarisWare (driverlib) build 3740 (SW-EK-LM3S8962-3740) LM FTDI Driver 2.4.6.0 1. Target Board 설치 Stellaris J-TAG( 이하 JTAG) 과 mycortex-lm8962 보드를동봉된케이블로아래그림과같이연결한다. JTAG 을 USB 에연결한다. 윈도우가새로운장치를인식하고아래와비슷하게드라이버를요구하면고 급설정을선택한다.
아래와같이 LM FTDI Driver 가존재하는폴더 (ex:luminary_ftdi_driver-2_04_06) 를직접선택하고다음 으로진행한다. 파일복사가이루어지면서디지털사인이되지않은드라이버라고경고가뜨지만계속진행시키면 Stellaris Evaluation Board A 가설치되고위의과정을 2번더반복하면 Stellaris Evaluation Board B 와 Stellaris Virtual COM Port (COMx) 가추가로설치된다. 설치가정상적으로이루어지면장치관리자에아래와같이장치가인식되어있다.
타겟보드설치는완료되었고 COMx 는 UART 통신에사용하면된다. Stellaris J-TAG 은 EWARM 에서 LMI FTDI debugger 로인식이되기때문에 ( 후자가오리지널일듯..) 설치후편리하게 debugging 할수 있다. 2. EWARM 설치다운로드한 EWARM의설치파일을실행하여일반적인프로그램을설치하듯이설치한다..( 그림생략 ) 설치중간에라이센스키를입력하는데 Eval. 라이센스를받거나구입해서입력한다 ;; (ATOM 프로세서에 Vista가설치된시스템에선 Host ID를제대로못읽는문제가있는것같다.) 설치가완료되고 EWARM을실행하면다음그림과같이실행된다.
3. SW-EK-LM3S8962-3740 설치 Luminary Micro 社의홈페이지에서다운받은 SW-EK-LM3S8962-3740.exe 를아래와같이실행한다. 나머지는일반적인프로그램과동일하게..;; 완료되면아래와같이 \StellarisWare 에설치된다. 4. EWARM Configuration How-to 1. driverlib Rebuild ( 이부분은생략하고사용해도되나작성될프로젝트와같은컴파일러에서다시빌드하고자설명한다.) 기본 Workspace에 driverlib 프로젝트를추가한다.
driverlib.ewp 선택 프로젝트옵션을선택하여프로세서설정을 LM3Sx9xx 로바꾼다. ( 본인은 Library Builder 에서출력파일 이름을 driverlib_debug.a 로바꿨음 )
Make 를시도하면 Workspace 를저장할곳을묻는다. 대충정해주고빌드를완료한다. Make 버튼클릭!! driverlib 의빌드결과확인한다. Build O.K 라이브러리파일은 \StellarisWare\driverlib\ewarm\Exe 에 driverlib_debug.a 로생성된다. 2. Workspace & Project 생성및초기설정 EWARM을실행하면기본적으로 Workspace가준비되어있다. 여기에 driverlib를 Rebuild할때와같이기존프로젝트나새프로젝트를추가하고 Workspace 단위로관리하게된다. 하지만타겟에대한설정은프로젝트단위로이루어진다. 3. driverlib 를사용하여 C 언어프로젝트만들기 임베디드시스템에서 C 언어를사용할때는 H/W 인터럽트벡터에대한설정이들어가기때문에 Startup 에대한고려가항상필요하고 tool-chain 별로방법이다르기때문에사용자가직접 compiler 문서를보
고작성해야하는경우가많다. 하지만 StellarisWare는편리하게주요 Tool에대해서지원해주고있고 EWARM도기본적으로지원된다. (\StellarisWare\boards\ek-lm3s8962에있는예제들속에있음 ) *.icf LM3S8962용 memory 및 section 설정 # MCU에따라정의되는파일이기때문에예제들의 icf들은모두동일하다. 아무거나하나쓴다. startup_ewarm.c EWARM v5 용 startup 파일 # Interrupt vector 가정의된파일로 interrupt 를사용하려면수정해야하는파일이다. driverlib LM3Sxxxx 의 H/W 레지스터를편리하게사용할수있는 C 라이브러리 # driverlib 는라이브러리로사용해도되고소스가모두공개되어있기때문에프로젝트에필요한것만넣어메모리 를절약할수도있다. 다음은기본예제인 timers.c 를 driverlib 와함께사용하여 mycortex-lm8962 보드에서사용할수있도록 프로젝트를생성하는과정이다. 1. 프로젝트폴더 & Sub 폴더만들기 (ex: \StellarisWare\dr_robot\test1) 2. 기본제공 StellarisWare 복사하기 - icf, startup 복사 \StellarisWare\boards\ek-lm3s8962\timers\startup_ewarm.c Ł \StellarisWare\dr_robot\test1\startup_ewarm.c \StellarisWare\boards\ek-lm3s8962\timers\timers.icf Ł \StellarisWare\dr_robot\test1\LM3S8962.icf - driverlib 복사 \StellarisWare\driverlib\ewarm\Exe\driverlib_debug.a Ł \StellarisWare\dr_robot\test1\drvlib\driverlib_debug.a
- header 복사 (to: \StellarisWare\dr_robot\test1\include) \StellarisWare\driverlib\*.h Ł \StellarisWare\dr_robot\test1\include\driverlib\*.h \StellarisWare\inc\*.h Ł \StellarisWare\dr_robot\test1\include\inc\*.h \StellarisWare\*.h Ł \StellarisWare\dr_robot\test1\include\*.h
- 소스복사 \StellarisWare\boards\ek-lm3s8962\timers\timers.c Ł \StellarisWare\dr_robot\test1\timers.c 3. 프로젝트생성프로젝트를새로만들고 Empty project 를선택한후미리만들어놓은 test1 폴더에프로젝트저장 4. 프로젝트파일등록 ( 그룹은취향에맞게추가 ) - 라이브러리추가
- 소스추가 5. 프로젝트옵션설정 타겟설정
C 컴파일러설정 Linker memory 설정
Debugger 설정
6. 소스수정 - Interrupt vector 수정 (startup_ewarm.c)
- timers.c 소스수정 ( 원본 : StellarisWare, LED: mycortex-lm8962 예제참고 ) timers.c - Timers example. Copyright (c) 2005-2008 Luminary Micro, Inc. All rights reserved. Software License Agreement Luminary Micro, Inc. (LMI) is supplying this software for use solely and exclusively on LMI's microcontroller products. The software is owned by LMI and/or its suppliers, and is protected under applicable copyright laws. All rights are reserved. You may not combine this software with "viral" open-source software in order to form a larger program. Any use in violation of the foregoing restrictions may subject the user to criminal sanctions under applicable laws, as well as to civil liability for the breach of the terms and conditions of this license. THIS SOFTWARE IS PROVIDED "AS IS". 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. LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. This is part of revision 3740 of the EK-LM3S8962 Firmware Package. #include "hw_ints.h" #include "hw_memmap.h" #include "hw_types.h" #include "driverlib/debug.h" #include "driverlib/interrupt.h" #include "driverlib/sysctl.h" #include "driverlib/timer.h" #include "driverlib/gpio.h" #include "inc/lm3s8962.h"
! \addtogroup example_list! <h1>timer (timers)</h1>!! This example application demonstrates the use of the timers to generate! periodic interrupts. One timer is set up to interrupt once per second and! the other to interrupt twice per second; each interrupt handler will toggle! its own indicator on the display. The error routine that is called if the driver library encounters an error. #ifdef DEBUG void error (char *pcfilename, unsigned long ulline) { } #endif The interrupt handler for the first timer interrupt. void Timer0IntHandler(void) { Clear the timer interrupt. TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
if (GPIOPinRead(GPIO_PORTG_BASE, GPIO_PIN_0)!= GPIO_PIN_0) GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_0, GPIO_PIN_0); else GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_0, 0); } This example application demonstrates the use of the timers to generate periodic interrupts. int main(void) { Set the clocking to run from the PLL. SysCtlClockSet(SYSCTL_SYSDIV_4 SYSCTL_USE_PLL SYSCTL_OSC_MAIN SYSCTL_XTAL_8MHZ); 50MHz Enable the peripherals used by this example. SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); Enable processor interrupts. IntMasterEnable(); Configure the two 32-bit periodic timers. TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER); TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet()); Setup the interrupts for the timer timeouts. IntEnable(INT_TIMER0A); TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); Enable the timers. TimerEnable(TIMER0_BASE, TIMER_A);
Setup LED GPIOPinTypeGPIOOutput(GPIO_PORTG_BASE, GPIO_PIN_0); Loop forever while the timers run. while(1) { } } 7. Make Make 처음 make 시도때는 Workspace 를저장
Download & Debug Download & Debug 정상적으로 J-TAG 이작동하면 main() 에서대기함. Go 를눌러주면실행됨. 끝!!!