캐시 없이 웹 페이지 로딩하기



웹 프로그래밍을 하다보면 CSS나 Javascript로 작업을 하다가

바뀐 기능이나 디자인을 확인해야하는 경우가 매번 있다.


그러나 브라우저는 빠른 접근을 위하여, 이미 방문한 웹페이지를 '캐싱'해두는데,

이 때문에 변경된 내용이 제대로 반영되지 않는 경우가 있다.


크롬에서는 이를 위하여 개발자 도구가 켜져 있을 경우 캐싱을 하지 않는 옵션이 있다.





우선, 구글 개발자 도구를 열고 설정 탭을 클릭한다.

설정탭은 제일 우측 점 3개 아이콘이다.

여기서 Settings 카테고리로 들어가자.






Settings를 열면 여러 메뉴가 나오는데 이중 Preferences를 선택한다.

스크롤을 조금 내리면 Network를 확인할 수 있다.

이 중에서 Disable cache(While DevTools is open)에 체크하면 캐시 설정이 완료된다.



저작자 표시
신고

mac - 특정 포트를 사용중인 프로세스 확인/종료




node 작업을 프로젝트를 넘나들면서 하다보니

이유는 모르겠지만 터미널이 꺼졌는데도 불구하고 port상태는 listen인 경우가 있었다.


이때 특정 포트를 사용중인 프로세스를 점검하고

kill 명령어로 종료 시켜야한다.




1
2
sudo lsof -i :"포트 번호"
sudo kill -9 "프로세스 번호"
cs


첫번째 줄의 명령어를 입력해서 해당 포트를 사용하고 있는 프로세스를 찾는다.

해당 두번째 명령어로 종료시키면, 깔끔하게 프로세스가 사라지게 된다.





node를 실행 시키려다가 포트가 이미 막혀서 실패했었는데

프로세스를 종료시키고 실행하니

올바르게 서버가 열리는것을 확인할 수 있었다.


저작자 표시
신고


PCB,Printed Curcuit Board





전자공학에서, 인쇄 회로 기판(印刷回路基板) 혹은, PCB(피시비)는, 기계적 지원에 사용되고 동기판에서 비전도 "기판"으로 습식 식각한 전도선이나, 신호 선을 사용하여 전기적으로 전자 부품을 연결한다. 대체 명칭으로 인쇄 와이어 본딩(PWB)와, 식각 와이어 본딩라고 불린다. 전자 부품이 "부착된" 보드는 인쇄 회로 조립(PCA)이라고도 불리며, 인쇄 회로 기판 조립(PCBA)이라고도 알려져 있다.

출처 : 위키 백과


Printed Curcuit Board의 이니셜로서 직역하면 인쇄된 회로판을 뜻한다.

쉽게 말해 우리가 주변에서 흔히 볼수 있는 기판들이 PCB이다.

전기나 전자회로가 구성될 때


예를 들면 진공관을 사용할 때는 주로 진공관을 소켓에 꼽고 소켓의 다리에 와이어(선)로 필요한 결속을 하는 것이 보통이었는데 반도체등의 발달로 소형화, 경량화, 집적화하면서 회로의 구조도 혁신이 있게 되었다.


다름아닌 부도체의 재질에 필요한 회로를 구성하고 요소요소에 관련부품을 꽂아 예전의 결선을 대체하는 모습을 하게 된 것이다. 이 것이 바로 PCB이다.


PCB의 적층만으로도 경량화, 소형화, 집적화를 달성할 수 있었다.


현재 PCB를 활용한 회로의 구성의 발달 추이는 SMD부품을 보다 정밀하게 부착하여 더욱 소형화, 경량화, 집적화를 지향하고 있다.





- 실제 PCB 발주까지의 과정 -



1. 회로 설계

Orcad 등의 툴을 이용하여 회로를 설계한다. PADS에서도 회로 설계를 할 수 있는 툴을 제공하지면 Orcad로 회로를 설계하고 PADS로 아트웍을 하는 경우가 많다. 설계를 위한 부품 라이브러리를 등록하도록 하자.


2. 아트웍

PCB Borad Outline 그리기, 부품 올리기, 배치, 라우팅의 과정을 거쳐 아트웍을 설계한다. 이 후 에러체크가 끝나면 Copper Pour로 ground를 설정해준다. 다음은 부품의 이름을 구분하기 위한 텍스트인 silk를 설정해주며 마무리한다.


3. 거버 파일 만들기

아트웍을 하는 툴은 다양하다. 때문에 업체에서는 공통된 파일을 가지고 작업하는 해야하는데 이때 사용되는것이 거버 파일이다. 따라서 PCB발주를 위해서, 내가 제작한 아트웍의 거버파일을 추출해야한다. 거버파일 추출을 위하여 solder Mask와 실크, Drill 등에 대한 설정을 완료해야한다.




고려사항 : 장홀,(연배열,테스트 보드),fiducial mark(인식마크)등을 표시,V cut,,재질(fr-4),두께(1.6t(1.6mm)),(양면,다층),수량,(자삽, 수삽),회사명, 담당자 및 연락처, 납기일




 PCB 판 준비-> Via 뚫기 -> 동 입히기 -> 부식 -> Solder Mask 처리 -> 실크 공정



출처 : http://www.pcbartwork.co.kr/BASIC_PADS



저작자 표시
신고

'IT 관련 > Dummy' 카테고리의 다른 글

[생산] PCB란  (0) 2017.04.18
[생산] SMT란  (0) 2017.04.18
[Spark] Start 소스 분석  (0) 2017.04.18
[Spark] 스파크 모듈 소개  (0) 2017.04.18
[Spark] 스파크 모듈 개발환경 구축  (0) 2017.04.18
[Smartrobot] 아두이노 포팅  (0) 2017.04.18

