Tuesday, December 25, 2012

PCB설계에 Sketchup 활용방법#1


PCB 설계를 하다보면 케이스와 PCB에 올릴 부품의 배치에 대해서 미리 확인할일이 있다. 그럴때 유용한것이 바로 구글 스캐치업(Google Sketchup)이다.

위 그림처럼 케이스의 규격에 맞춰서 케이스를 모델링 하고 덩치큰 부품들도 모델링해서 배치를 해본다. 나중에 조립을 할때에도 삽입 순서를 미리 짐작해볼 수 있고 배선을 어떻게 할지도 감이 잡힐것이다.


케이스의 앞뒤판의 제작시 PCB에 부품을 꽂았을때의 위치를 기준으로 해야하므로 3D 모델링 툴을 이용한다면 모든것을 한번에 해결할 수가 있다.

스캐치업에서 작업한 후 패널 작업에 필요한 부분만 Autocad로 가져가서 부품 조립시 필요한 유격과 조각할 문자를 추가로 그린 후 패널 제작 업체에 보낸다.

그리고 스캐치업에서 작업한 케이스 모델을 랜더링 플러그인(V-ray 나 포디움 등)을 이용해 랜더링하면 제품 제안서에도 사용할 수 있으니 일당백 개발자에게는 아주 유용한 작업 방법이다.


Saturday, November 10, 2012

JavaService 가 재대로 동작하지 않을때 해결방법

JavaService로 java프로그램을 서비스로 윈도우에 등록할 수 있다.

그런데 등록 후 net start 서비스명   이라고 쳐보면  Error 3534를 만나게 된다.

보통 두가지 원인이다.

첫번째는 Windows xp 의 경우 jvm.dll 이 필요로 하는 msvcr100.dll 이 Windows의 system32 디렉토리에 없어서이다.

이때는 Microsoft.com 에 가서 Visual C++ 배포가능 패키지를 다운받아 설치하면된다.


정확한 이름은 Microsoft Visual C++ 2010 Redistributable Package (x86)이고

http://www.microsoft.com/ko-kr/download/details.aspx?id=5555

위 링크에서 받으면된다.


이렇게 했는데도 안되면

만든 프로그램에 문제가 있는것이다.

주로 현재디렉토리가 바뀌는 문제이므로



JavaService.exe -install XXXService  "C:\Program Files\Java\jre7\bin\client\jvm.dll" -Djava.class.path=.;C:\어쩌고\bin;C:\어쩌고\sqljdbc4.jar -Xms64M -Xmx128M  -start 내클래스명 -params 각종파라메터  -out C:\어쩌고\out.txt  -err C:\어쩌고\err.txt -current C:\어쩌고

와 같이 -current 옵션을 사용해서 강제로 현재디렉토리를 변경하면 된다.

디렉토리에 공백이 들어가는 경우 따옴표를 적절히 활용해주면된다.



Tuesday, June 12, 2012

Allegro PowerPad 그리기

TI의 IC를 보면 TSSOP 형태중 PowerPad 라는것이 있다.

아래 그림은 그 원리인데, IC바닥에 금속판의 열을 동박을 거쳐 공기중으로 배출하는것이다.
이런 구조가 되려면 IC가 위치하는 부분에 동박을 놓아야 하고(당연히 코팅하면 안됨) 그자리에 땜을 해줘야 하고 비아홀을 여러개 뚧어서 밑면의 동박으로 전달해주어야 한다.
이렇게 하려면 package 를 만들때 특별한 방법을 써야 하는데 그것을 설명하겠다.




PowerPad(TI 고유 상표)가 될 PAD를 만든다.
* Multiple drill 이 중요. 
보통 pad 는 1개의 drill hole이 있지만 이건 여러개의 drill 을 해서 홀을 많이 뚧는다.
그래야 열 전달이 잘된다.



아래 그림처럼 윗면과 아랫면이 서로 연결된다.



