IBB -OUM(Intelligent Black Box) IoT 실현위한 Ethernet Communication Wiz550io + WizFi250 + NUC140 사용자설명서 문서번호 : IBB-OUM812 번호갱신내용담당 V 위즈네트강의위

Similar documents
ISP and CodeVisionAVR C Compiler.hwp

슬라이드 1

MAX+plus II Getting Started - 무작정따라하기

Microsoft PowerPoint - es-arduino-lecture-03

Microsoft Word - PEB08_USER_GUIDE.doc

À̵¿·Îº¿ÀÇ ÀÎÅͳݱâ¹Ý ¿ø°ÝÁ¦¾î½Ã ½Ã°£Áö¿¬¿¡_.hwp

Microsoft PowerPoint - chap01-C언어개요.pptx

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

DE1-SoC Board

CAN-fly Quick Manual

마이크로프로세서 Cortex-M

BY-FDP-4-70.hwp

PowerPoint 프레젠테이션

(SW3704) Gingerbread Source Build & Working Guide

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

Microsoft Word - MV210_CPUSpec.doc

ez-md+_manual01

untitled

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론

Mango-E-Toi Board Developer Manual

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

Microsoft Word doc

CZ-KETI-IOTG200

API 매뉴얼

API 매뉴얼

KDTÁ¾ÇÕ-1-07/03

KEY 디바이스 드라이버

슬라이드 제목 없음

Microsoft Word - Armjtag_문서1.doc

KDTÁ¾ÇÕ-2-07/03

untitled

슬라이드 1

슬라이드 1

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A636C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

2 PX-8000과 RM-8000/LM-8000등의 관련 제품은 시스템의 간편한 설치와 쉬운 운영에 대한 고급 기술을 제공합니다. 또한 뛰어난 확장성으로 사용자가 요구하는 시스템을 손쉽게 구현할 수 있습니다. 메인컨트롤러인 PX-8000의 BGM입력소스를 8개의 로컬지


<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

T100MD+

K&R2 Reference Manual 번역본

슬라이드 1

Microsoft Word - ZIO-AP1500N-Manual.doc

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D C61645FB3EDB8AEC7D5BCBA20B9D720C5F8BBE7BFEBB9FD2E BC8A3C8AF20B8F0B5E55D>

MicrocontrollerAcademy_Lab_ST_040709

*Revision History 날짜 내용 최초작성 Tel Fax [2] page

Microsoft Word - FS_ZigBee_Manual_V1.3.docx

1217 WebTrafMon II

Install stm32cubemx and st-link utility

CANTUS Evaluation Board Ap. Note

Smart Power Scope Release Informations.pages

Microsoft PowerPoint - polling.pptx

Chapter #01 Subject

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

목차 1. 제품 소개 특징 개요 Function table 기능 소개 Copy Compare Copy & Compare Erase

4S 1차년도 평가 발표자료

차 례 설치순서 1 인터넷 유무선공유 설치하기 2 스마트에어컨 회원등록 6 캐리어에어컨 스마트앱 사용하기 8

C. KHU-EE xmega Board 에서는 Button 을 2 개만사용하기때문에 GPIO_PUSH_BUTTON_2 과 GPIO_PUSH_BUTTON_3 define 을 Comment 처리 한다. D. AT45DBX 도사용하지않기때문에 Comment 처리한다. E.

Microsoft Word - PLC제어응용-2차시.doc

BC6HP Korean.ai

Microsoft Word - AVRISP mkII 장비 운용.doc

hd1300_k_v1r2_Final_.PDF

목차 1. 개요 USB 드라이버 설치 (FTDI DRIVER) FTDI DRIVER 실행파일 USB 드라이버 확인방법 DEVICE-PROGRAMMER 설치 DEVICE-PROGRAMMER

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Microsoft PowerPoint - eSlim SV [ ]

MPLAB C18 C

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

ez-shv manual

목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우.

PLC Robot Starter Quick Guide

2주차: 입출력 제어 복습

Microsoft PowerPoint - ccs33_bios_PRD.ppt [호환 모드]

IoT FND8 7-SEGMENT api

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

CPX-E-SYS_BES_C_ _ k1

PowerPoint 프레젠테이션

Microsoft PowerPoint - 권장 사양

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

lecture4(6.범용IO).hwp

RealDSP UT 프로그램 메뉴얼

Microsoft Word ARM_ver2_0a.docx

Remote UI Guide

디지털공학 5판 7-8장

untitled

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

1. What is AX1 AX1 Program은 WIZnet 사의 Hardwired TCP/IP Chip인 iinchip 들의성능평가및 Test를위해제작된 Windows 기반의 PC Program이다. AX1은 Internet을통해 iinchip Evaluation

untitled

슬라이드 제목 없음

DSP_MON 프로그램 메뉴얼

untitled

임베디드시스템설계강의자료 4 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Microsoft PowerPoint - ch07.ppt

Mango220 Android How to compile and Transfer image to Target

APOGEE Insight_KR_Base_3P11

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Microsoft PowerPoint - ARM 개발 환경.ppt

airDACManualOnline_Kor.key

[8051] 강의자료.PDF

Transcription:

IBB -OUM(Intelligent Black Box) IoT 실현위한 Ethernet Communication Wiz550io + WizFi250 + NUC140 사용자설명서 문서번호 : IBB-OUM812 번호갱신내용담당 V2.5 2015.03.01 위즈네트강의위한자료작성, 타겟보드사용설명 참조 : PAT_APP_D088_TCPIP 통신 Conan 차례 김형태 : 펌웨어뱅크 ( 주 ) 대표, Cortex-M 시리즈펌웨어개발저자, conan@firmwarebank.com 1. 서론 3 2. Experience Cortex-M0 and Tool 5 2.1. Cortex-M0 NUC140 소개 5 2.2. MDK-ARM Compiler 7 2.3. Nu-Link-Me JTAG 12 2.4. Cortex-M0 NUC140 GPIO 14 2.5. Cortex-M0 NUC140 SYSTEM 19 2.6. Cortex-M0 NUC140 Timer 19 2.7. Cortex-M0 NUC140 ADC 23 2.8. Cortex-M0 NUC140 UART 23 3. Experience WIZnet 25 3.1. IIM7100A 25 3.2. W5100A 25 3.3. WizFi250 25 4. 부록 35 4.1. 참고정보 35 4.2. 참고서적 36