Surface Mount Technology, 표면 실장 기술



아트웍에 이어 샘플 PCB를 제작 후 테스트하여 제품의 프로토타입을 만든다.


이후 오류를 잡아내고 안정화를 거쳐 대량생산을 하게 된다.


이 때 작은 SMD 타입의 반도체 소자를 SMT 기기를 이용하여 대량 제작하는것이


SMT 기술이다.


SMT의 가장 큰 특징은 기존의 IMT방식(수삽)이 가지고 있던 단점을 극복하여


양면 실장이 가능하다는 것이다.


SMT의 등장 배경은 전자 제품의 Needs에 따라 경쟁력을 갖추기 위하여


1. 소형화


2. 고집적화, 고기능화


3. 고밀도 실장화


3가지 이점을 가진 제품을 추구하는데서 비롯되었다. 




표면 실장 공정의 흐름도



SMT 공정의 흐름도는 다음과 같다.




실제로 SMT 발주를 위해 필요한것은 크게 두가지이다.


1. SMT에 들어갈 부품들의 자료인 파트리스트와


2. SMT기기의 좌표값이 추출된 Excel파일


PADS등과 같은 툴을 이용하여 좌표값을 추출할 수 있다.



출처 : http://www.smtkorea.co.kr/bbs/board.php?bo_table=board9




저작자 표시
신고

'IT 관련 > Dummy' 카테고리의 다른 글

[생산] PCB란  (0) 2017.04.18
[생산] SMT란  (0) 2017.04.18
[Spark] Start 소스 분석  (0) 2017.04.18
[Spark] 스파크 모듈 소개  (0) 2017.04.18
[Spark] 스파크 모듈 개발환경 구축  (0) 2017.04.18
[Smartrobot] 아두이노 포팅  (0) 2017.04.18

Start 소스 분석


저번에 받은 Spark용 개발환경을 바탕으로 소스분석을 해보겠습니다.


아무래도 같은 STM32 코어를 사용하더라도 모듈마다 주변장치나 구성이 다르기 때문에 동작하는데 조금씩 차이가 있을것입니다. 하지만 같은 코어 기반이므로 동작원리는 거의 비슷하다고 보시면 될것 같습니다.


Spark -> Sprak:C -> core-firmware -> src -> startup -> startup_stm32f10x_md.S 로 들어갑니다.


.S확장자는 어셈블리어로 작성된 코드입니다.

어셈블리어는 컴퓨터 구조시간에 약간 본것 외에는 경험이 없어서 이곳저곳 찾아보면서 분석을 해야했습니다.


<소스코드>


Reset_Handler:


/* Copy the data segment initializers from flash to SRAM */  

  movs r1, #0      // r1 레지스터에 0을 넣는다.

  b LoopCopyDataInit    // LoopCopyDataInit으로 이동(jump) 함


CopyDataInit:

ldr r3, =_sidata    // _sidata가 가르키는 메모리의 주소값을 r3 레지스터에 저장.

ldr r3, [r3, r1]    // r1값을 offset으로 하여 r3+r1의 주소값을 r3에 불러온다.

str r3, [r0, r1]    // r1값을 offset으로 하여 r0+r1의 주소값을 r3에 저장한다.

adds r1, r1, #4      // r1에 r1+4의 값을 저장한다.

    

LoopCopyDataInit:

ldr r0, =_sdata     // r0에 _sdata의 주소값을 불러온다.

ldr r3, =_edata     // r3에 _edata의 주소값을 불러온다.

adds r2, r0, r1      // r2에 r0+r1의 값을 저장한다.

cmp r2, r3          // r2와 r3값을 비교함.(Carry 생성)

bcc CopyDataInit    // 캐리값이 없을경우 CopyDataInit으로 분기함

ldr r2, =_sbss      //  r2에 _sbss의 주소값을 불러온다.

b LoopFillZerobss // LoopFillZerobss로 이동(jump) 함.


FillZerobss:

movs r3, #0      //  r3에 0을 저장.

str r3, [r2], #4    // r3에 r2+4의 값을 저장(store).

    

LoopFillZerobss:

ldr r3, = _ebss     // r3에 _ebss를의 주소값을 불러온다.

cmp r2, r3          // r2와 r3값을 비교함.

bcc FillZerobss    // 캐리값이 없을경우 FillZerobss으로 분기함

/* Call the clock system intitialization function. */

bl  SystemInit          // r14(LR)에 주소를 저장한후 SystemInit 함수로 이동.

/* Call the spark core configuration function. */

bl  SparkCoreConfig     // r14에 주소를 저장한후 SparkCoreConfig 함수로 이동.

/* Call C++ constructors. */

bl CallConstructors// r14에 주소를 저장한후 SparkCoreConfig 함수로 이동.

/* Call the application's entry point. */

bl main            // r14에 주소를 저장한후 main 함수로 이동.

bx lr              // thumb,ARM 모드변경후 lr 함수로 이동.

.size Reset_Handler, .-Reset_Handler




전체 말고 중요한 코드들만 복사해봤습니다. 한글로 된 주소는 구글링을 통해 명령어의 기능을 파악하여 적은것입니다. 아직 이해가 바탕이 되지 않았기 때문에 틀린 부분이나 어색한 부분이 있으나, 이해하는데는 큰 무리가 없어 보입니다. 추후 수정하도록 하겠습니다.


초기에 모듈에 전원이 공급되면 reset_Handler로 진입을 합니다. 함수의 몸체에서 보시는바와 같이 reset_handler의 수행이 완료 될시 LoopCopyDataInit로 분기를 합니다. 다시 LoopCopyDataInit의 함수 내부에서 다른 함수로 분기하고 이러한 과정들이 반복되며 함수가 수행되고, Main함수까지 진입을 하게 됩니다. 표로 도식화 하면 다음과 같습니다.