이렇게 만든 Pad를 mechanical pin 으로 IC 바닥에 깐다.



그외 설명은 안하겠다. 


English:

Q: How to make PowerPad ( Thermal pad, Thermal shape with multiple via hole, Via in shape )?
A:  
  1. make multiple drill pad 
  2. place multiple drilled pad for mechanical pin
   



Tuesday, May 1, 2012

개발은 집에서 해야 제맛. 디지털앰프, 2.4Ghz 무선송수신


2012년 5월 2일 새벽이다. 업무상 필요로 디지털앰프와 2.4Ghz 무선 송수신 모듈의 조합을 시험중이다. 납기가 13일 남았다.  무조건 성공해야 한다.

무선 송수신기단에서의 음성 전송은 아주 깨끗이 잘된다.
그러나 수신기에서 디지털앰프로 넘어갈때 어마어마한 노이즈가 끼어든다.
일단 디지털 앰프의 아날로그 입력에 캐패시터를 달아 고역 노이즈는 제거했지만 "쉬" 소리가 계속 난다. 일단 앰프의 승압 회로에서 생기는 노이즈가 파워서플라이까지 전달되어 전체적으로 노이즈가 생기는것으로 짐작하고 있다. 내일 낮에 실제 사용할 24V 배터리 환경에서 시험해볼것인데 만약 배터리 환경에서도 마찬가지의 노이즈가 나타난다면, 물론 지금만큼 이하로 나타난다면 노이즈는 그냥 허용하는것으로 마무리 해야할것이다.

이런일이 생기지 않도록 무선 수신기에서 음성을 수신하자 마자 ADC->광 SPDIF 로 해서 디지털 앰프로 전달하고 디지털 앰프에서는 광을 받아 I2S 로 변환 해서 PWM processor로 바로 넘기도록 하는게 가장 확실한 노이즈 대책이다.

다음 버전은 그렇게 만들어야징.

결국 항상 필요한것은 아날로그오디오->ADC->I2S->SPDIF->광   또는
아날로그 오디오->ADC->I2S->LVDS 아니면,
아날로그 오디오->반전출력-> 전송선로 -> 트랜스포머 또는 Isolated 반전증폭기->아날로그
..
아니다. 모든 음성 신호는 I2S 또는 SPDIF 로 하는것이 항상 정확할것이다.

아날로그 회로는 노이즈와 함께 산다. 하지만 디지털 회로는 노이즈는 없고, 노이즈를 만들어서 아날로그회로를 괴롭히지.

TI TAS5504-TAS5162 조합의 디지털앰프
ADC는 PCM1808, 입력프리앰프는 LM4861..
그러니까 전부 TI꺼로만 조합한거다.

2.4Ghz 오디오 수신 모듈을 사용한 수신기
한쪽 채널의 DTMF를 수신해서 명령을 알아듣는다.


2.4Ghz 오디오 송신 모듈을 사용한 송신기
일단 켜지면 무조건 DTMF를 내보낸다.
수신기들아 켜저라~ 하고 말이다.


Saturday, April 14, 2012

STM32F103 Reset cpu

NVIC_SystemReset  함수를 이용하세요.


core_cm3.h 에 있음.

Thursday, April 5, 2012

IAR EWARM 에서 파일 링크하기(Raw Binary Image link)

STM32f103c8t6 (ram 20kbyte, flash 64kbyte) 사용중 mp3 파일을 CPU 내장 플래시(flash)메모리에 넣고자 애쓰다가 삽질했다.


http://www.iar.com/Global/Resources/Developers_Toolbox/Building_and_debugging/Constructing%20a%20bootloader%20STM32F207ZG-SK.pdf

위에  링크한 게시물을 확인하세요.


그러니까.. 펌웨어를 작성하는데, 프로그램 안에서 jpg 파일이나 mp3파일이나 wav 파일등 바이너리(binary)데이터를 flash에 넣고 그것을 읽어서 사용하고 싶을때 어떻게 하느냐.