읽어두기 - 본기술서는유 / 무선이더넷, UART, CAN 통신을 32Bit Cortex-M0 마이크로프로세서와함께익힐수있도록구현원리와기술에대해이해하기쉽도록작성된기술지침서입니다. Document의내용은통신의이해를돕고 Firmware 설계와프로그램을스스로엔지니어가할수있도록하기위해힘썼습니다. - 설계된보드는독립적으로통신이가능하지만다른보드와함께인터페이스할목적으로설계되었습니다. 특히입력핀에는디지털신호와아날로그신호를받아여러종류의센서신호를처리할수있도록했으며출력결과를표준통신으로보낼수있도록한것입니다. - 무엇보다 IBB-OUT 보드는 IoT 기술을실행하기위해선행되어야하는펌웨어기술, 고성능 Cortex MCU 제어기술, 이더넷과같은통신기술을익히기위한것입니다. - 본자료는주식회사위즈네트의적극적인도움으로제작되었으며모듈형태의 WizFi250, Wi550io가사용되었습니다. - 학습대상은 Firmware 엔지니어이며기본적인 C 언어코드구성과 MCU를다룰수있는기초지식을소유한기술자이다. - IBB-OUM 보드는 IBB-MVoice, IBB-MAIN, IBB-INM과함께사용되면더욱효과가있으며현재대학수업교재로이용되고있습니다. - 자료는강의와집필을목적으로작성된시리즈이며 Experience 챕터를만들기위해보드와모듈을사용하여실험과코드의결과를정리했습니다. - 실험에서사용한 MCU는 32Bit Cortex-M0는 NUC140입니다. 이미출간한상태이므로관련상세기술은 고액연봉도전프로젝트 시리즈를참고하시기를바랍니다. 이책의최신기술사항카페 : cafe.naver.com/fws NuMicro MCU : www.nuvoton.com ARM Compiler : www.keil.com 위즈네트 : wiznet.co.kr 위즈네트아카데미 : www.wiznetacademy.com

1. 서론 우리나라는 Embedded System, 통신분야의설계기술과기능을넣기위하여마이크로프로세서에프로그램을이식하여동작을구현하는기술자들이많이있습니다. 기술의발달은빨라지고구현의난이도도점점더어려워집니다. 공부할것도많고요. 2가지이상의경우가발생할때각각따로처리해야한다면프로그램해야합니다. 작은컴퓨터에해당하는마이크로프로세서에기계어코드를이식해서특별한일을컨트롤러에명령을주어야한다면펌웨어기술이필요합니다. 내가만든정보를다른기기에보내고다른기기의정보를내가읽어오거나처리하기를원한다면정보통신기술도있어야합니다. 본기술서는 32 비트고성능마이크로프로세서 Cortex-M0 을이용하여위즈네트사의무선이더넷, 유선 이더넷통신을어떻게구현하고학습해야하는지를알려드립니다. 알나지 ( 알고나면지식 ) 주식회사위즈네트 위즈네트는사물인터넷 (Internet of Things) 을위한인터넷프로세서를개발공급하는팹리스벤처기업입니다. 인터넷통신표준프로토콜 TCP/IP를 2001년세계유일하게 (Hardware) Chip으로구현하여최근 5년동안 1,000 만개이상의칩을매우다양한임베디드인터넷디바이스에적용시켜왔으며 70% 이상전세계에수출되고있습니다. 위즈네트는고객의높은브랜드충성도를기반으로전세계 70여대리점을운영하고있으며, 이들에기술지원및 Project Marketing을위해미국, 중국, 독일에지사를두고있습니다. 저자가기술에관해서아무리쉽게집필했다고해도자료를처음보면어렵습니다. 기술은손끝에서실습을통해이루어져야머리에각인된다고생각합니다. 즉머리로 Cortex-M0를익히지마시고손으로익히시길바랍니다. 특히통신에관한사항을구현할때는뜻대로잘되지않고작은실수로구현이안될수도있습니다. 차근차근정확하면서빠르게익혀 IT를잘한다는대한민국의펌웨어기술자들이되어세계적인명성을얻으시길바랍니다. 본연구개발은 WIZnet 사의제품을이용하여구현하였으며위즈네트사의도움없이는시작할수없었 을겁니다. 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 3/36

본설명서에서다루고실습을통해얻을수있는것들 - Nuvoton 社의 ARMR Cortex -M0 NUC140 시리즈에대한이해 - 표준함수 CMSIS를이용한프로그램방법 - ARM사의 32비트 MDK-ARM 컴파일러사용법 - Nu-Link-Me의 JTAG을이용하여프로그램이식과디버깅방법 - 소프트웨어와하드웨어의연계절차와방법 - Cortex-M0로설계된타겟보드 FWB-IBB-OUM812-COM 의하드웨어이해 - WizFi250 무선모듈제어방법 - WIZ550io 유선모듈제어방법 - UART 통신제어방법 - CAN 통신제어방법 - SPI 제어방법 - ADC, GPIO등 IoT를구현하기위한필수지식 - 통합개발환경에서구현된프로젝트와 C 소스코드일체 그림 5. WizFi250 그림 6. WIZ550io 그림 4. IBB-OUM812-COM 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 4/36

2. Experience Cortex-M0 and Tool 2.1. Cortex-M0 NUC140 소개 Nuvoton사에서시판되는 Cortex -M0 코어로설계된 32비트 MCU에는 NuMicro M051, Mini, Nano 그리고 NUC 시리즈가있다. 이중에서 NUC100에는들어있지않지만 100이상에서는 USB/CAN 엔진이내장되어있는데특히 NUC140 종류를 Connectivity Line이라고한다. NUC140시리즈를이용하여기술구현하는방법을안내하지만 M0는 ARM사의 32비트마이크로프로세서이고칩내부에 CPU Core 이외에 Nuvoton사에서설계한여러기능을첨부하여상당한엔진들이들어있어다소복잡하게느껴진다. 하지만다양하게제공되는 Platform의소스코드를이용하면어렵지않게펌웨어설계와프로그램을할수있다. NUC140 시리즈는 LQFP48, LQFP64, LQFP100의 IC Package 타입으로판매되며칩이름에따라 32K, 64K, 128K 바이트의플래시메모리가내장되어있다. 또한마음대로사용이가능한 4K바이트의 Data Flash, ISP(In System Program) 사용용도로설계된 ISP Loader 4K바이트, RAM 4K/8K/16K바이트로구성되어있다. Product UART SPI I2C USB LIN CAN PS/2 I2S NUC100 NUC120 NUC130 NUC140 표 2. NuMicro Connectivity Supported Table Embedded 기술자들은마이크로프로세서를이용하여특정동작을연속, 자동으로하는제어설계를많이하게되는데이때주로사용하게될 I/O 포트, EBI(External Bus Interface), 타이머, UART, USB, CAN, SPI, I2C, PWM, ADC, Watchdog Timer, Brownout Detector가 NUC시리즈에는들어있어설계시원칩으로해결이가능하므로보드사이즈를작게하고비용이저렴하게되어편리와이익을제공한다. 또한 NuMicro NUC 시리즈에는 ISP (In-System Programming) 과 ICP (In-Circuit Programming) 기 능이칩내부에있어별도의디버그장비인 JTAG 이없이시리얼통신케이블만으로도타겟보드에이 식하는포팅이가능하므로취미개발자, 소규모펌웨어개발에적합하다고하겠다. 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 5/36