이 후 소스를 더 분석하기 위해서 reset_handler 다음의 함수들이 어떤식으로 구성되어있는지 일일히 찾아봐야 할 것 같습니다. 예를들어 systemInit에는 시스템이 동작하기 위해 클럭이 세팅되는 함수들이 있겠지요. 초기 실행하는 함수들을 다 이해하면 stm32에대한 이해가 많이 높아 졌다고 보시면 될것 같습니다. 프로그래밍은 주변장치에 대한 클럭 인가와 레지스터 설정만 해주면 되기 때문이죠.


다음은 더 내부로 들어가 표에 있는 함수들을 더 깊게 분석해 보도록 하겠습니다.

저작자 표시
신고

'IT 관련 > Dummy' 카테고리의 다른 글

[생산] PCB란  (0) 2017.04.18
[생산] SMT란  (0) 2017.04.18
[Spark] Start 소스 분석  (0) 2017.04.18
[Spark] 스파크 모듈 소개  (0) 2017.04.18
[Spark] 스파크 모듈 개발환경 구축  (0) 2017.04.18
[Smartrobot] 아두이노 포팅  (0) 2017.04.18


STM32를 공부한지는 얼마 안되었지만 이거저거 사고 굽고 태워먹고 하면서 접해본 모듈이 몇가지 되네요


그중에서도 지금 사용하는 모듈은 Paticle의 Spark Photon이라는 모듈인데요

사실 이것도 정식명칭인지는 모르겠습니다 맞겠죠.


홈페이지에서 판매중인 모듈들입니다.

Core에 SOLD OUT 딱지가 붙어있습니다. 이유는 잘모르겠지만 품절이네요.





사실 저도 이걸 쓰면서 왜 사용하라고 했는지 잘 몰랐으나 오늘 그 기능을 써보니 참 신기했습니다.

단순히 와이파이가 내장된 모듈로만 알고 있었으나, 원격으로 High, Low가 조정이 되더라고요.


그럼 긴말 말고 바로 기능에 대해서 설명 드리겠습니다.







앱 설명도 공돌이가 썼나봅니다



먼저, 앞에서 포스팅 했던것과 같이 개발환경을 구축하여 

application.c를 컴파일, 타겟보드에 Write해줍니다.

Write가 완료되면 구글스토어에서 Paticle 앱을 찾아 다운로드 합니다.

해당앱은 Paticle에서 나온 모듈들을 원격으로 제어 할 수 있는 어플리케이션입니다.









모듈의 Boot 버튼을 3초동안 누르면 파란색 불이 깜빡거리는 와이파이모드 바뀝니다.

이 후 핸드폰의 와이파이 설정을 ON하고 어플리케이션에 접속하여 

제어 할 디바이스를 찾습니다.







현재 연결된 디바이스는 Photon입니다. 실제 모듈과 핀배치가 동일하게 나오네요.

화면과 같이 사용할 핀을 누르면 4가지 모드가 활성화 됩니다.

digital read/write는 흔히 쓰는 GPIO의 기능이고

analog read/write는 PWM 기능입니다.







GPIO의 경우 한번 터치할때마다 High와 Low가 바뀌고 PWM 모드는 드래그를 통하여 

듀티비를 조정 할 수 있습니다.

자, 그럼 A5를 Output으로, A4를 듀티비가 50%정도인 PWM으로 활성화 해보겠습니다.








오실로스코프와 보드의 모습입니다.

다운로드와 전원공급에 필요한 USB선과 프로브를 제외한 다른 선은 없습니다.

세그먼트는 그냥 달아 놨습니다.







먼저 Output으로 설정한 A5핀의 모습입니니다.

오실로스코프로 찍어본 결과 5V/High가 잘 출력 되는 것을 볼수 있습니다. 







다음은 PWM을 설정한 핀입니다. 

50%정도의 듀티비로 PWM 파형이 깔끔하게 나오고 있습니다.








그렇다면 이번엔 PWM의 듀티비를 조금 올려볼까요.

90%에 가깝게 어플리케이션에서 조정을 해 보았습니다.







역시 잘뜨네요








 

어플리케이션의 경우 소스가 오픈되어있는지 모르겠습니다.

 

오픈이 되어있지 않더라도 스스로 앱을 만든다 던지 원격으로 통신을 하여 현재 주목받고 있는 Iot 기술이나 여러분야에 접목시켜 많은 프로젝트를 진행 할 수 있을것 같습니다.

프로그래밍 후 Write시켜주는 번거로움이 없어서 그런지 편하고 신기한 기능인것 같습니다.



 

저작자 표시
신고

'IT 관련 > Dummy' 카테고리의 다른 글

[생산] SMT란  (0) 2017.04.18
[Spark] Start 소스 분석  (0) 2017.04.18
[Spark] 스파크 모듈 소개  (0) 2017.04.18
[Spark] 스파크 모듈 개발환경 구축  (0) 2017.04.18
[Smartrobot] 아두이노 포팅  (0) 2017.04.18
[STM32] 소스에서 메모리 주소 찾기  (0) 2017.04.18

스파크 모듈 개발 환경 구축


M3가 코어로 사용된 STM32를 기반으로하는 Spark 모듈의 Windows 개발환경 구축에 

대해서 알아보도록 하겠습니다.

자료는 하단 유튜브의 강의 자료를 기반으로 작성되었습니다.

https://www.youtube.com/watch?v=xBCxYbtDbVA




1)폴더 생성

C드라이브에 'SparkCorePrograms'와 'Spark'폴더를 생성합니다.

앞으로 다운 받는 Spark 관련 자료들은 해당 폴더들로 이동 할 것입니다.