xxx.h 나 xxx.c 등.. 코드로 변환하여 파일을 포함시키면 기본적으로 ram  에 올라간다. 그러면 안그래도 부족한 램이 꽉차서 프로그램이 뻣어버린다. 따라서 flash에 넣고 그것을 읽어서 사용하도록 해야 한다.

방법은 iar ewarm  의 linker 옵션의 input 섹션의 raw binary image 기능이다.

파일을 선택하고, symbol 과 section을 지정해주고, icf 파일에다가 직접 원하는 flash 속에서의 주소를 지정해준다.

그렇게 하면 linker 가 icf 에 기술한 주소에 raw binary image 로 지정한 파일을 해당 위치에 저장해준다.

그러면 프로그램에서는 unsigned char *my_jpg = (unsigned char*)0x08001234 식으로 파일의 주소를 직접 지정하여 읽어서 사용하면 된다.

이거 몰라서 hex로 변환하여 프로젝트에  .c 파일로 추가해서 했다가 졸라 삽질했다.
왜냐하면 램이 20KByte 밖에 없는데 내가 추가한 파일은 15KByte 였으니까 프로그램이 시작도 못하고 죽지... 젠장..


예제)
stm32f10x_flash.icf 를 다음과 같이 수정하였음


/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000 ;
define symbol __ICFEDIT_region_ROM_end__   = 0x0800FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x2000FFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x800;
define symbol __ICFEDIT_size_heap__   = 0x3000;
/**** End of ICF editor section. ###ICF###*/