Part number APROM RAM Data Flash ISP ROM I/O Timer Connectivity UART SPI I2C USB LIN CAN I2S Comp. PWM ADC RTC EBI ISP ICP Package NUC140LC1CN 32 KB 4 KB 4 KB 4 KB up to 31 4x32bit 2 1 2 1 2 1 1 1 4 8x12-bit v - v LQFP48 NUC140LD2CN 64 KB 8 KB 4 KB up to 31 2 1 2 1 2 1 1 1 4 v - v LQFP48 NUC140LE3CN 128 KB 16 KB up to 31 2 1 2 1 2 1 1 1 4 v - v LQFP48 NUC140RC1CN 32 KB 4 KB 4 KB up to 45 3 2 2 1 2 1 1 2 4 v v v LQFP64 4 KB 4x32bit 8x12-bit NUC140RD2CN 64 KB 8 KB 4 KB up to 45 3 2 2 1 2 1 1 2 4 v v v LQFP64 NUC140RE3CN 128 KB 16 KB up to 45 3 2 2 1 2 1 1 2 4 v v v LQFP64 NUC140VE3CN 128 KB 16 KB up to 76 3 4 2 1 2 1 1 2 8 v v v LQFP100 표 3. NUC140 시리즈 ( 노란부분이우리가사용하는칩 ) 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 6/36

2.2. MDK-ARM Compiler M0 시리즈는 ARM사의 MDK-ARM Compiler를이용해서응용프로그램개발을할수있다. 컴파일러는마이크로프로세서에이식가능한형태의기계어로코드를생성해준다. 다시말해원하는 MPU 동작알고리듬을 High Level Langage ANSI C 또는 C++ 언어로개발한다음컴파일러소프트웨어를통해 Low Level의 *.hex 코드또는 *.bin 코드로변환해주는기본적인역할을하는것이고그이외에 JTAG 같은프로그램과인터페이스가가능한툴을이용하여 Target과정보를주고받으며이식할때도움을주는역할을한다. MDK(Microcontroller Development Kit) 는 Cortex-M, Cortex-R 시리즈와 ARM7, ARM9 프로세서를이용하여펌웨어개발할때필수적인컴파일러이며소프트웨어로써 PC에설치되어운영되는프로그램이다. PC의 CPU와이식하고자하는 M0 코어가서로다르기때문에 Cross Compiler라고한다. MDK-ARM 컴파일러는 Cortex-M0처럼주로 MCU에플래시메모리가내장된버전을일반적으로지원한다. PC에설치하여쉽게배우고적용할수있도록프로그램개발자들이자주사용하는비주얼스튜디오 (Visual Studio) 소프트웨어와 GUI가유사하여관련소프트웨어를사전에습득한기술자라면직감적으로이해할수있을것이다. MDK-ARM은 C Compiler, Assembler, Linker/Locator, Librarian, Hex Converter등의소프트웨어를통합으로관리하는마이크로비젼 (μvision) 의이름으로통칭한다. 통합환경은기본적으로소프트웨어 MCU를흉내내어결과를 PC상에서알아볼수있도록지원하는 Simulation 기능과디버그와 Tool을지원해주며 USB로동작하는 ULINK Adapter와인터페이스하여 Cortex-M0에실행코드를다이렉트다운로드하거나 C Source 레벨에서디버깅이가능하도록 Emulation과연계해준다. MDK-ARM 통합개발환경 μvision 구성 Toolchain : MDK-Lite C Compiler : Armcc.Exe Assembler : Armasm.Exe Linker/Locator : ArmLink.Exe Librarian : ArmAr.Exe Hex Converter : FromElf.Exe 알나간 ( 알고나면간단 ) Compiler, Cross Compiler 고급언어로작성된프로그램이컴퓨터에서수행되기위해서는컴퓨터가직접이해할수있는언어로바꾸어주어야하는데. 이러한일을하는프로그램을컴파일러라고한다. 예를들어원시언어 (Source) 가 C나와같은고급언어이고목적언어가어셈블리언어나기계어일경우이를번역해주는프로그램을컴파일러라한다. 어떤마이크로프로세스는고급언어가지원되지않고어셈블리만있기도하지만대부분은하나이상의고급언어를제공한다. 컴파일을하기위하여입력되는프로그램을원시프로그램이라하고이프로그램을기술한언어를원 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 7/36

시언어 (Source language) 라한다. 또번역되어출력되는프로그램을목적프로그램이라하고이프로그램을기술한언어를목적언어 (Object language 또는 Target language) 라한다. 한프로그램을컴파일하여목적프로그램으로바꾸어놓으면, 원시프로그램을수정하지않는한계속반복해서수행할수있다. 크로스컴파일러 (Cross Compiler) 라는것은다른기종의마이크로프로세스가해당언어의기계어로번역해준다는의미이다. 예를들어 Cortex-M 시리즈로 System을구성한다고했을때원시프로그램을 RISC 마이크로프로세스컴파일러가만들어주는것이아니고 PC 같은고급프로세스에서사용되는마이크로프로세스를이용하여 Cortex-M 기종에맞는기계어로번역하는컴파일러를말한다. 이밖에다른번역기를살펴보면어셈블러 (Assembler), 인터프리터 (Interpreter), 그리고프리프로세서 (Preprocessor) 등을들수있다. 어셈블러는어셈블리언어로작성된프로그램을입력으로받아기계어프로그램으로바꾸어주는번역기이며, 어떤번역기는원시언어를특수한형태의중간언어로변환하는데인터프리터는이러한중간언어를입력으로받아목적언어로변환하지않고직접수행하는프로그램이다. 고급언어로작성된프로그램의의미를수행하는데있어서컴파일러는그와동등한의미를갖는목적프로그램으로바꾸어목적프로그램을수행함으로써결과를얻고, 인터프리터는원시프로그램의의미를직접수행하여결과를얻는다. 원시프로그램의수정없이계속반복수행하는응용시스템에서는컴파일러가효율적이며, 개발시스템이나교육용시스템에서는인터프리터가더능률적이다. 그림 7. MDK-ARM Compiler 의구성 목수도연장을잘사용해야집짓기에수월하고다치거나시행착오를격지않는다. 마이크로프로세서응 용기술자에게도당연하게 Tool 을잘사용해야업무에효율이생길것이다. 익숙해지기위해평가소 프트웨어버전을설치하여다음진도를나가도록하자. MDK-ARM 평가컴파일러는실행코드가 32K바이트한도내에서사용이가능한버전의다운로드설치방식의평가제품을사용하며저자가사용한버전은 mdk473.exe이다. 설치할때는경로를한글로하는 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 8/36

것만피하자. 평가컴파일러다운로드및정보 - www.keil.com/demo/eval/arm.htm - cafe.naver.com/fws 그림 8. MDK-ARM 초기화면 MDK-ARM compiler 를설치완료했다면바탕화면에실행아이콘이생기게되고이제 M0 에프로그램 이식할준비가된것이다. MDK-ARM 컴파일러실행 또는설치경로 : \UV4\Uv4.exe UV4의메뉴설명 1 : 11개의항목으로구성된 Pull Down Menu이다. 2 : 파일편집아이콘묶음을나타낸다. 3 : 컴파일실행버튼으로아래로향한화살표한개띄어쓰기모양의아이콘은프로젝트윈도우에서수정된것만컴파일 / 링크하며화살표두개는프로젝트윈도우에있는모든소스를다시컴파일 / 링크하게된다. 4 : 하드웨어의옵션에해당하며 Embedded Board에프로그램이식하기위해서는 Target의 ARM Chip이마운팅되어있거나기본정보를가지고있어야한다. Target Option은하드웨어설정에중요한요소중에하나이므로잘숙지해두어야한다. 5 : Project Component, 확장자정의, 경로를설정하여편리하게할수있는 Books 탭으로구성되어있다. 동일한소스로 Target을달리할때사용하며추가된항목은 7 번에디스플레이된다. 6 : Target Board의 Flash Memory에코드를이식할때사용되는아이콘으로 JTAG 항목또는 ISP 등의경로와메모리환경을설정할수있다. 7 : 설정된프로젝트의 Target을나타낸다. 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 9/36