폴더 생성 후 자료를 다운 받기 위하여 Spark 자료들이 있는 github로 이동합니다.

https://github.com/spark/firmware#1-download-and-install-dependencies






 

2)GCC 다운로드

 

접속한 페이지에서 하단으로 스크롤을 내려서 먼저 GCC 카테고리를 찾습니다.

github에서 계속 다운로드를 하여야 하므로 링크를 새 탭에서 여는것을 권장합니다.

 






 

페이지 오른쪽 하단의 초록색 다운로드 버튼들이 있습니다.

이 중 gcc-arm-non...4-win32.exe를 다운 받습니다.

다운받은 후 곧바로 설치를 진행합니다.


 




 

 

 

별도의 사용자 지정 없이 다음을 눌러 설치를 진행하다가

 

다음과 같은 화면이 나오면 반드시 'add path to environment variable'

체크를 한 후 완료를 누릅니다.




 

 


 

설치 완료 후 C:\ProgramFile안에 있는 GNU Tools 폴더를 미리 생성해두었던 SparkCorePrograms 폴더로 이동합니다.

C:\ProgramFile\GNU tools->C:\SparkCorePrograms\GNU tools






 

3)Make 다운로드

 

Gcc 설치 완료 후 github로 돌아가서 Make를 다운로드 합니다.

GCC와 마찬가지로 새 탭으로 경로에 접속합니다.





 

 


 

페이지 하단에서 complete Package, except sources 파일을 찾아 

Setup을 누르면 설치가 진행됩니다.

설치한 파일은 실행하여 별도의 사용자 지정없이 다음을 눌러 설치를 진행합니다.







 

설치 완료 후 GCC와 마찬가지로 GnuWin32 폴더를 SparkCorePrograms 폴더로

이동시킵니다.

C:\ProgramFile\GnuWin32->C:\SparkCorePrograms\GnuWin32




 

 

4)DeviceFileUpgrade(DFU) 다운로드

 

계속해서 DeviceFileUpgrade 파일을 다운받습니다.

링크된 URL로 들어갑니다.






 

접속 후 하이퍼 링크된 release를 클릭하면 다운 가능한 목록이 뜨는데






 

그 중 dfu-util-0.7-binaries-7z 파일을 찾아 다운 받습니다.





 


 

dfu를 저장하기 위해 SparkCoreProgram 폴더에 dfu폴더를 생성 후

다운받은 dfu zip파일을 실행시킵니다.



 



 

 

 

실행시킨 zip파일에서 win32-mingw32 폴더로 들어가서

다음과 같은 4개의 파일을 생성해둔 dfu폴더 안으로 이동시킵니다.

 




 


 

 
5)Zatig 다운로드

 

다음은 드라이버를 설치해주는 Zatig을 설치 해야합니다.

 

위와 마찬가지로 링크로 이동합니다.




 


 

페이지 하단에 자신의 컴퓨터 사양과 맞는 다운로드 링크를 찾아 설치를 진행합니다

설치 된 exe파일은 원활한 실행을 위하여 바탕화면으로 이동시키는 것을 권장합니다.





6)Git 다운로드

 

다음은 Git 다운로드 링크로 이동합니다.




 



 


 

이동한 git 다운로드 페이지에서 윈도우용 git(Download for Windows)을 다운 받습니다.

다운받은 후 바로 설치를 진행합니다.

 







 

설치를 진행하다가 git 설정에서 '윈도우 커맨드 프롬프트에서 실행'을 체크해줍니다.

 





 


 

설치된 Git파일도 앞서 설치한 파일과 마찬가지로 SparkCorePrograms로 이동시킵니다.






 

7)환경변수 설정

 

다음, github에 올라간 파일을 다운로드하기위하여 환경변수를 설정해 주어야하는데 파일들이 설치된 설치 경로를 입력해주어야합니다.

 

시작->컴퓨터(오른쪽버튼)->속성->고급 시스템설정->고급 탭->환경변수에 진입하여

이름이 PATH인 변수에 대하여 기존의 경로값을 지우고

path = C:\SparkCorePrograms\dfu;C:\SparkCorePrograms\Git\bin;C:\SparkCorePrograms\GNU Tools ARM Embedded\4.9 2015q2\bin;C:\SparkCorePrograms\GnuWin32\bin

를 입력해줍니다.







 

이 후 보조프로그램-> 명령 프롬프트를 실행시킨 뒤 

커맨드 창에도 다음과 같이 동일한 환경변수 값을 입력해 줍니다.





 

7)git 파일 다운로드

 

이 후 프롬프트 창에서 cd명령어로 Spark폴더로 이동 후 

github내의 파일을 다운로드 하는 명령어들을 입력합니다.

명령어는 다음과 같습니다.

git clone https://github.com/spark/firmware.git

git clone https://github.com/spark/core-common-lib.git

git clone https://github.com/spark/core-communication-lib.git

 3개의 파일들을 모두 설치합니다.

 





 


 

여기서, 권한에 대한 오류로 git명령어가 동작하지 않을 경우

 

git config --system http.sslcainfo "C:\git\bin\curl-ca-bundle.crt가있는 폴더이름"

git config --system http.sslverify false

이 두가지 명령어를 입력 후 설치를 시도해봅니다.

 




 


 

 

7)컴파일 및 드라이버 설치

 

모든 설치가 완료되면 프롬프트창에서 cd명령어로 Spark->core-firmware로 이동 후

 

git pull 명령어를 실행합니다.

이 후 cd명령어로 core-firmware->bulid 폴더로 이동하여 make명령어로 컴파일을 진행합니다.

컴파일 완료 후 USB선을 이용하여 DFU모드로 전환된 Spark모듈을 컴퓨터에 연결하면 드라이버가 설치되지 않았다는 팝업창이 뜹니다.

