ibb™-oum(intelligent black box)

36
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시리즈펌웨어개발 저자, [email protected] 차례 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

Upload: others

Post on 11-Feb-2022

6 views

Category:

Documents


0 download

TRANSCRIPT

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시리즈펌웨어개발 저자, [email protected]

차례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

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 3/36

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사의 제품을 이용하여 구현하였으며 위즈네트사의 도움 없이는 시작 할 수 없었

을 겁니다.

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 4/36

그림 4. IBB-OUM812-COM

본 설명서에서 다루고 실습을 통해 얻을 수 있는 것들

- Nuvoton社의 ARMⓇ 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

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 5/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이 없이 시리얼 통신 케이블만으로도 타겟보드에 이

식하는 포팅이 가능하므로 취미 개발자, 소규모 펌웨어개발에 적합하다고 하겠다.

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임을 져야 합니다. 문의 : [email protected], Facebook :

facebook.com/FirmwareBank 6/36

Part number APROM RAMData

Flash

ISP

ROMI/O Timer

Connectivity

I2S Comp. PWM ADC RTC EBIISP

ICPPackage

UART SPI I2C USB LIN CAN

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

4 KB

up to 31

4x32bit

2 1 2 1 2 1 1 1 4

8x12-bit

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

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 시리즈(노란부분이 우리가 사용하는 칩)

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 7/36

2.2. MDK-ARM CompilerM0 시리즈는 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나와 같은 고급언어이고 목적언어가 어셈블리 언어나 기계어일 경우 이를 번역해 주는 프로그램을

컴파일러라 한다. 어떤 마이크로프로세스는 고급언어가 지원되지 않고 어셈블리만 있기도 하지만 대부

분은 하나이상의 고급언어를 제공한다.

컴파일을 하기 위하여 입력되는 프로그램을 원시 프로그램이라 하고 이 프로그램을 기술한 언어를 원

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 8/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이다. 설치 할 때는 경로를 한글로 하는

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 9/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을 나타낸다.

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 10/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

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 11/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)

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 12/36

2.3. Nu-Link-Me JTAGC 소스 언어로 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 핀에 연결하면 전원과 같이 공급 되면서 물리적인 방법은 완료다.

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 13/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의 버전번호 다를 경우

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 14/36

2.4. Cortex-M0 NUC140 GPIOGPIO(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) 상태로 되므로 높은 저항을 원할 경우 다른 장치와 인터페이스 되지만 사용하지 않을 경

우 추천한다.

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 15/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’ 출력

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 16/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

R/W (default) 0xFFFF_FFFF

GPIOB_PMD GP_BA+0x040

GPIOC_PMD GP_BA+0x080

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은 비트를 나타냄.

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 17/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

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 18/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();

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 19/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;

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 20/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));

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 21/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

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 22/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

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 23/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;

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 24/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

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 25/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 명령 없이 어플리케이션 계층의 데이터를 직접적으로 송/수신하는 모드

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 26/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;

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 27/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){

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 28/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){ // Ring의 Buffer 데이터 확인

if(q.wp0 != q.rp0){

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 29/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){ // Point 문자열 출력

unsigned short i;

unsigned char pass;

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){ // Point 문자열 출력

unsigned short i;

unsigned char pass=0x0d;

for(i=0; com[i]!='\0';i++) {

DrvUART_Write(UART_PORT0, &com[i], 1);

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 30/36

}

DrvUART_Write(UART_PORT0, &pass, 1);

}

void putstring1(unsigned char *str){ // Point 문자열 출력

unsigned short i;

unsigned char pass;

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)){

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 31/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

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 32/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

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 33/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

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 34/36

그림 27. 터미널 출력결과

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 35/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

══════════ 32Bit MCU(Embedded Product) IBB_OUM812_COM_WizFi250_WIZ550io_CortexM0_NUC140_V29_배포.hwp

This item is originally designed by Conan Kim. 원고의 내용이나 문구를 김형태 허락 없이 무단으로 이용 하실 경우 법적인 책임

을 져야 합니다. 문의 : [email protected], Facebook : facebook.com/FirmwareBank 36/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. 참고서적