그림 9. RealView MDK-ARM 의윈도우 UV4의 Window 설명 A : Project 윈도우로마우스의오른쪽버튼으로프로젝트의구성원을등록하거나제거할수있다. 소스코드와모든등록된파일을디스플레이한다. B : 소스코드나파일을편집하는윈도우로한글입력도가능하지만완전한글자가입력되어야디스플레이되는단점이있다. C : 컴파일, 링크, 다운로드등의실행결과를나타내는윈도우로에러 (Error) 나경고 (Warning) 가발생한문장을더블클릭했을경우활성화가가능한메시지라면해당파일의라인을찾아간다. Open Project 이미작성된통합개발환경, IDE(Integrated Development Environment) 의프로젝트를불러올때사용된다. 같은컴파일러를사용할경우프로젝트환경을저장한파일까지상대에게제공하는것이올바른방법이다. 만약소스코드만서로건네줄때는제공자와제공받는쪽의설정이달라질수있어개발환경을다시고처주어야하는불편함이있다. 프로젝트를불러오기위해 'Project/Open Project.' 를실행하고프로젝트파일이있는경로를설정 한다. 여기서는확인을위해 MDK-ARM 을설치할때생성된 ' 설치경로 :\ARM\Example\Blinky \Blinky.uvproj' 를클릭하자. 견본프로젝트파일열기 : Project/Open Project 파일선택 : 설치경로 \ARM\Example\Blinky\Blinky.uvproj 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 10/36

그림 10. UV4 에서 Blinky Project 파일의 Open 실행된 RealView MDK-ARM UV4의통합환경윈도우의좌측상단에는오픈된프로젝트이름이표시되고하단에는간단한파일정보가보여질것이다. 프로젝트환경에서 C 언어로만들어진소스코드를컴파일과링크를할때는 'Project/Rebuild All Target Files'( ) 을실행하면된다. 이때프로젝트윈도우에있는소스코드모두를컴파일, 링크를거친뒤결과를하단결과윈도우에디스플레이하게된다. MDK-ARM이정상설치되고불러온예제를수정하지않았다면결과는다음처럼나타날것이다. Build target 'LPC2100' assembling Startup.s... compiling Retarget.c... compiling Blinky.c... linking... Program Size: Code=528 RO-data=16 RW-data=0 ZI-data=1160 ".\Obj\Blinky.axf" - 0 Error(s), 0 Warning(s). Program Size: Code=528 RO-data=16 RW-data=0 ZI-data=1160 소스프로그램을기계어코드로변환했을때의크기를나타내며단위는 10진수에 8비트의크기를나타낸다. 여기에서는 Code + RO-Data + RW-Data 항목을다합친결과가실제로 32Bit RISC 칩 ARM의플래시메모리영역에기록되는코드가되는것이다. 컴파일과링크후에는통합보고서 *.map 파일을통해서도확인이가능하다. ZI 영역은 Zero로초기화되는 RAM 크기를나타낸다. Total RO Size (Code + RO Data) 544 (0.53kB) Total RW Size (RW Data + ZI Data) 1160 (1.13kB) Total ROM Size (Code + RO Data + RW Data) 544 (0.53kB) 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 11/36

2.3. Nu-Link-Me JTAG C 소스언어로 M0의알고리즘을개발하여기계어코드를포팅할때의방법은크게 3가지로나눌수있다. 하나는컴파일과디버그정보를전달하여개발이효율적으로되는 ARM사의 JTAG ULINK2 Tool 를사용하는방법, 둘째로 Nuvoton사의 Nu-Link-Me JTAG Tool을이용하는방법, 셋째로 Target 보드에다운로드가능한알고리즘을미리탑재한방식으로 USB와케이블만연결하여기계어코드를플래시메모리 (Flash Memory) 에다이렉트기록하는 ISP 방법이있다. Nu-Link-Me JTAG Tool 이용방법 메뉴 : Project/Option for target/utilities/use target Drive for Flash Programming/Setting/Flash Download/Add Use target Drive for Flash Programming : Nuvoton-Nu-Link M0 Debugger 선택 Nu-Link-Me의 JTAG Tool은 Nuvoton사의 M0 전용장비이다. Target 보드와 Nu-Link-Me가물리적으로신호를통해올바로연결되어있어야하며 JTAG에서 3.3V, 5V전원공급이 USB를통해이루어진다. JTAG 사용은 MDK-ARM 컴파일러와연관하여타겟과정보를주고받으며소스코드자체로함수단위, 변수단위로디버깅이가능하다. 그림 12. Nu-Link 용드라이버선택 MDK-ARM 컴파일러에드라이버만설치하면사용방법은간단하다. [ 그림 : Nu-Link-Me JTAG] 의오른 쪽 USB 케이블을연결하고반대쪽 A Type 는 PC 에연결하면된다. 왼쪽 2X5 해드핀을타겟보드 2X5 Male 핀에연결하면전원과같이공급되면서물리적인방법은완료다. 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 12/36

그림 13. Nu-Link-Me JTAG Nu-Link-Me JTAG 소프트웨어드라이버설치 - www.nuvoton.com - Home > Support > Tool & Software > Software에서 - Nu-Link Driver for Keil RVMDK Vx.xx.xxxx.zip MDK-ARM 컴파일러는새로운 ARM 계열칩이나오면버전을바로변경하여자주업데이트가된다. 갱신된컴파일러드라이버버전과 Nu-Link-Me 펌웨어버전, 또는 NuMicro ICP(In Circuit Program) 드라이버가서로다를경우 [ 그림 : ICE Tool과 MDK-ARM의버전번호다를경우 ] 처럼경고메시지가나오게된다. 해결책은경우에따라메시지내용을보고업데이터하거나또는무시하는것이다. 무시를해도동작에는지장을주지않지만번거로운팝업이나온다. 그림 14. ICE Tool 과 MDK-ARM 의버전번호다를경우 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 13/36