(reset boot 버튼을 동시에 눌렀다가 reset을 먼저 떼고 LED가 노란색 이 될 때까지 기다린후 boot버튼을 떼면 DFU모드로 전환이 된다.)

이 때 바탕화면에 다운받은 zadig를 실행시킵니다.







 

Device DFU로 설정하고 드라이버 설치를 진행합니다.

 

이 후 프롬프트창에 dfu-util -l 명령을 하였을 때

Found DFU: [1d50:607f] devnum=0, cfg=1, intf=0, alt=0, name="@Internal Flash /0x08000000/20*001Ka,108*001Kg"

Found DFU: [1d50:607f] devnum=0, cfg=1, intf=0, alt=1, name="@SPI Flash : SST25x/0x00000000/512*04Kg"

가 출력되어야 제대로 드라이버 설치가 완료된 것입니다.

이후 바이너리파일을 실행해야하는데 github페이지에서 주어진

D:\Spark\firmware\build [master]> dfu-util -d 1d50:607f -a 0 -s 0x08005000:leave -D core-fi

에서 붉은색으로 표시된 부분은 

 





 


 

USB ID에 표시된 부분으로 변경하여야하고 뒷부분은 Write될 주소값인데 0x08005000

 

core 모델의 주소값이고 Pothon 모델을 사용할 경우 주소값은 0x80A0000로 설정해 주어야 write가 진행됩니다.

바이너리 파일까지 실행시켰으면 거의 완료.

 





8)IDE(net Beans) 다운로드

 

 

다음으로 컴파일을 진행 할 IDE를 다운받아야합니다.

 

오라클에 접속하여 netbeans를 다운 받는다. 링크는 다음과 같습니다.

www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html

우측의 netbeans를 자신의 운영체제에 맞는 버전으로 다운받고 설치를 진행합니다.

 





 


 

 

 

익명 데이터에 대한 contribute는 체크 해제 한 후 완료합니다.






 

 

9)툴체인(cygwin) 다운로드

 

마지막으로 툴체인 cygwin을 다운받고 설치를 진행한다. 링크는 다음과 같습니다

www.cygwin.com




 


 

 

 

설치 중 user URL을 입력하라는 창이 뜨는데 URL은

http://cygwin.mirror.constant.com

으로 설정합니다.

계속해서 별도의 사용자 지정없이 다음을 눌러 설치를 완료합니다.





 

10) IDE 개발환경 설정

 

설치완료 후 netbeans를 실행합니다.

플러그인 설정을 위하여 tools->plug ins->aviliables plugins탭에 들어갑니다.

목록 중

C/C++

Show path in titlebar

git toolbar

open URL of GIT repository hoster

를 선택 후 설치를 진행합니다.(노란 경고창이 뜨면 continue를 눌러 설치를 진행한다)

 

플러그인 설정 완료 후 다시 tools->option으로 들어갑니다.

프록시는 NO Procy로 설정,

계속해서 상단의 C/C++탭으로 이동 후





 

 


 

Toolchain을 추가시켜줍니다. 경로는

SparkCorePrograms->GNU Tools ARM 내의 폴더를 open합니다.(동영상 기준 4.8 2013q4)




 



 

 

.
툴체인은 다운받은 GNU 4.x Cygwin으로 설정해줍니다

 





 


 

 

 

 C 컴파일러: SparkCorePrograms->GNU Tools ARM-> 4.8 2013q4->bin->arm-none-eabi-gcc.exe

 C++ 컴파일러: SparkCorePrograms->GNU Tools ARM-> 4.8 2013q4->bin->arm-none-eabi-g++.exe

 어셈블러:SparkCorePrograms->GNU Tools ARM->4.8 2013q4->bin->arm-none-eabi-as.exe

으로 설정합니다







 

C/C++ 프로젝트 생성

 







 

셀렉트 모드의 경로는 C:\Spark, Custom으로 설정합니다.

 






 

Build 파일의 경로는

C:/Spark/core-firmware/build/makefile

을 열어줍니다.

 




 




 

경로는 C:\Spark로 지정 후 프로젝트 생성을 마친다

 

 






 


 

프로젝트->우클릭->Reparse Project

 

프로젝트->우클릭->configure code Assistance

를 설정한다. configure code Assistance의 경우

활성화된 창에서 설정없이 next를 누르면 된다.


 




 



 

프로젝트->우클릭->property->run에서 PATH를 수정하는데

 

뒤에 앞서 실행하였던 바이너리 파일의 경로를 붙여줍니다.

 

dfu-util -d 2b04:d006 -a 0 -s 0x080A0000:leave -D core-firmware.bin

 

이 후 좌측 프로젝트 창에서

core-firmware->src->application.cpp를 클릭,

build합니다.

 

모듈을 DFU모드로 전환 후 컴퓨터와 연결합니다.

 

 






run 버튼을 누르고 excutable 설정을 해준다. 경로는 dfu폴더 내의 dfu-util.exe입니다.





 

 

다운로드 완료





 

 

 


 

다운로드가 되지 않을 경우

프로젝트->우클릭->property->run에서

console type Standard output으로 변경해줍니다


저작자 표시
신고

'IT 관련 > Dummy' 카테고리의 다른 글

[Spark] Start 소스 분석  (0) 2017.04.18
[Spark] 스파크 모듈 소개  (0) 2017.04.18
[Spark] 스파크 모듈 개발환경 구축  (0) 2017.04.18
[Smartrobot] 아두이노 포팅  (0) 2017.04.18
[STM32] 소스에서 메모리 주소 찾기  (0) 2017.04.18
[STM32] STM32 세미나  (0) 2017.04.18