define memory mem with size = 4G;
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy { readwrite };
do not initialize  { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place at address mem:0x08008000 {section .wave };


place in ROM_region   { readonly };
place in RAM_region   { readwrite,
                        block CSTACK, block HEAP };



위에 place at address mem:0x08008000 {section .mp3 }; 부분의 0x08008000 이라는 주소는 0x0800FFFF (FLASH의 끝 주소) 에서 파일 용량만큼 7FFF(32KB) 만큼 뺀 것이다.



링커 옵션의 input 섹션에 다음과 같이 파일을 추가해야함.



Tuesday, March 13, 2012

Binary CDMA 아트웍 완료

아... 드디어어제밤에 바이너리 CDMA 아트웍을 완료 하였다. 눈알이 빠지려하네 STM32F103ZET6 144핀 MCU와. 60핀 Board to board 커넥터를 연결하고 나니 ㅆㅂ... 부품 심볼을 잘못만들어서 1번핀이 가운데서 시작하네... 돌아버림.. 다시 1번핀이 구석에서 시작하게 심볼을 새로 만들고 다시 라우팅.... 제길.. 이런걸 진짜 삽질이라한다. 삽질을 안하는 방법은 작은 것에서 신경을 써야한다는거다. 계속된 삽질에 눈이 아프다.

Monday, March 12, 2012

Binary CDMA 공부중

바이너리 CDMA를 처음 알게된건 약 2년전. 친구가 재난관련 업체와 정보를 나누다 전해 들었다. 2.4Ghz의 ISM대역을 사용하므로 전파사용에 허가나 신고 없이 소출력으로 사용이 가능하다.

나는 그것에 별 쓰임이 없다고 생각했으나 최근 고이득안테나를 이용하면 작은 건물정도는 통과할수 있음을 시험으로 알게되고 매우 감탄했다.

현재 STM32F103ZET6과 대우전자부품의 모듈을 이용하여 개발중이며 개발성과가 있으면 포스팅하겠다.

물론 회사 직무관련이므로 회로도를 올릴수는 없고 완성품사진정도만 올릴예정.

근데 눈아파서 아트웍을 못하겠다.

Saturday, March 10, 2012

개발 장비 소개

개발 장비소개의 6번째이다.

개발 장비라기 보다는 개발 환경이 맞겠다.


왼쪽 사진은 나의 개발실이다.

전구 스탠드가 아주 중요하다. 3파장 램프이며, 옥션에서 산것 같은데 제도용이라고 나온것이다.
그냥 크기가 크고, 팔이 길어서 사용하기 편리하다. 독서용 작은 스탠드 램프는 짧은 팔때문에 걸리적거린다.
저런 큰걸 사용하는것이 아주 좋고, 방안에 옅은 조명을 하고 싶을때는 저 전등 부분을 회전시키면 천정을 비춰서 간접조명을 만들어낼 수도 있다.

컴퓨터는 노트북과 데스크탑을 1대씩 사용한다. 데스크탑에서는 주로 모니터링용으로 시리얼 터미널 프로그램을 뛰워놓고, 데이터 시트도 열어놓는다. 회로 그리기, 아트웍, 프로그램 작업은 항상 노트북으로 한다.
노트북이 있어야 언제 어디서라도 생각날때 작업을 할 수 있고, 현장에서 긴급하게 디버깅을 하거나, 프로그램을 수정해야 할때 아주 편리하다.

노트북은 반드시 1920x1080 해상도 이상을 지원하는 i7 cpu정도에 4기가 메모리 정도는 되어야 원활한 작업이 가능하다.
하드디스크는 크면 클수록 좋겠지만 현장을 자주 나간다면 내구성 좋은 SSD를 달도록.

개발 장비 소개

개발 장비 소개 5번째이다.

이번에 소개하는 개발장비는 바로.. 글루건이다.
글루건은 정말 꼭 필요한 장비이다. 각종 부품들을 배치할때 볼트로 고정할 수도 없고 애매할때는 쏘고 붙인다.
물론, 개발할때만 사용하도록 하고 되도록이면 사용할일이 없는게 좋은거다.

아기들 장난감 부셔졌을때도 사용하고 여러가지로 좋다. 너무 제품은 양조절에 실패하여 떡지게 되는 경우가 있으므로
필요에 따라 작은것이나 큰것을 선택하면 된다.

마트에 판다.


개발 장비 소개

개발 장비 소개로 이번이 4번째 글이다.

컴파일한 프로그램을 Arm CPU의 Flash 메모리에 넣으려면 jtag 프로그래머-디버거가 필요하다.
ARM 개발을 하는 사람들 중에 혹자들은 프로그램을 CPU에 넣을때 ISP(in system programmer)를 사용하거나 Serial downloader, usb downloader 등을 사용하는 경향이 있는데 jtag 프로그래머-디버거를 구입하지 않고 가지고 있던 싼 시리얼 케이블이나 usb 케이블만으로 하려고 하니까 그런건지는 모르겠는데 한마디로 미친짖이다.
ㅅㅂ 완전 천재가 아니면 프로그램에 오류가 있고 그것을 디버깅 할때 어디서 어떻게 되는건지를 추적하려면 디버깅이 되어야 하는데, 넣어놓고 돌려보고 안되면 다시 돌리는 미친짖을 하다니.. 천재인가? 아니면 나만 바보인가?

디버깅 코드를 넣어서 하는것도 어느 정도지, 그냥 아래 사진처럼 jtag 프로그래머이자 디버거인 장비를 사서 쓰도록 하자.

단돈 5만5천원이다. 5만5천원 아까워서 시리얼 터미널로 어디까지 갔는지, 변수에 뭐가 들어있는지 터미널만 보는것은 한심하다.



그리고 Cortex-m3 제품들에는 SWD 기능이 있다. SWDIO 핀과 SWCLK 핀. 이 두개와 VCC, GND . 총 4개의 핀만 연결해주면 프로그램 굽기와 디버깅이 다 된다.

Cortex-m3 쓰면서 20Pin Jtag 콘넥터 꼽아서 자리만 차지하게 하지 말고, 깔끔하게 4핀짜리 헤더소캣이나 작은 커넥터를 사용하여 공간도 줄이고 아트웍도 편하게 가자.

개발 장비 소개

개발 장비 소개 3번째 글이다.

이것은 인두기다. 그냥 막 쓰는 인두기. 집에서는 이정도 인두기만 있으면 충분하다.
일단, 온도조절도 잘 되고, ESD SAFE 라는데 정말 그런지는 모르겠다. 여하튼 회로가 파손되거나 내가 전기맞은적은 없으니까 그런거 같기도 하고.



역시 최고의 장점은 가격이 싸다. 20만원에 기본 팁까지 준다. 땡큐..

QFP 64핀이나 32핀 등 조밀한 IC를 조립하기 위해서는 900M-T-K 팁이 필수다.
이거보다 얇은 팁이 있는데 얇은게 IC 조립에는 완전 안맞다. 넓은게 좋다.
왜냐하면 팁이 넓으면 납을 다시 빨아 낼때도 확 잘 빨린다.

무슨 소리냐면, 아래 그림처럼 할때 인두기가 넓은게 좋다는거다.

납을 너무 많이 뭍혀서 지지면, 납이 핀에 엉겨 붙어서 다 붙어버린다. 그러면 인두기를 잘 닦아서 솔더링 패이스트(플럭스)를 뭍혀서 그 엉겨 붙은곳을 다시 지지면 납이 인두기로 빨려들어온다.

이러한 방법으로 전체적으로 고르게 납땜을 할 수가 있다.

초보자의 경우에, 잘 안되면 플럭스 팬을 사서 핀에도 바르고 패드에도 바르고 잔뜩 발라라. 그러면 납이 금속 표면에만 붙고 다른곳에는 안붙고 잘된다.

나중에 플럭스야 제거하면 장땡이니까, 쉽게 하자.

개발 장비 소개

개발 장비 소개 2번째 글임.

이번에 소개할 장비는 DC Power supply HY3003D-3 이다.

3채널이다. 30V 3A 2개 , 5V/3A 1개.
5V 출력은 Current limit이 없으므로 안쓴다. 집에서 장난치다가 태워먹으면 x되니까.


이 제품은 다 좋은데 전압이 오락가락한다. 3.3V에 맞추면 3V ~ 3.4V 를 왔다갔다 한다. 심할때도 있고 안그럴때도 있는데
좀 뭐랄까 품질이 아주 좋지는 않다.

그러다 최대의 장점이 있는데 가격이 29만원이라는거.

3채널에서 가장 싸다. 집에서 사용하기에는 이거면 충분.

개발 장비 소개

집에서 개발을 하려면 이정도는 갖춰야 가능하다.

그중 첫번째는 오실로스코프.



이 제품은 완전 초 저가형으로 디바이스마트에서 50만원에 구입하였다. (http://www.devicemart.co.kr/goods/view.php?seq=23582)
대충 30Mhz 정도까지는 사용하는데 문제가 없으며, 일반적인 마이크로프로세서를 사용할때는 보통 외부 인터페이스가 제아무리 빨라봐야 10Mhz를 넘을 일이 없으므로 충분하다.

장점:
싸다.
가볍고 작다.

단점:
조작성이 아주 빠르지는 않다.
Vertical position 이 채널별로 있으면 좋겠지만 그게 하나라서 버튼으로 전환해가면서 봐야한다. 2채널을 함께 볼때는 약간 불편함.

나의 능력으로는 이 장비 이상이 필요가 없다.

집에 오실로스코프 하나쯤은 놓고 쓰자.

젠장 내가 미쳤나보다. STM32F103R8T6에 I2S를 쓸라고 했으니..

내가 하루동안 STM32F103R8T6에서 I2S SlaveRX 모드로 PCM1808 에서 나온 I2S 신호를 받으려고 완전 쌩쑈 했는데
알고보니 지원 안한다.

STM32F103RET6을 사려고 했었는데 나도 모르게 2천원 싼값이 R8T6을 샀던것이었고 자세히 보니 R8T6은 I2S 기능이 없네

완전 삽질한거지.

삽질을 피할 사람들은 스팩 잘보고 사서 해보세요. 제길..... 우라질..

디바이스마트에서 주문 넣었고 이제 입금만 하면 되는데, 인증서가 회사에 있네.. 완전 쓋...

Wednesday, March 7, 2012

LG 옵티머스 LTE 벽돌 현상 해결 방법

증상:
홈 화면에 리치노트 위젯과 달력 위젯과 구글검색 위젯을 첫페이지에 놓고 껏다 켰더니
홈 화면에서 벽돌됨.
껏다 켜도 바로 벽돌됨.
메뉴 버튼을 누를 수가 없어 어떤 조치도 불가능함.

해결 방법:
휴대폰을 끄고 MicroSD 카드(외장메모리)를 제거하고 후대폰을 켠다. 그러면 켜짐.

아마도 위젯들이 MicroSD 카드를 서로 읽으려 하는것일 수도 있고 홈화면 프로그램이 병신같아서 그럴 수도 있고..
여하튼 해결되었음.

Cortex-M3(lm3s808, lm3s811 등)가 FaultISR()에 빠질때 해결방법.

증상:
FaultISR() 에 들어가 while(1) 무한 루프 도는 현상이 랜덤하게 생긴다.
왜그런지 알 수가 없이 그냥 뒤진다.


그건 심각한 오류가 발생했을때 그렇게 되는데 거의 두가지 이유다.
1. GPIO 나 USART 같은 포트를 초기화 하지 않고 사용하려 했을때.
2. System stack 이 overflow 됐을때.

해결 방법:
1. GPIO 나 포트 문제: 초기화 하고 사용하라.
2. System stack 이 overflow 됐을때는 스택 사용을 줄이든가, startup.c 의 static unsigned long pulStack[xx] @ ".noinit"; 부분의 xx를 늘려라. 단, CPU의 ram 크기에 따라서 적당히 늘려야 한다.
특히 인터럽트 핸들러를 사용하는 경우에 스택 사용이 몰리는 현상을 예측하기 어려우므로 인터럽트 핸들러를 많이 사용하는 경우에는 핸들러 안에서 스택사용을 줄이고, main 함수에서도 마찬가지로 스택 사용을 줄인다.
스택 사용을 줄이는 방법은 지역 변수 사용하지 말고 전역 변수 사용하기. 임시로 메모리 써야 할때는 malloc 해서 heap 에다가 할당 받아 사용하고 해제하기. 재귀 호출 같은거 하지 말기.

3. 또, 왜그런지는 알 수 없지만 실수 연산 할때 뒤지면 형을 강제로 맞춰라. 예를 들어 float x = (float)1 / 2.0; 이라고 하면 뒤의 2.0은 float 인지 double 인지 알수 없지만 기본적으로 double로 될것이다. 그러면 double 갔다가 float랑 연산하느라 float가 double로 변했다가 또 다시 변수에 들어가느라 float로 형변환 해야 하므로,
float x = (float)1.0 / (float)2.0; 식으로 쓰면 전체적으로 float만 있게 된다.

Thursday, February 23, 2012

외부 GPIO Trigger

출처: http://prosigi.tistory.com/115


1. STM32 EXTI 5, 6, 7 Init Code





void EXTI_7_5_Init(void)

{



  EXTI_InitTypeDef  EXTI_InitStructure;

  NVIC_InitTypeDef  NVIC_InitStructure;

  GPIO_InitTypeDef   GPIO_InitStructure;



  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);  



  // GPIO PORT INIT

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    // Pull-Up

  GPIO_Init(GPIOC, &GPIO_InitStructure);





  // Enable the EXTI9_5 Interrupt

  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);





  EXTI_ClearITPendingBit(EXTI_Line5);

  EXTI_ClearITPendingBit(EXTI_Line6);

  EXTI_ClearITPendingBit(EXTI_Line7);





  GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5 );

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6 );

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource7 );



  // Configure EXTI Line to generate an interrupt

  // Rising and Falling edge Trigger

  EXTI_InitStructure.EXTI_Line = EXTI_Line5 | EXTI_Line6 | EXTI_Line7;

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure);



}
 

 