2.4. Cortex-M0 NUC140 GPIO GPIO(General Purpose I/O) 는마이크로프로세서의내부를익힐때가장먼저해보는기술이기도하다. NuMicro NUC140 시리즈도다른것과마찬가지로입력과출력을지정하여사용하는일반사용목적의포트가있는데 16비트의크기로설정하도록되어있는것이다르다. 140 시리즈에는 IC의 Package에따라수의차이가있지만최대 80개의 GPIO를설정할수있으며 GPIOA, GPIOB, GPIOC, GPIOD, GPIOE의 5개그룹이있다. 레지스터에의해입력과출력등으로설정할수있으며 GPIO 이외에다른 Multi 기능의핀으로도변신이가능하다. GPIOA~D 까지그룹은각각 16핀으로구성되어있고포트는독립적으로동작한다. GPIO 기능은 Input, Output, Open-drain, Quasi-bidirectional( 자동기본설정 ) 모드설정이가능하고 2.5V ~ 5.0V로동작되는 (MPU 공급전압에영향 ) 입력 / 출력로직을처리할수있으며칩내부에는 pull-up 저항이 110KΩ~300KΩ으로연결되어있다. 포트의저항은허용전력이작기때문에초과전류가입력되면파손되는구조의 weakly pull-up으로 IC 내부에디자인되어있다. GPIO 특징각각의포트는 Quasi bidirectional 설정가능각각의포트는 Open-drain 출력각각의포트는 Push-Pull 출력각각의포트는 High Impedance 입력설정가능 TTL/Schmitt Trigger 입력선택가능 Edge와 Level 인터럽트설정가능높은구동능력의 Driver, Sink 지원 포트의기능을설정하기위해서는 GPIOA_PMD ~ GPIOE_PMD 레지스터중에서 PMD(Port Mode Control) 그룹을먼저선택하고 0~15 핀에서 4 가지중하나의기능을 2 개디지털로설정한다. 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 PMD15 PMD14 PMD13 PMD12 PMD11 PMD10 PMD9 PMD8 PMD7 PMD6 PMD5 PMD4 PMD3 PMD2 PMD1 PMD0 표 4. PMD 설정비트위치 입력전용모드설정 (00) GPIOx_PMD 레지스터에서해당비트의 PMDn 값을 00으로설정하면된다. 여기서 x는 A~E까지의포트그룹을나타내고 n은포트의 0~15까지비트를나타낸다. 입력으로설정되며 GPIOx_PIN 레지스터를통해해당비트의값을읽을수있다. 입력전용으로모드를만들경우핀은 tri-state(high impedance) 상태로되므로높은저항을원할경우다른장치와인터페이스되지만사용하지않을경우추천한다. 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 14/36

출력모드설정 (01) GPIOx_PMD 레지스터에서해당비트의 PMDn 값을 01으로설정하면된다. 디지털출력으로설정되며 High 일경우 GPIO에공급되는전압의출력과 Low 일경우 GPIO로흡수되는 Sink 전류의출력이가능하다. 출력제어는 GPIOx_DOUT 레지스터를통해할수있다. 내부구조는설정값그대로출력이되는 Push-Pull이고회로는출력모드로설정되어출력을유지하는 Latch 이므로비트를읽을경우비트의출력값이그대로읽혀진다. Port Latch Data로부터 Low 로출력되면 [ 그림 : Output Push-pull] 의 N FET가동작되어그라운드연결된다. 이때 Port Pin 에연결된부품의전기흐름은마이크로프로세서의그라운드로빠지게되는데이때전류를 Sink Current 하며과도한전류가외부로부터흐르지않도록회로설계를해야포트를전기적으로보호할수있다. 반대로 High 출력일때는 Source Current 한다. 그림 16. Output Push-Pull Open-Drain 입 / 출력모드설정 (10) GPIOx_PMD 레지스터에서해당비트의 PMDn 값을 10으로설정하면된다. [ 그림 : Open-Drain Output] 에서처럼 Open-Drain이므로 Low 출력은 Sink 전류로가능하지만 High 출력을할경우 High를유지할수있도록 Pull-up 저항을외부핀 (Port Pin 외부 ) 에추가해야한다. GPIOx_DOUT 레지스터를통해비트의로직을제어할수있다. 그림 17. Open-Drain Output Quasi-Bidirectional 입 / 출력모드설정 (11) MPU 가 Reset 된뒤기본적으로설정되는 Default 이며프로그램에의해변경하기위해서는 GPIOx_PMD 레지스터의해당비트 PMDn 값을 11 로기록하면된다. 양방향이긴하지만 High 출력 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 15/36

일때 Source Current는 Weak 저항을사용하므로 30uA~200uA(2.5V~5V 입력전원 ) 정도가되어큰구동능력은없다. GPIOx_DOUT을통해출력이 Low 일때 [ 그림 : Quasi-bidirectional I/O Mode] 에서처럼 N FET가구동되어 Low의 Sink Current가적용되고이때값을읽을경우 Low 로된다. 출력이 High 일경우 2개의 CPU 클럭지연동안은 P FET가동작되어 Strong Pull-up 저항이 ON되어 High가출력되고이내 Very Weak 저항이 ON되고 Strong 저항은 OFF 된다음 Weak 저항이 Port 출력의 High 값으로 ON 되게된다. 다시쓰면 High 출력일때는 Strong 풀업으로 High를 2 클럭동안유지하고 Very Weak와 Weak로변경하여 High를유지한다. 구조적으로포트가 Very Weak일때파손되면 High 출력은기대할수없을것으로보인다. 데이터시트후반부에기록되어있는 Spec 에는 5.5V ~ 2.0V공급으로 200uA ~ 650uA 정도로되어있다. 그림 18. Quasi-bidirectional I/O Mode PortA~PortE 의 GPIO 의기능설정은입력과출력을비롯하여모두 4 가지가된다. Default 로양방향 입력이가능하므로기본설정으로입출력의프로그램이가능하다고할수있다. GPIO Port A/B/C/D/E, I/O Mode Control (GPIOx_PMD) GPIOA_PMD GP_BA+0x000 GPIOB_PMD GP_BA+0x040 GPIOC_PMD GP_BA+0x080 R/W (default) 0xFFFF_FFFF GPIOD_PMD GP_BA+0x0C0 GPIOE_PMD GP_BA+0x100 [2n+1:2n] PMDn [default] [11] GPIO Pin[n] Mode 설정 00 : GPIO Port[n] pin INPUT mode. 01 : GPIO Port[n] pin OUTPUT mode. 10 : GPIO Port[n] pin Open-Drain mode. 11 : GPIO Port[n] pin Quasi-bidirectional. n 은비트를나타냄. 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 16/36

IBBOUM812_COM_T41_1_GPIO_LED/D8NN.uvproj - 부논리동작 2개의 LED 점등과 Buzzer 사운드 beep 음발생 - GPIO 지정 - Set, Clear를이용한특정핀제어 - 소프트웨어딜레이사용 그림 19. Cortex-M0 NUC140 그림 20. GPIO Output LED 그림 21. GPIO Output Buzzer // ============================================================= /* Purpose : NUC140 Cortex-M0 for IoT study 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 17/36

Project Name : GPIO Compiler : MDK ARM Compiler Document NO.: Target : FWB_IBB_OUM812_COM_T41 --------------------------------------------------------------------- Copyright by www.firmwarebank.com All Rights Reserved. */ #include "GLOBAL.H" #define DELAY 50000 void delay_soft(unsigned long n){ n <<=5; // while(n--); void beep(void){ DrvGPIO_SetBit(E_GPA, 12); // Buzzer On delay_soft(30000); DrvGPIO_ClrBit(E_GPA, 12); // Buzzer Off int main (void){ // Protecting 된 System Register의 Lock을해제. DrvSYS_UnlockProtectedReg(); // UNLOCKREG(); // 이렇게 Macro로호출해도동일 // Internal oscillator 22MHz를선택. DrvSYS_SetOscCtrl(E_SYS_OSC22M, ENABLE); // Clock Source가안정될때까지대기. delay_soft(1000); // System Register 를 Protect 합니다. DrvSYS_LockProtectedReg(); // Control Pin을 Output으로설정합니다. DrvGPIO_Open(E_GPA, 14, E_IO_OUTPUT); //YLED DrvGPIO_Open(E_GPA, 15, E_IO_OUTPUT); //BLED DrvGPIO_Open(E_GPA, 12, E_IO_OUTPUT); //Buzzer beep(); 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 18/36