오늘은 오로카 강좌용 보드인 STM32- Smartrobot 보드를 이용하여 아두이노 포팅을 해 보았습니다.

해당 보드에 대한 핀맵 및 회로도는 아래 링크에 있습니다.




http://cafe.naver.com/openrt/1812





- 포팅 -

포팅이란?
:이식(移植) 또는 포팅(porting)은 컴퓨터 과학에서 실행 가능한 프로그램이 원래 설계된 바와 다른 컴퓨팅 환경(이를테면 CPU운영 체제, 서드 파티 라이브러리 등)에서 동작할 수 있도록 하는 과정을 가리킨다. 이 용어는 소프트웨어나 하드웨어가 다른 환경에서 사용할 수 있게 변경되는 것에도 해당한다. 소스 하나로 여러 플랫폼에서 사용할 수 있는 것을 크로스 플랫폼으로 부른다.


 

사실 저도 공부한지 얼마 안되어서 포팅이 뭔지 명확하게 개념이 잡혀있지 않습니다.

여기 저기 물어본 결과 비유하자면 심장을 이식 할 때 기증자의 심장이 수혜자의 몸에서 최대한 거부 없이 뛸수 있도록 주변 환경을 맞추어 주는 것입니다.

자바 버츄어 머신과 비슷하게 이해했는데 그게 아니라 프로그램이 해당 플랫폼에서 동작할 수 있도록 밑단 자체를 갈아주는 것이라고 하더라고요.

혹시 잘못된 개념이있다면 수정 하도록하겠습니다.


쉽게 생각해서 윈도우에서 돌아가는 프로그램을 리눅스에서도 돌아가게 바꾸어주는 작업을 포팅이라고 볼수 있습니다.

지금 하는 건 STM이라는 다른 환경에서 아두이노가 돌아갈수 있도록 세팅해 주는 것이지요








- 개발환경 -



우선 아두이노 홈페이지에 접속하여 Windows 버전 최신 아두이노를 설치합니다.
아두이노 홈페이지->다운로드에 들어가서 우측 하단 Windows Installer를 클릭하시면 됩니다.
자동설치인 Installer가 실행되지 않으시면 아래에 있는 ZIP파일을 다운 받으셔도됩니다.

다운로드 실행 후 설치를 진행합니다. 별도의 사용자 지정없이 '다음'을 눌러 설치해 주시면됩니다. 설치과정을 찍으려고 했는데 이미 완료되어서 제거 모드로 진행되네요.






아두이노 설치 후 STM32 포팅 파일을 하단의 경로에 넣어줍니다.
설치된 아두이노경로 hardware 폴더 안 입니다. 사진의 Arduino_STM32가 포팅 파일입니다.






 

그리고 설치된 아두이노를 실행,
도구->보드->Boards Manager를 클릭합니다.







여러가지 프로그램들이 뜰건데 그중 2번째 cortex-M3를 위한 패키지를 설치합니다.

저의 경우 이미 설치가 완료 되어서 Remove버튼이 활성화 되었습니다.

설치가 안된 경우면 현재보이는 Remove 위치에 버전과 인스톨 버튼이 있을겁니다.






 


이후에 도구에서 현재 사용중인 모듈의 코어와 포트 설정을 해주시면 완료입니다.

프로그래밍 후 컴파일, 업로드해주시면 실행되는 것을 보실수 있습니다.

그렇다면 테스트를 해보겠습니다.








- PWM소스 -


const int analogInPin = 1;  // Analog input pin that the potentiometer is attached to

const int analogOutPin = 1; // Analog output pin that the LED is attached to


int sensorValue = 0;        // value read from the pot

int outputValue = 0;        // value output to the PWM (analog out)


void setup() {

  Serial.begin(115200);

}


int a = 0;


void loop() {

  analogWrite(analogOutPin, a%256);


  Serial.print("\t output = ");

  Serial.print(a%256);


  delay(500);

  a+=5;

}


아두이노에서 제공하는 Analog-output(PWM)예제를 조금 수정하여 만든 소스입니다.

0.5초당 5씩 상승하고 256이되면 다시 초기화 되는 간단한 예제입니다.

아두이노는 처음이라서 대충 무슨뜻인지는 감이 잡히는데 정확하게는 잘 모르겠습니다

그렇게 어렵지 않다고 하니 함수 사용은 금방 할 수 있을것같습니다.








먼저 시리얼 통신을 통해 출력되는 현재 Parameter값입니다.

프로그래밍한것 처럼 5씩 꾸준하게 증하고 하고 있는 모습을 보입니다.









오실로스코프를 찍어보았습니다.

일단 사진으로 펄스 파형이 일정한 간격으로 생성되는것을 확인 할 수 있습니다.






 

 아무래도 아두이노를 이용하면 다른 툴 보다 직관적이고 쉽게 프로그래밍이 가능한 것이 장점인것 같습니다. 아날로그 출력핀을 여러개로 나누어 쿼드 콥터도 만들수 있을것 같네요.
 

 

  오늘은 SmartRobot 보드에 테스트를 하였지만 현재 연구중인 Spark 모듈에서 아두이노를 포팅한다면 좀 더 쉬운 인터페이스로 STM 조정이 가능합니다.

  또한 SmartRobot의 경우 제공되는 STM 포팅 파일로 진행 하였지만 앞서 말씀드린것과 같이 Spark는 기존의 모듈들과 장치가 조금 다르기 때문에 Wifi기능과 호환을 위해서 프로그램을 수정해야 할 것 같습니다.


저작자 표시
신고

'IT 관련 > Dummy' 카테고리의 다른 글