2. stm32f10x_it.c 추가내용 (IRQ내부)



void EXTI9_5_IRQHandler(void)

{

  

  if(EXTI_GetFlagStatus(EXTI_Line5) != RESET)

  {

    Uart_Printf("Init IRQ_5 \n");

    

    EXTI_ClearITPendingBit(EXTI_Line5);

  }

  else if (EXTI_GetFlagStatus(EXTI_Line6) != RESET)

  {

    Uart_Printf("Init IRQ_6 \n");

    

    EXTI_ClearITPendingBit(EXTI_Line6);

  }

  else if (EXTI_GetFlagStatus(EXTI_Line7) != RESET)

  {

    Uart_Printf("Init IRQ_7 \n");

    

    EXTI_ClearITPendingBit(EXTI_Line7);

  }

  else if (EXTI_GetFlagStatus(EXTI_Line8) != RESET)

  {

    Uart_Printf("Init IRQ_8 \n");

    

    EXTI_ClearITPendingBit(EXTI_Line8);

  }

  else if (EXTI_GetFlagStatus(EXTI_Line9) != RESET)

  {

    Uart_Printf("Init IRQ_9 \n");

    

    EXTI_ClearITPendingBit(EXTI_Line9);

  }

  else

  {

    ;

  }

}



3. 디버깅도중 CPU Halted 걸려서 먹통.. OTL.