while(1){ // led ON //DrvGPIO_ClrBit(E_GPA, 14); GPA_14=0; GPA_15=0; delay_soft(delay); //DrvGPIO_SetBit(E_GPA, 14); GPA_14=1; GPA_15=1; delay_soft(delay); // ================================================= 출력결과 Target - 부논리동작 2 개의 LED 를점등 - 부저사운드 Off - 소프트웨어딜레이 2.5. Cortex-M0 NUC140 SYSTEM 2.6. Cortex-M0 NUC140 Timer Timer 4개동작 Interrupt 사용 IBBOUM812_COM_T35_Timer4_Interrupt/D8NN.uvproj - Timer 4개동작 - E_TMR0 : 1초 - E_TMR1 : 0.5초 - E_TMR2 : 10mSec - E_TMR3 : 1mSec - 타겟보드 T41에서는동작되지않는다. only Target T35 // =============================================== source file start #include "GLOBAL.H" #define DELAY 10000 uint32_t u32data; 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 19/36

int32_t i; uint32_t u32freq; uint8_t count; volatile unsigned long tick_time0; // volatile을변경하면압축에서정상동작안될수있음 volatile unsigned long tick_time1; volatile unsigned long tick_time2; volatile unsigned long tick_time3; void delay_soft(unsigned long n){ n <<=5; while(n--); void TMR0_Callback(void) { tick_time0++; GPA_15 = (GPA_15)? 0 : 1; // LED Toggle void TMR1_Callback(void) { tick_time1++; GPA_14 = (GPA_14)? 0 : 1; // LED Toggle void TMR2_Callback(void) { tick_time2++; GPA_0 = (GPA_0)? 0 : 1; // LED Toggle void TMR3_Callback(void) { tick_time3++; GPA_1 = (GPA_1)? 0 : 1; // LED Toggle void timer0_delay(unsigned long t_count){ tick_time0=0; while((t_count > tick_time0)); void timer1_delay(unsigned long t_count){ tick_time1=0; while((t_count > tick_time1)); 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 20/36

void timer2_delay(unsigned long t_count){ tick_time2=0; while((t_count > tick_time2)); void timer3_delay(unsigned long t_count){ tick_time3=0; while((t_count > tick_time3)); int main (void){ UNLOCKREG(); DrvSYS_SetOscCtrl(E_SYS_OSC22M, ENABLE); delay_soft(1000); DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0x03); // Internal 22M DrvSYS_SelectPLLSource(E_SYS_INTERNAL_22M); DrvSYS_Open(50000000); // PLL clock 50000000 Hz, HCLK clock 50000000 Hz DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC, 7); // @22Mhz LOCKREG(); DrvGPIO_Open(E_GPA, 15, E_IO_QUASI); DrvGPIO_Open(E_GPA, 14, E_IO_QUASI); DrvGPIO_Open(E_GPA, 0, E_IO_OUTPUT); DrvGPIO_Open(E_GPA, 1, E_IO_OUTPUT); DrvTIMER_Init(); // all timer DrvTIMER_Open(E_TMR0, 1, E_PERIODIC_MODE); // 1=1Sec DrvTIMER_Open(E_TMR1, 2, E_PERIODIC_MODE); // 1/2=0.5Sec DrvTIMER_Open(E_TMR2, 100, E_PERIODIC_MODE); // 1/100=10mSec DrvTIMER_Open(E_TMR3, 1000, E_PERIODIC_MODE); // 1/1000=1mS DrvTIMER_SetTimerEvent(E_TMR0, 1, (TIMER_CALLBACK)TMR0_Callback, 0xA);// 1*1=1S DrvTIMER_SetTimerEvent(E_TMR1, 1, (TIMER_CALLBACK)TMR1_Callback, 0xB);// 0.5*1=500mS DrvTIMER_SetTimerEvent(E_TMR2, 1, (TIMER_CALLBACK)TMR2_Callback, 0xC);// 10m*1=10mS DrvTIMER_SetTimerEvent(E_TMR3, 1, (TIMER_CALLBACK)TMR3_Callback, 0xD);// 1m*1=1mS tick_time0=tick_time1=tick_time2=tick_time3=0; // Enable TIMER0 Intettupt 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 21/36

DrvTIMER_EnableInt(E_TMR0); DrvTIMER_Start(E_TMR0); DrvTIMER_EnableInt(E_TMR1); DrvTIMER_Start(E_TMR1); DrvTIMER_EnableInt(E_TMR2); DrvTIMER_Start(E_TMR2); DrvTIMER_EnableInt(E_TMR3); DrvTIMER_Start(E_TMR3); while(1){ timer0_delay(4); // 이렇게사용해도됩니다. // =============================================== source file end 출력결과 : Ch2 is 500ms Target 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 22/36

출력결과 : Ch4 is 1ms Target 2.7. Cortex-M0 NUC140 ADC 2.8. Cortex-M0 NUC140 UART 위즈네트사의 WizFi250을제어하기위해서는통신, 특히시리얼 UART가선행설계되어야한다. 여기서부터는실제적으로관련된기술이므로 Cortex-M0의제어를어떻게하는지잘익혀두어야시스템구현이가능하다. 특히 JTAG을이용하여 Debug 하는방법은요령이므로반복으로숙달해둘필요가있다. IBBOUM812_COM_T41_20_UART1_NO_INT/D8NN.uvproj - 인터럽트를사용하지않고 USB에연결된 UART1을제어했다. - 12800BPS로설정한뒤실험하고 - 터미널을통해빠르게입력하면어떻게데이터를 Loss 하는지확인하자. - JTAG을통해서도확인해야한다. // =============================================== source file start #include "GLOBAL.H" #define DELAY 100000 STR_UART_T sparam; unsigned char uartdata; unsigned char rxdata1; unsigned char readbyteuart1; 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 23/36

void delay_soft(unsigned long n){ n <<=5; while(n--); int main (void){ // 중복된사항중략... // Set UART Pin DrvGPIO_InitFunction(E_FUNC_UART1); DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0x3); sparam.u32baudrate = 128000; // BPS 주의 sparam.u8cdatabits = DRVUART_DATABITS_8; sparam.u8cstopbits = DRVUART_STOPBITS_1; sparam.u8cparity = DRVUART_PARITY_NONE; sparam.u8crxtriggerlevel= DRVUART_FIFO_1BYTES; DrvUART_Open(UART_PORT1, &sparam); DrvGPIO_Open(E_GPA, 14, E_IO_OUTPUT); //YLED DrvGPIO_Open(E_GPA, 15, E_IO_OUTPUT); //BLED DrvGPIO_Open(E_GPA, 12, E_IO_OUTPUT); //Buzzer DrvGPIO_ClrBit(E_GPA, 12); // Buzzer Off DrvGPIO_Open(E_GPC, 6, E_IO_OUTPUT); //WizFi250 Reset GPC_6=1;// Hi is no reset while(1){ if(drvuart_read(uart_port1, &rxdata1, 1) == E_SUCCESS){ readbyteuart1=rxdata1; DrvUART_Write(UART_PORT1, &readbyteuart1, 1); // =============================================== source file end 출력결과 UART1 : 128,000 BPS 1234567890 1234567890 123450 1234567890 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 24/36

3. Experience WIZnet 3.1. IIM7100A 3.2. W5100A 3.3. WizFi250 WizFi250 무선이더넷모듈특징 - Single band 2.4GHz IEEE 802.11b/g/n - Integrated RF power amplifier - Supports wireless data rates up to 65Mbit/s - 1MB Flash Memory, 128KB SRAM, 1MB Serial Flash - Supports per packet Rx Antenna diversity - Low power consumption & excellent power management performance - Small size, suitable for low volume system integration. - Easy integration into mobile and handheld devices flexible system configuration. - 2.412-2.484 GHz two SKUs for worldwide market. - Device Package : 28 20 mm (17 20 mm) - Serial Interface : UART, SPI - Powerful Web server provides - Soft AP, WiFiDirect - Sufficient memory retention - Wi-Fi Security (WEP, WPA/WPA2PSK) - L2 Switching - OTA(Over The Air F/W Upgrading) 250 모듈과인터페이스하기위해서는 2 가지통신방법이있다. 모듈에 UART 로처음통신하면 Command 모드로되고 SPI 통신으로하면 Data 모드로자동으로선정된다. - Command mode : 디폴트통신모드. 모든 AT 명령을사용할수있다. AT 명령을통해서사용자는시 스템관리및무선네트워크설정, 데이터송신 / 수신등의동작을수행할수있음 - Data mode : AT 명령없이어플리케이션계층의데이터를직접적으로송 / 수신하는모드 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 25/36

인터페이스실험을진행하기위해 Wifi 모듈과연결된 [ 그림 : Wizfi250 EVB] 보드와함께저자가설 계한 Cortex-M0 FWB-IBB-OUM812-COM 보드와연결하여진행했다. 스텝을나누어차래대로진행 한다. Station mode, TCP Server IBBOUM812_COM_T41_31_UART0_UART1_STMODE_Server/D8NN.uvproj - UART0/UART1 115,200BPS로통신 - UART0 : WizFi250으로송 / 수신 - UART1 : PC USB to Serial 연결 - WizFi250 TCP Server 동작 그림 26. WIZnet WizFi250 Module 과 MCU 연결 // =============================================== source file start #include "GLOBAL.H" #include "D8NN_Queue.H" #define DELAY 10000 #define QSIZE0 64 #define QSIZE1 64 #define YLED_ON 0x0001 STR_UART_T sparam; 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 26/36

// UART unsigned char get_char0; unsigned char get_char1; unsigned long read_pdid; unsigned char change; unsigned short flag; unsigned short key_count; unsigned char ucpass; unsigned short uspass; unsigned long ulpass; volatile unsigned long tick_time0; // volatile을변경하면압축에서정상동작안될수있음 volatile unsigned long tick_time1; volatile unsigned long tick_time2; volatile unsigned long tick_time3; struct ring{ // 구조체선언 unsigned long wp0; unsigned long rp0; unsigned char buffer0[qsize0]; unsigned long wp1; unsigned long rp1; unsigned char buffer1[qsize1]; ; typedef struct ring ring; ring q; // for Communication q-buffer void delay_soft(unsigned long n){ n <<=5; while(n--); void TMR0_Callback(void) { tick_time0++; if(flag & YLED_ON){ 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 27/36

GPA_14 = GPA_14^1; void TMR1_Callback(void) { tick_time1++; void TMR2_Callback(void) { tick_time2++; void TMR3_Callback(void) { tick_time3++; void timer0_delay(unsigned long t_count){ tick_time0=0; while((t_count > tick_time0)); void timer1_delay(unsigned long t_count){ tick_time1=0; while((t_count > tick_time1)); void timer2_delay(unsigned long t_count){ tick_time2=0; while((t_count > tick_time2)); void timer3_delay(unsigned long t_count){ tick_time3=0; while((t_count > tick_time3)); void init_qbuffer(void){// Ring Buffer의초기화 q.rp0=0; q.wp0=0; q.rp1=0; q.wp1=0; unsigned char check_pop0(void){ if(q.wp0!= q.rp0){ // Ring 의 Buffer 데이터확인 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 28/36

get_char0 = (q.buffer0[q.rp0]); q.rp0++; if(q.rp0>qsize0) q.rp0=0; return (1); return (0); // Empty 일경우 unsigned char check_pop1(void){ if(q.wp1!= q.rp1){ get_char1 = (q.buffer1[q.rp1]); q.rp1++; if(q.rp1>qsize1) q.rp1=0; return (1); return (0); void putstring0(unsigned char *str){ unsigned short i; unsigned char pass; // Point 문자열출력 for(i=0;str[i]!='\0';i++) { if(str[i]=='\n'){ pass=0x0d; DrvUART_Write(UART_PORT0, &pass, 1); pass=0x0a; DrvUART_Write(UART_PORT0, &pass, 1); else DrvUART_Write(UART_PORT0, &str[i], 1); // Cortex-M0, NUC140 void wizfi250_command0(unsigned char *com){ unsigned short i; unsigned char pass=0x0d; for(i=0; com[i]!='\0';i++) { DrvUART_Write(UART_PORT0, &com[i], 1); // Point 문자열출력 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 29/36

DrvUART_Write(UART_PORT0, &pass, 1); void putstring1(unsigned char *str){ unsigned short i; unsigned char pass; // Point 문자열출력 for(i=0;str[i]!='\0';i++) { if(str[i]=='\n'){ pass=0x0d; DrvUART_Write(UART_PORT1, &pass, 1); pass=0x0a; DrvUART_Write(UART_PORT1, &pass, 1); else DrvUART_Write(UART_PORT1, &str[i], 1); // Cortex-M0, NUC140 void UART0_Int_Handler(uint32_t param){ unsigned char rxdata; if(drvuart_getintstatus(uart_port0, DRVUART_RDAINT)){ while(uart0->isr.rda_if == 1){ if(drvuart_read(uart_port0, &rxdata, 1) == E_SUCCESS){ q.buffer0[q.wp0]=rxdata; q.wp0++; // Point 증가 if(q.wp0>qsize0) q.wp0=0; // Ring의마지막검사 else if(drvuart_getintstatus(uart_port0, DRVUART_TOUTINT)){ DrvUART_ClearIntFlag(UART_PORT0, DRVUART_TOUTINT); void UART1_Int_Handler(uint32_t param){ unsigned char rxdata1; if(drvuart_getintstatus(uart_port1, DRVUART_RDAINT)){ 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 30/36

while(uart1->isr.rda_if == 1){ if(drvuart_read(uart_port1, &rxdata1, 1) == E_SUCCESS){ q.buffer1[q.wp1]=rxdata1; q.wp1++; if(q.wp1>qsize1) q.wp1=0; else if(drvuart_getintstatus(uart_port1, DRVUART_TOUTINT)){ DrvUART_ClearIntFlag(UART_PORT1, DRVUART_TOUTINT); int main (void){ UNLOCKREG(); SYSCLK->PWRCON.OSC22M_EN = 1; delay_soft(1000); DrvSYS_SelectPLLSource(E_SYS_INTERNAL_22M); DrvSYS_Open(48000000);// Run 50hz DrvSYS_SelectHCLKSource(2); DrvGPIO_InitFunction(E_FUNC_UART0); DrvGPIO_InitFunction(E_FUNC_UART1); DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0x3); sparam.u32baudrate = 115200; sparam.u8cdatabits = DRVUART_DATABITS_8; sparam.u8cstopbits = DRVUART_STOPBITS_1; sparam.u8cparity = DRVUART_PARITY_NONE; sparam.u8crxtriggerlevel= DRVUART_FIFO_1BYTES; // Set UART Configuration DrvUART_Open(UART_PORT0, &sparam); DrvUART_Open(UART_PORT1, &sparam); DrvUART_EnableInt(UART_PORT0, DRVUART_RDAINT DRVUART_TOUTINT, UART0_Int_Handler); DrvUART_EnableInt(UART_PORT1, DRVUART_RDAINT DRVUART_TOUTINT, UART1_Int_Handler); DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC, 7); // @22Mhz DrvSYS_SelectIPClockSource(E_SYS_TMR1_CLKSRC, 7); // @22Mhz DrvSYS_SelectIPClockSource(E_SYS_TMR2_CLKSRC, 7); // @22Mhz DrvSYS_SelectIPClockSource(E_SYS_TMR3_CLKSRC, 7); // @22Mhz 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 31/36

DrvTIMER_Init(); DrvTIMER_Open(E_TMR0, 1, E_PERIODIC_MODE); // 1=1Sec DrvTIMER_Open(E_TMR1, 2, E_PERIODIC_MODE); // 1/2=0.5Sec DrvTIMER_Open(E_TMR2, 100, E_PERIODIC_MODE); // 1/100=10mSec DrvTIMER_Open(E_TMR3, 1000, E_PERIODIC_MODE); // 1/1000=1mS DrvTIMER_SetTimerEvent(E_TMR0, 1, (TIMER_CALLBACK)TMR0_Callback, 0xA);// 1*1=1S DrvTIMER_SetTimerEvent(E_TMR1, 1, (TIMER_CALLBACK)TMR1_Callback, 0xB);// 0.5*1=500mS DrvTIMER_SetTimerEvent(E_TMR2, 1, (TIMER_CALLBACK)TMR2_Callback, 0xC);// 10m*1=10mS DrvTIMER_SetTimerEvent(E_TMR3, 1, (TIMER_CALLBACK)TMR3_Callback, 0xD);// 1m*1=1mS tick_time0=tick_time1=tick_time2=tick_time3=0; DrvTIMER_EnableInt(E_TMR0); DrvTIMER_Start(E_TMR0); DrvTIMER_EnableInt(E_TMR1); DrvTIMER_Start(E_TMR1); DrvTIMER_EnableInt(E_TMR2); DrvTIMER_Start(E_TMR2); DrvTIMER_EnableInt(E_TMR3); DrvTIMER_Start(E_TMR3); DrvGPIO_Open(E_GPA, 14, E_IO_OUTPUT); //YLED DrvGPIO_Open(E_GPA, 15, E_IO_OUTPUT); //BLED DrvGPIO_Open(E_GPA, 12, E_IO_OUTPUT); //Buzzer DrvGPIO_ClrBit(E_GPA, 12); // Buzzer Off DrvGPIO_Open(E_GPC, 6, E_IO_OUTPUT); //WizFi250 Reset GPC_6=1;// Hi is no reset DrvGPIO_Open(E_GPA, 8, E_IO_QUASI); //1, Position 4 DrvGPIO_Open(E_GPA, 9, E_IO_QUASI); //2, Position 3 DrvGPIO_Open(E_GPA, 10, E_IO_QUASI); //4, Position 2 DrvGPIO_Open(E_GPA, 11, E_IO_QUASI); //8, Position 1 // Flash Button DrvGPIO_Open(E_GPB, 12, E_IO_INPUT); //button init_qbuffer(); timer1_delay(1); // 0.5 Sec 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 32/36

putstring1("receive data at WizFi250 :\n"); flag = YLED_ON; // flesh button key_count key_count=0; while(1){ if(gpb_12==0){ // flesh button 하나씩누를때마다하나씩실행 key_count++; timer1_delay(1); // 0.5 Sec if(key_count==1) {wizfi250_command0("at"); key_count++; if(key_count==3) {wizfi250_command0("at+wleave"); key_count++; if(key_count==5) {wizfi250_command0("at+wnet=1"); key_count++; if(key_count==7) { wizfi250_command0("at+wset=0,firmwarebank"); key_count++; // Author's Company Wifi if(key_count==9) { wizfi250_command0("at+wsec=0,,green01234567"); key_count++; // Author's Company PW // 저자의 PC는 ipconfig를통해확인하면 192.168.10.13 이여서비슷한방법으로서버 IP 지정 if(key_count==11) { wizfi250_command0("at+wnet=0,192.168.10.55,255.255.255.0,192.168.10.1"); key_count++; if(key_count==13) {wizfi250_command0("at+mprof=s"); key_count++; if(key_count==15) {wizfi250_command0("at+wjoin"); key_count++; if(key_count==17) {wizfi250_command0("at+scon=o,tsn,,0,5000,1"); key_count++; if(key_count==19) key_count=0; if(check_pop0()){ DrvUART_Write(UART_PORT1, &get_char0, 1); // UART0 으로온데이터 USB 에연결된 UART1 으로보냄 // =============================================== source file end 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 33/36

그림 27. 터미널출력결과 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 34/36

그림 28. Hercules 출력결과 출력결과 Target - Wifi State LED ON : Green LED 설계 - Mode State LED ON : Yellow LED 설계 4. 부록 4.1. 참고정보 - 위즈네트 : http://wiznet.co.kr - 위즈네트아카데미 : www.wiznetacademy.com - 강사블로그 : http://ilikethisplus.blogspot.kr - 강사블로그 : http://ilikethisplus.tistory.com 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 35/36

- 네트웍관련박물관 : http://wiznetmakerspace.com - hercules Setup Utility : http://www.hw-group.com/products/hercules/index_en.html - 와이어샤크유틸리티 : https://www.wireshark.org/download.html - AT Command : http://en.wikipedia.org/wiki/hayes_command_set - Command list : http://wizwiki.net/wiki/doku.php?id=products:wizfi250:wizfi250pg:start#command_list 4.2. 참고서적 을져야합니다. 문의 : conan@firmwarebank.com, Facebook : facebook.com/firmwarebank 36/36