[Spark] 스파크 모듈 소개  (0) 2017.04.18
[Spark] 스파크 모듈 개발환경 구축  (0) 2017.04.18
[Smartrobot] 아두이노 포팅  (0) 2017.04.18
[STM32] 소스에서 메모리 주소 찾기  (0) 2017.04.18
[STM32] STM32 세미나  (0) 2017.04.18
[STM32] GPIO 사용방법  (0) 2017.04.18

이번에는 Spark 모듈의 소스를 바탕으로 메모리 주소를 찾는 법을 알아 봅시다.

아시다시피 STM32의 외부 장치를 사용하기 위해서는 메모리에 직접 접근하여 레지스터를 세팅하여야 합니다. 그렇다면 메모리에는 어떤식으로 접근해야하고 메모리 주소는 어떻게 찾는지 알아봅시다




일단 stm32f10x.h의 RCC_TypeDef 구조체를 살펴봅시다


 


위에 나타난 화면이 헤더파일 중 RCC_TypeDef의 구조체 입니다.
CR, CFGR등 코어의 레지스터 이름이 많이 보이네요
프로젝트에서 Find를 선택한 후 RCC_TypeDef를 키워드로 찾기를 진행합니다.





RCC에 대한 define을 찾습니다. 
RCC_TypeDef 다음 RCC_BASE가 있네요. 이걸 키워드로 Find 하여 다시 거슬러 올라갑시다.





RCC_BASE에 대한 define을 살펴보면 AHBPERIPH_BASE와 1000 주소값을 합쳐놓았습니다.
그렇다면 다시 AHBPERIPH를 찾아봅시다





PERIPH_BASE주소값에 다시 10000을 합쳐놓았습니다
다시 PERIPH_BASE를 키워드로 Find합니다.




PERIPH_BASE는 32비트 값으로 40000000으로 정의 되어있습니다. 여기가 끝인듯 합니다
결론적으로 거꾸로 거슬러 간 내용을 모두 합하면

40000000+20000+1000 = 40021000



 

데이터 시트를 보면 RCC 값이 0x40021000부터입니다.
코딩된 소스값과 같습니다.
CR 이나 CFGR의 주소값은  0x40021000부터 4바이트의 순서로 증가합니다.
쉽게 생각해서 데이터시트에 표시된 Address offset에 RCC의 주소값을 더하면 해당 레지스터의 주소가 나오게 됩니다.







모듈을 사용할 때 사용하는 레지스터는 거의 Peripheral 영역에 있습니다.
0x40000000부터 0x5fffffff니까 RCC의 경우 여기에 포함되게 되겠습니다.

 

저작자 표시
신고

'IT 관련 > Dummy' 카테고리의 다른 글

[Spark] 스파크 모듈 개발환경 구축  (0) 2017.04.18
[Smartrobot] 아두이노 포팅  (0) 2017.04.18
[STM32] 소스에서 메모리 주소 찾기  (0) 2017.04.18
[STM32] STM32 세미나  (0) 2017.04.18
[STM32] GPIO 사용방법  (0) 2017.04.18
[STM32] keil설정 및 다운로드  (0) 2017.04.18

STM32 세미나 





강좌의 순서 


Core 레벨(Cortex)-> CPU 레벨(STM32)-주변장치가 어떻게 연결되어있는가 -> 개발보드-사용법


 


fetch -> Decode -> excution



fetch - 명령을 가지고 오는 행위

① PC가 가리키는 주소의 명령어를 가지고 온다

② PC의 값이 4증가(명령어 하나가 32비트-4바이트이기 때문에)

-> 다음 명령을 가리킨다


Decode - 가져온 명령어를 해석하여 세팅함

① 명령어 해석

② ARM은 R0에서부터 R15까지 내부 범용 레지스터(레지스터 뱅크)가 존재한다.

-> 레지스터끼리 역할을 분담함


excution - 명령어 수행(Data 처리)

① Berrel Shift 연산을 진행한다.

② ALU 연산을 진행한다.

 

CPU 구조의 변화

stored program -> 폰노이만 -> 하버드

cisc->risk

 

ARM은 반도체회사가 아니다 -> CPU 설계회사이다

반도체회사는 설계된 CPU를 가져와서 반도체를 설계함






- ISA 레벨 -



○ ISA(instruction set architecture)


CPU는 명령을 처리 한 후 결과(Data)를 도출 한다.

컴퓨터는 조작이 가능한 기계-> Input Output이 있음

Data는 레지스터(Direct Access)와 메모리(numbering), 그리고 명령어(operand)에 있음

입력이 있을 때 명령에 따른 제어를 통해 출력을 내는 기계장치를 컴퓨터라고 한다.

 

ISA Thumb-2 명령어를 사용한다.

-> ISA를 가지고 코어를 만듬. ARM이라는 회사에서 만든 코어가 Cortex 시리즈

-> 이걸 반도체 회사(Co.STM)에서 사서 CPU(MCU)를 만든 것이 STM32 시리즈.

-> 여기서 만들어진 CPU를 이용하여 만든 것이 개발보드이다.


궁극적으로 CPU는 명령어를 얼마나 빨리 처리하느냐가 과제이다.

, CPU의 성능은 처리속도에 달려있다.

따라서 회사들은 CPU의 처리속도를 높이기 위해서 여러 가지 구조적 속도 향상(하버드구조, RISK구조 등)을 연구한다.


 32비트 ALU를 가지고 있으나 16비트 명령어는 fetch되고 디코딩 명령에서 제어기가 Thumb-2를 이용하여 Translation하여 연산한다.

① 코드의 공간을 효율적으로 사용 할 수 있다.

② 2번 가져올 데이터를 1번가져올 수 있다.(32비트를 가져와서 16비트씩처리)

-> fetch의 시간이 줄어든다, 파이프라인 헤저드를 줄 일수 있다.


※ 파이프라인 헤저드(원하는때 데이터를 가져오지 못함)