증상)





원인)

- icf 파일 내용





- stm32f10x_vector.c 내용







해결)

icf파일에서 생성하는 intvec_start 섹션의 이름이 

stm32f10x_vector.c에 정의된 이름과 같지 않아서 생긴 문제인듯..

icf파일의 ".INTVEC" -> "INTVEC"로 변경으로 해결!! 








4. 실행중 HardFaultException 에 들어감.



증상)

- The stack 'CSTACK' is filled to 100% 

- The Stack pointer for stack 'CSTACK'

이라고 혼냄.. ㅠ_ㅠ





- HardFaultException 함수에서 껌뻑껌뻑.. 깜깜 무소식..





- 어셈..

 







원인)

- Stack을 너무 많이 썼음.. (너무많이 부려먹었나..?)



해결)

- .icf 파일의 스텍사이즈 정의..

- 일단 키워보자. 사용하는걸 계산할수 있으면.. 이런글도 안남기겠지? ㅎㅎ 



(요놈을)



(이렇게) (symbol 이름이 파일마다 다를수가 있나??)












저작자 표시
비영리
동일 조건 변경 허락

Monday, February 13, 2012

STM32 라이브러리 적용 Flow..

1. 라이브러리 설정
        - ST 홈페이지에서 다운로드
                STM32F10x_StdPeriph_Lib        (10/06/24 현재 3.3.0 버전)
                ㄴ CMSIS 폴더
                ㄴ STM32F10x_StdPeriph_Driver 폴더
                STM32F10x_USB-FS-Device_Lib        (10/06/24 현재 3.2.0 버전)
                ㄴ STM32_USB-FS-Device_Driver 폴더
        - \CMSIS\CM3\DeviceSupport\ST\STM32F10x\stm32f10x.h 파일의 내용 변경
                ㄴ Performance line Define을 CPU에 맞게 변경 (LD, MD, HD, CL.. 등)
                ㄴ "#define HSE_Value" 값을 사용 외부 클럭속도에 맞게 수정
        
        - \CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c 파일의 내용 변경
                ㄴ SetSysClockTo72(); 함수의 내용중 
                   "RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);" 라인의 
                   PLLMULLx 값 변경하여 "HSE * x = 72MHz" 성립되게 수정
원본: http://prosigi.tistory.com/81