메모리는 느리고 CPU는 빠르기 때문에 제때 가져오지 못하고 지연되는 경우

따라서 CPU는 이러한 헤저드 현상을 줄이는데 성능이 향상된다.






- CORE 레벨 -



○ ARM CPU


ARM7(ARMv4T) -> ARM9(ARMv5) -> ARM11(ARMv6)

순서로 개발이 진행되다가 cortex A.R.M 시리즈가 개발됨

분야별로 CPU의 종류를 분리하자는 취지로 Cortex 개발






○ Cortex M3의 특징


- 하버드 구조 -> 데이터 버스와 명령어 버스가 분리되어 있어서 데이터와 명령어를 동시에 사용 할 수 있다.

(데이터,명령어 버스가 하나이면 폰 노이만 구조이다)

- Thumb-2 명령을 이용하여 32bit 16bit를 동시에 사용(동시에 사용하면 메모리를 효율적으로 사용 할 수 있다) -> thumb-2 16bit 명령어를 디코드 과정에서 32bit로 변환시킨다.

- 곱셈(가산기 추가)과 나눗셈을 하는 연산자까지 들어가 있음

- 기존의 ARM7과 비교하였을 때 35% 더 빠르고 45% 더 적은 코드로 구동 가능





○ ISA와의 관계


 

ISA에 외부적인 기능/장치를 추가하여 코어를 만든다


예)

ETM : Core에 디버깅 기능을 추가

NVIC : Core에  인터럽트 기능을 추가





○ 컴파일 순서


 




○ 명령어 set Architecture


 

예) Add R0,R1,R2,|s|,R3

  A-Bus,  B-Bus


Fetch

① 메모리에 저장된 데이터를 불러온다(E0 81 03 12)

② fetch 후 PC는 4바이트씩 증가한다(a+4)


Decode

① a주소값의 데이터들이 들어오면 명령어를 해석한다.

② 레지스터를 알맞은 위치로 세팅한다


Excution

① Berrel Shift 연산을 진행한다

② ALU연산을 진행한다.

③ Write Back


즉, 

Rd는 R0, 

Rn은 R1,

Rm은 R2,

Rs 는 R3가된다.


※ Rn은 A 버스에 들어가는 레지스터

Rm은 Barrel Shifter에 들어가는 레지스터

Rs는 Shift된 값이 저장되는 레지스터

Rd는 연산결과가 저장되는 레지스터

->Rn은 R0에서 부터 R15까지 범용레지스터 누구나 다 될수 있다.




○ Cortex M3 파이프라인

- combination(조합로직), sequential 관점에서의 명령어 실행 과정




※ 파이프라인(Pipe line)

: 출력이 다시 입력으로 들어오는 구조를 파이프라고 하고 파이프들이 여러 개 조합되어있는것을 파이프라인이라고 한다. 

파이프라인에서 각각의 기능 블럭을 Stage라고 하고 Stage는 파이프로 연결되어있다.


파이프라인 동작원리

클럭 발생 시 순차논리회로는 주소값을 호출, PC값에 저장한다. 다시 클럭이 들어오면 저장된 PC값에 +4를 해주고 다시 뒤로 반환시키고 내부의 주소는 조합논리로 보낸다. 

조합논리회로는 들어온 PC값에 해당하는 명령어를 수행하고 다음 Stage로 보낸다.

순차논리는 닫혀있을때는 저장공간의 역할을 하고 열려있으면 주소값을 내보낸다. 


여기서 클럭이 들어와서 Stage가 열렸을 때 제대로 기능을 실행하지 못하여 파이프라인이 깨져버리는 것이 헤저드이다.




○ Cortex의 예외처리


예외처리 되는 기능들은 벡터 테이블로 생성되어 해당 이벤트가 발생하였을때 테이블로 진입하여 수행된다. 

인터럽트 중 16개는 Default 값으로 건드리면 안된다.(reset interrupt, SVcall, Debug Monitor 등) 나머지 값들은 업체에서 개별적으로 할당한다.



기존의 구조는 인터럽트를 Push나 Pop을 소프트웨어적으로 구성하였으나

Cortex M3는 하드웨어적으로 구성함으로써 유동적으로 인터럽트 상황을 판단하여 빠져나가게 하여 효율적이다.



○ 데이터 처리시 ARM7 Cortex의 차이점






- CPU 레벨 -



○ STM32의 특징(STM32F103CBT6 기준)

STM32/ F103/ C/ B/ T/ 6

회사 모델(M3)/ 핀수/ 메모리/ 패키지/ 온도범위

핀수 : T-32, C-48, R-64, V-100

메모리 : B-128

패키지 : T- 한 변당 핀이 12개씩 달려있음, Q, F, P


1. 저전력(27mA)

2. 속도가 굉장히 빠르다(72Mhz)

3. 핀마다 기능이 많음(Alternative function-중첩기능)

 

Power on reset -> boot 모드 체크 -> 클럭 setting






○ STM32의 구조



 

상단의 아키텍쳐가 다음과 같이 메모리에 매핑되어있다.

(코어와 CPU의 관계는 메모리 맵으로 규정된다.)

 각각의 기능은 번지수가 있다



○ 파워리셋

 



○ 클럭 생성


 



저작자 표시
신고

'IT 관련 > Dummy' 카테고리의 다른 글

[Smartrobot] 아두이노 포팅  (0) 2017.04.18
[STM32] 소스에서 메모리 주소 찾기  (0) 2017.04.18
[STM32] STM32 세미나  (0) 2017.04.18
[STM32] GPIO 사용방법  (0) 2017.04.18
[STM32] keil설정 및 다운로드  (0) 2017.04.18
[Dummy]Microchip 전자시계 완성 소스  (0) 2017.04.18

+ Recent posts

티스토리 툴바