코딩을 하다보면 dll 들이 엄청 늘어 날때가 있다.

폴더가 지저분해진다.

보기 않좋다.

 

그래서 모든 dll 을 Embed 시키는 방법을 알아 본다.

기존의 ilmerge 라는 툴이 있지만 WPF 등과 같은 프레임웤에 사용하려면 관련된 dll 을 다 열거 하라고 하고 사용법 또한 그리 스마트 하지 않다.

AppDomain.CurrentDomain.AssemblyResolve 를 이용하여 하나로 합칠수가 있다.

우선 사용될 모든 dll 을 비주얼 스튜디오 안으로 끌어 온다

 

.

 

그다음 이 모든 dll 들을 포함 리소스로 만들어 준다.

 

그리고 App 클래스로 이동하여 아래와 같이 코딩 한다.

 

 

using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.IO; using System.Linq; using System.Reflection; using System.Threading.Tasks; using System.Windows; namespace Test_Marge { public partial class App : Application { public App() { AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly); }

static Assembly ResolveAssembly(object sender, ResolveEventArgs args) {
//We dont' care about System Assembies and so on...
//if (!args.Name.ToLower().StartsWith("Test")) return null;
Assembly thisAssembly = Assembly.GetExecutingAssembly();
//Get the Name of the AssemblyFile
var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";
//Load form Embedded Resources - This Function is not called if the Assembly is in the Application Folder
var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name));
if (resources.Count() > 0) {
var resourceName = resources.First();
using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) {
if (stream == null) return null;
var block = new byte[stream.Length];
stream.Read(block, 0, block.Length);
return Assembly.Load(block);
}
}
return null;
}
}
}

 

 

그리고 난 다음 빌드된 폴더의 exe 만 따로 꺼내어 테스트 해본다.

 

 

출처 : http://blog.mahop.net/post/Merge-WPF-Assemblies.aspx

 

 

참고 : Winform 에서는 Program.cs 의 Application.Run(new Form1()); 위에 작성한다.
Posted by cyj4369
,

You could open the SNL file in any text editor (Notepad, etc.) and simpley change the project path there.

'Development > visual studio' 카테고리의 다른 글

[LINK에러시 가능한 해결법 한 가지]  (0) 2012.08.20
[MFC 트레이아이콘으로 만들기]  (0) 2012.08.19
[error C2146: 구문 오류]  (0) 2012.08.19
[MFC 트레이아이콘으로 만들기]  (0) 2012.08.18
[error LNK2005]  (1) 2012.08.18
Posted by cyj4369
,

자바스크립트코드를 이용한 우클릭방지 & 드래그방지 해제


확장기능이 아니라 자바스크립트코드를 이용한 방법이다.


먼저 크롬에서 아무 사이트나 북마크를 추가한다.


그 다음 그 북마크를 수정하여 주소에 코드를 넣어주면 된다.


javascript: function naver(q){ void(z=q.body.appendChild(q.createElement('script'))); void(z.language='javascript'); void(z.type='text/javascript'); void(z.src='http://userscripts.org/scripts/source/61326.user.js');} function selfw(w) { try{naver(w.document);} catch(e){} for (var i =0; i <w.frames.length; i++) { try{ selfw(w.frames[i]); } catch(e){} } } selfw(self);(function() { var e, i, all; document.onselectstart = null; document.oncontextmenu = null; all = document.getElementsByTagName("*"); for (i = 0; i < all.length; i += 1) { e = all[i]; e.onselectstart = null; e.oncontextmenu = null; } })();


이 코드를 넣어주면 된다.

 

 

 

이런 식으로 넣어주면 된다.

 

그 후에 드래그방지&우클릭방지 해제를 하고싶은 사이트에서 그 북마크를 한번 실행해주면 된다.

 

실행해도 아무런 변화를 느끼지 못해서 어리둥절할 수도 있지만 그 상태에서 드래그나 우클릭을 해보면 방지가 풀린것을 알 수 있다.

 

그런데 이유는 모르겠지만 몇몇 안되는 사이트들이 있다. 나는 1번의 확장기능도 이용하고있기 때문에 이런 경우에는 그냥 우클릭해서 프레임소스보기를 해서 자료를 얻는다.



출처 : http://pws1113.tistory.com/82

Posted by cyj4369
,

업데이트를 하거나 쓰지 않는게 답인 듯 하다.


Ubuntu 10.10 (Maverick Meerkat) end-of-life reached on April 10, 2012

This note is just to confirm that the support period for Ubuntu 10.10 (Maverick Meerkat) formally ends on April 10, 2012 and Ubuntu Security Notices no longer includes information or updated packages for Ubuntu 10.10.

The supported upgrade path from Ubuntu 10.10 is via Ubuntu 11.04 (Natty Narwhal). Instructions and caveats for the upgrade may be found at https://help.ubuntu.com/community/NattyUpgrades. Note that upgrades to version 11.04 and beyond are only supported in multiple steps, via an upgrade first to 11.04, then to 11.10. Both Ubuntu 11.04 and Ubuntu 11.10 continue to be actively supported with security updates and select high-impact bug fixes. All announcements of official security updates for Ubuntu releases are sent to the ubuntu-security-announce mailing list, information about which may be found athttps://lists.ubuntu.com/mailman/listinfo/ubuntu-security-announce.

Since its launch in October 2004 Ubuntu has become one of the most highly regarded Linux distributions with millions of users in homes, schools, businesses and governments around the world. Ubuntu is Open Source software, costs nothing to download, and users are free to customize or alter their software in order to meet their needs.

Originally posted to the ubuntu-announce mailing list by Kate Stewart on Tue Apr 10 15:39:12 UTC 2012




출처 : http://fridge.ubuntu.com/2012/04/10/ubuntu-10-10-maverick-meerkat-end-of-life-reached-on-april-10-2012/

'Embedded Lab > linux, x86' 카테고리의 다른 글

[우분투에서 monaco 폰트 설정]  (0) 2014.04.27
[ln 명령어]  (0) 2014.02.06
[특수문자표]  (0) 2013.11.04
[GFS(Google File System)]  (0) 2013.10.28
[top 명령어]  (0) 2013.10.23
Posted by cyj4369
,

Ubuntu 에서 추가 글꼴 설정하기.

[#1] 폰트 다운로드


[#2] Font 설정

sudo mkdir /usr/share/fonts/truetype/custom/
sudo cp *.ttf /usr/share/fonts/truetype/custom/
sudo fc-cache -f -v

Ubuntu 11.04 에서는 antialias true 로 enable 되어 있어서 추가로 설정하지 않아도 되는듯…

[#3] 적용





[#4] Emacs 에서 monaco font 설정

다른 글을 보니깐 아래와 같이 하면 된다고 하던데…

echo “Emacs.font: Monaco-10″ > ~/.Xresources
xrdb -merge ~/.Xresources

잘 안 되는 듯 하여, emacs configuration file 에 font 설정하도록 추가.
덕분에 gitHub 사용법 좀더 찾아보고 https://github.com/tkhwang/tkhwang-dotemacs 에도 update 완료. :)

(if (eq system-type 'gnu/linux)
    (progn
      (setq initial-frame-alist '((top . 10) (left . 100)))
      (setq default-frame-alist
        (append
         '(
           (font . "-*-Monaco-normal-normal-normal-*-13-*-*-*-m-0-iso10646-1")
           (width . 140)
           (height . 80)
           )
         default-frame-alist))))



출처 : http://tkhwang.pe.kr/humblecoding/archives/680

'Embedded Lab > linux, x86' 카테고리의 다른 글

[우분투 10.10 maveric apt-get update 에러]  (0) 2014.05.04
[ln 명령어]  (0) 2014.02.06
[특수문자표]  (0) 2013.11.04
[GFS(Google File System)]  (0) 2013.10.28
[top 명령어]  (0) 2013.10.23
Posted by cyj4369
,

18-2-다.#if

#ifdef, #ifndef는 매크로의 존재 여부만으로 컴파일 조건을 판단하며 매크로가 어떤 값으로 정의되어 있는지는 평가하지 않는다. 이에 비해 #if는 매크로의 값을 평가하거나 여러 가지 조건을 결합하여 컴파일 여부를 결정하는 좀 더 복잡한 전처리문이다. #ifdef보다는 사용법이 조금 까다롭지만 C 언어의 조건문과 유사하므로 쉽게 익힐 수 있다. 기본 형식은 다음과 같다.
#if 조건1
코드1 // 조건1을 만족하면 코드1을 컴파일
#elif 조건2
코드2 // 조건 2가 만족되면 코드2를 컴파일
#else
코드3 // 둘 다 맞지 않으면 코드 3을 컴파일
#endif
C 언어의 if .... else if .... else와 거의 유사한 구문이라고 볼 수 있다. #elif와 #else는 필요없을 경우 생략 가능하며 #elif는 얼마든지 올 수 있다. #elif를 반복적으로 계속 사용하면 C언어의 switch case 구문과 유사한 구조를 만들 수 있다. #if는 뒤의 조건을 평가해 보고 이 조건이 참이면 바로 아래의 블록을 컴파일러에게 넘기고 그렇지 않다면 삭제하여 없는 것으로 취급한다. 뜻 그대로 조건에 따라 컴파일할 블록을 선택하는 것이다.
#if와 #elif다음에는 컴파일 여부를 결정하는 조건문이 오는데 이 조건문은 전처리 과정에서 진위 여부를 판단할 수 있는 것이어야 한다. 실행 중에 값이 결정되는 변수를 참조한다거나 함수를 호출하는 것은 안되며 주로 매크로의 값이 평가 대상이다. 다음은 #if 전처리문의 작성 규칙인데 대부분 상식과 일치하므로 쉽게 이해할 수 있을 것이다.
매크로값을 비교할 때는 상등, 비교 연산자를 사용한다. 같다, 다르다는 ==, != 연산자를 사용하며 대소를 비교할 때는 >, <, >=, <= 비교 연산자가 사용된다. 구형 컴파일러들은 상등 연산자만 허용했었으나 최신 컴파일러는 비교 연산자도 사용할 수 있다. C언어의 상등, 비교 연산자와 모양이 완전히 일치하는 셈이다.
#if (LEVEL == 3)
#if (VER >= 7)
조건문은 꼭 괄호로 싸지 않아도 상관없지만 C의 조건문에 익숙한 개발자들은 #if에도 가급적 괄호를 붙여 주는 편이며 괄호가 있는 편이 보기에도 안정감이 느껴져 좋다. #if는 조건문이 참일 때 1로, 거짓일 때 0으로 평가하는데 결과가 0이 아니면 이어지는 코드 블록을 컴파일한다. 이 점도 C와 동일하다.
비교 대상은 정수 상수여야 하며 실수나 문자열은 매크로와 비교할 수 없다. 컴파일러에 따라 실수 비교를 허용하는 것들도 있는데 조건부 컴파일을 통제하는 매크로는 대소가 있는 값이라기 보다는 주로 표식이기 때문에 실수는 별로 실용성이 없다고 할 수 있다. 정수값을 가지는 다른 매크로와 값을 비교하는 것은 가능하다.
#if (VER == 3.14) // 에러
#if (NAME == "Kim") // 에러
#if (LEVEL == BASIC) // 가능
버전 번호 같은 경우에 1.0, 1.5같이 실수로 표기하지만 매크로 상수로 버전을 표시할 때는 100, 150 등과 같이 정수화해서 사용하는 것이 일반적이다.
수식 내에서 간단한 사칙 연산을 할 수 있다. 전처리기가 연산문을 평가한 후 그 결과를 비교하므로 다소 복잡한 식은 굳이 결과를 계산해 넣을 필요없이 수식을 바로 써도 상관없다.
#if (LEVEL*2 == 6)
#if (TIME == 365*24)
나머지 연산, 비트 연산 등도 가능하다. 그러나 ++, --, 포인터 연산, sizeof, 캐스트 연산 등은 사용할 수 없다. 이런 연산들은 전처리문에서 불가능하거나 의미가 없기 때문이다. 매크로는 상수이므로 좌변값이 아니며 sizeof 연산자는 컴파일시에 평가된다. 전처리는 컴파일 이전의 단계임을 명심하도록 하자.
논리 연산자로 두 개 이상의 조건을 동시에 평가할 수 있다. C언어의 논리 연산자와 같은 &&, ||, !를 그대로 사용하면 된다.
#if (LEVEL == 8 && VER != 3)
세 개 이상의 조건도 물론 평가할 수 있다. 이때 필요하다면 조건 평가의 우선 순위 지정을 위해 괄호를 사용한다.
defined 연산자로 매크로의 존재 여부를 평가할 수 있다. #if defined(MACRO) 전처리문은 #ifdef MACRO와 완전히 동일한 문장이다. 그러나 다른 조건과 함께 매크로의 존재 여부를 평가할 때는 #ifdef를 쓸 수 없으므로 defined 연산자가 따로 제공된다.
#if (LEVEL == 8 || defined(PROFESSIONAL))
defined 연산자는 전처리문내에서만 사용되므로 일반 C코드에서는 사용할 수 없다.
#if 다음의 조건부 컴파일 블록에는 어떤 문장이든지 올 수 있다. a=b+c; 연산문이나 함수 호출문, int i; 같은 선언문은 물론이고 struct tag_A { ~ 같은 정의문도 올 수 있다. 심지어 #include, #define같은 다른 전처리문도 조건부 컴파일(정확하게 표현한다면 조건부 전처리) 대상이 될 수 있다. 그렇다면 #if안에 또 다른 #if문이 올 수 있다는 얘기가 되며 즉 #if는 중첩가능한 전처리문이다.
#if (LEVEL == 8)
LEVEL이 8일 때의 코드
#if (VER > 5)
버전이 5보다 클 때의 코드
#endif
LEVEL이 8일 때의 코드
#endif
#if안에 #ifdef가 올 수도 있고 반대도 가능하며 중첩 깊이에 제한도 없다. 조건속에 또 다른 조건이 있는 것은 자연스러운 것이므로 전처리기는 당연히 조건부 컴파일문의 중첩을 허용한다. 단, 전처리문이 중복될 경우 짝이 되는 #endif가 반드시 존재해야 한다는 것만 주의하면 된다. #endif는 조건부 컴파일 대상의 끝을 명시하는 중요한 역할을 한다. C 코드는 블록이 중첩될 때 적당히 들여쓰기를 하지만 조건부 컴파일 지시자가 중첩될 경우 들여쓰기는 하지 않는 것이 보통이다.
다음은 #if의 활용예를 보자. 어떤 문제를 해결하는데 세 가지(또는 그 이상) 방법이 있고 각 방법을 적용했을 때의 성능을 테스트해 보려고 한다. 이때 각 방법의 코드를 지웠다 넣었다 할 필요없이 다음과 같이 조건부 컴파일문으로 작성해 놓으면 METHOD 매크로만 변경하여 적용할 방법을 쉽게 선택할 수 있다. 이 코드가 다른 프로그램의 부품으로 사용되는 라이브러리이고 고객마다 선호하는 방법이 다르다면 모든 코드를 소스에 둔 채 고객의 주문대로 조건부 컴파일하기만 하면 된다.
#define METHOD 1
#if (METHOD == 1)
방법1
#elif (METHOD == 2)
방법2
#else
방법3
#endif
#if 0도 주석 대신 흔히 사용되는 구문이다. 아주 긴 소스를 잠시 주석 처리해 놓고 싶을 때는 이 부분을 #if 0 .... #endif로 감싸 버리면 항상 거짓이므로 전처리기에 의해 이 코드는 없는 것으로 취급된다. /* */ 주석은 중첩될 수 없어 긴 소스를 주석 처리할 때 불편한 반면 #if 0는 중첩 가능하기 때문에 이런 문제가 없다.


출처 : http://judoboyjin.egloos.com/viewer/4545100


'Development > C/C++' 카테고리의 다른 글

[자료형의 크기와 범위]  (0) 2014.04.22
[고급 매크로 표현식]  (0) 2014.04.22
[Static Assert]  (0) 2014.04.16
[itoa, atoi 구현]  (0) 2014.03.04
[scanf에서 공백을 포함한 문자열을 받는 방법]  (0) 2014.02.09
Posted by cyj4369
,

32비트 시스템에서...


- 정수형 자료형 값의 범위

 자료형

크기

계산식 

저장 값의 범위 

 unsigned char

 1byte

 2^8 - 1

 0 ~ 255

 unsigned short

 2byte

 2^16 - 1

 0 ~ 65,535

 unsigned int

 4byte

 2^32 - 1

 0 ~ 4,294,967,295

 unsigned long

 4byte

 2^32 - 1

 0 ~ 4,294,967,295

 

- 음수값을 포함한 정수형 자료형 값의 범위

 자료형

크기

계산식 

저장 값의 범위 

 (signed) char

 1byte

 -2^7 ~ 2^7 - 1

 -128 ~ 127

 (signed) short

 2byte

 -2^15 ~ 2^15 - 1

 -32,768 ~ 32,767

 (signed) int

 4byte

 -2^31 ~ 2^31 - 1

 -2,147,483,648 ~ 2,147,483,647

 (signed) long

 4byte

 -2^31 ~ 2^31 - 1

 -2,147,483,648 ~ 2,147,483,647

 

- 실수형 자료형 값의 범위

 자료형

크기

계산식 

유효숫자1

 float

 4byte

 -3.4 x 10^38 ~ 3.4 x 10^38

 7자리

 (long) double

 8byte

 -1.79 x 10^308 ~ 1.79 x 10^308

 15자리



  1. ¹ 유효숫자: 지수 표현으로 정규화했을 때 표현되는 숫자 [본문으로]



출처 : http://mizaralcor.tistory.com/3

'Development > C/C++' 카테고리의 다른 글

[#if, #elif 사용]  (0) 2014.04.22
[고급 매크로 표현식]  (0) 2014.04.22
[Static Assert]  (0) 2014.04.16
[itoa, atoi 구현]  (0) 2014.03.04
[scanf에서 공백을 포함한 문자열을 받는 방법]  (0) 2014.02.09
Posted by cyj4369
,

C언어를 다년간 사용한 프로그래머들도 종종 매크로 연산자에 대해서 정확하게 이해하고 있지 못한 경우가 많다. 매크로를 사용하지 않는다고 대답할 수도 있지만, 이미 복잡한 매크로를 사용한 수많은 소스가 있다는 점을 생각해 본다면 분명하게 이해해 두는 것이 정신 건강에 좋을 것이다. 복잡한 매크로 표현 식을 구성하는데 많이 사용되는 방법에 대해서 살펴보자.

첫째, 문자열 리터럴은 합쳐진다. 이는 매크로라기 보다는 C언어의 특징이다. 이 기능을 사용하면 긴 출력 문장을 손쉽게 여러 개의 부분 문자열로 나눌 수 있다. 또한 다음에 소개될 매크로 연산자를 사용할 때의 표현식도 좀 더 풍부하게 구성할 수 있다는 장점이 있다.

  1. printf("이름: %s\n"  
  2.        "나이: %d\n"  
  3.        "전화번호: %s\n", a, b, c);  


위의 코드를 보자. printf 다음에는 총 세 개의 연속된 문자열 리터럴이 나타난다. 이 세 개의 리터럴은 합쳐져서 "이름: %s\n나이: %d\n전화번호: %s\n" 과 동일한 문자열이 된다.

둘째, ## 연산자를 사용해서 토큰을 합성해서 만들어 낼 수 있다. ##은 합치기 연산자 이다. 다음과 같은 기능을 생각해 보자. COUNT(start)라고 선언을 하면 DWORD startCnt; 라는 변수를 선언하는 기능이다. 이를 매크로를 이용해서 만들어 보면 아래와 같다.

  1. #define COUNT(val) DWORD val##Cnt  


셋째, # 연산자는 전달된 인자를 문자열로 변환시킨다. start를 매크로 인자로 전달했다면 "start"가 된다는 말이다. 변수 값을 출력하는 매크로를 생각해 보자. PRINT(start)를 하면 화면에 start = 3과 같은 형태로 출력하고 싶은 경우다. 이럴 땐 아래와 같이 매크로를 만들면 된다. #연산자와 위에서 소개한 문자열 리터럴이 합쳐진다는 점을 이용한 것이다. 좀 꽁수 같이 보인다면 두 번째 방식같이 구성할 수 도 있다.

  1. #define PRINT(val) printf(#val " = %d", val)  
  2. #define PRINT(val) printf("%s = %d", #val, val)  


넷째, #@ 연산자는 전달된 인자를 문자로 변환시킨다. a를 매크로 인자로 전달했다면 'a'를 만들어 주는 것이다. 아래와 같이 전달된 인자에 대한 문자를 생성해주는 매크로를 예로 들 수 있다.

  1. #define makechar(val) #@val  


다섯째, 매크로의 내용이 복잡하고 한 줄 이상의 표현식이 필요한 경우엔 주로 do ~ while(0)문을 사용한다. 이렇게 하는 이유는 do ~ while(0)가 하나의 구문으로 해석되고 자체 블록을 가지기 때문이다. 이것을 단순 괄호({, })로 대체하면 안 된다. 중첩 if문에서 에러가 나기 때문이다. 주로 아래와 같이 사용한다.

  1. #define COMPLEX_MACRO(a,b,c,d)  do { \  
  2.                int complex_variable; \  
  3.                                       // some processing; \  
  4. while(0)  


여섯째, 릴리즈 버전에서는 무시되는 매크로를 구성하는 경우다. 주로 디버깅 출력을 하는 매크로가 여기에 속한다. Visual C++ 6.0에서는 '?' 연산자를 사용해서 쇼트 서킷을 구성하는 방법을 주로 사용했다. 하지만 이 후 출시된 Visual C++에는 __noop이라는 내장 함수를 가지고 있다. 이 함수는 인자를 모두 무시하는 기능을 한다. 따라서 예전에 복잡한 쇼트서킷을 사용했던 함수를 두 번째와 같이 간단하게 구성할 수 있다.

  1. #define TRACE 1 ? 0 : OutputDebugString  
  2. #define TRACE __noop  




출처 : http://www.jiniya.net/tt/528

'Development > C/C++' 카테고리의 다른 글

[#if, #elif 사용]  (0) 2014.04.22
[자료형의 크기와 범위]  (0) 2014.04.22
[Static Assert]  (0) 2014.04.16
[itoa, atoi 구현]  (0) 2014.03.04
[scanf에서 공백을 포함한 문자열을 받는 방법]  (0) 2014.02.09
Posted by cyj4369
,

[Static Assert]

Development/C/C++ 2014. 4. 16. 11:33

StaticAssert (sizeof(ioreq_event) <= DISKSIM_EVENT_SIZE);

이런 사용방법이 있다.

StaticAssert를 따라가보면...



#define StaticAssert(c) switch (c) case 0: case (c):



이렇게 정의되어있다.


만약 c의 값이 0이라면(즉, false라면) 컴파일 과정에서 에러가 발생한다.(case 중첩으로)

'Development > C/C++' 카테고리의 다른 글

[자료형의 크기와 범위]  (0) 2014.04.22
[고급 매크로 표현식]  (0) 2014.04.22
[itoa, atoi 구현]  (0) 2014.03.04
[scanf에서 공백을 포함한 문자열을 받는 방법]  (0) 2014.02.09
[objdump in linux]  (0) 2014.01.15
Posted by cyj4369
,

이번에 고생 했던 EEPROM M95512 이제는 잘 동작 한다~

 

#define WRSR  0x01 //Write Status Register
#define WRITE 0x02 //Write to Memory Array 
#define READ  0x03 //Read from Memory Array
#define WRDI  0x04 //Write Disable
#define RDSR  0x05 //Read Status Register
#define WREN  0x06 //Write Enable
#define DUMMY 0x00 //DUMMY BYTE
  
#define EEPROM_CS_LOW()  GPIO_ResetBits(GPIOB, GPIO_Pin_0);
#define EEPROM_CS_HIGH()  GPIO_SetBits(GPIOB, GPIO_Pin_0);

void SPI_Config(void);
uint8_t SPI_SendByte(uint8_t Data);
uint8_t SPI_Flash_Read(uint16_t address);
void SPI_Flash_Write(uint16_t address, uint8_t data);

 

 

/* Includes ------------------------------------------------------------------*/
#include "stdio.h"
#include "stm32f10x.h"
#include "M95512.h"

void SPI_Config(void)
{
  SPI_InitTypeDef SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  SPI_Cmd(SPI1, DISABLE); 
  SPI_I2S_DeInit(SPI1);
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO, DISABLE); 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_Init(GPIOA, &GPIO_InitStructure); 
      
  /* Enable SPI clock, SPI1 */ 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 50 MHz
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  // Configure CS pin as output floating
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* SPI configuration -------------------------------------------------------*/
  EEPROM_CS_HIGH();
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);
  SPI_Cmd(SPI1, ENABLE); 
}

uint8_t SPI_SendByte(uint8_t Data)
{
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
  SPI_I2S_SendData(SPI1, Data); 
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
  return SPI_I2S_ReceiveData(SPI1);
}


static void M95512_WREN(void)
{//0x06 Write Enable
  EEPROM_CS_LOW(); 
  SPI_SendByte(WREN); 
  EEPROM_CS_HIGH();
}

static void M95512_WRDI(void)
{//0x04 Write Disable
  EEPROM_CS_LOW(); 
  SPI_SendByte(WRDI); 
  EEPROM_CS_HIGH();
}

static void M95512_RDSR(void)
{//0x05 Read Status Register
  unsigned char data_H, data_L;
  unsigned int data = 0;
  
  EEPROM_CS_LOW();  
  SPI_SendByte(RDSR); 
//  data_H = SPI_ReadByte();  
//  data_L = SPI_ReadByte();
  EEPROM_CS_HIGH();
  data = (data_H << 1) + (data_L << 7);     
}

static void M95512_WRSR(unsigned char reg)
{//0x01 Write Status Register
  EEPROM_CS_LOW();  
  SPI_SendByte(WRSR);
  SPI_SendByte(reg);  
  EEPROM_CS_HIGH(); 
}

uint8_t SPI_Flash_Read(uint16_t address)
{
  uint8_t data;
  
   EEPROM_CS_LOW();
  SPI_SendByte(READ);
  SPI_SendByte((address & 0xFF00) >> 8);
  SPI_SendByte(address & 0xFF);
  data = SPI_SendByte(DUMMY);
  EEPROM_CS_HIGH();
  return data;

   
void SPI_Flash_Write(uint16_t address, uint8_t data)
{
  M95512_WREN();
 
  EEPROM_CS_LOW();
  SPI_SendByte(WRITE);          // Send SPI instruction 
  SPI_SendByte((address & 0xFF00) >> 8);  // Send SPI address MSB
  SPI_SendByte(address & 0xFF);           // Send SPI address LSB
  SPI_SendByte(data);           // Send SPI Write data(Byte)
  EEPROM_CS_HIGH();
}

 

위와 같이 하여 놓고

main에서

  SPI_Flash_Write(0x0000,0x11);
  SPI1_READ_DATA = SPI_Flash_Read(0x0000);

사용하면 데이타가 잘 들어 온다~

'Embedded Lab > ARM' 카테고리의 다른 글

[STM32 : SPI, using chip select]  (0) 2014.03.05
[SWI의 진실]  (0) 2013.03.22
[논리 스프트와 산술 시프트의 차이]  (0) 2013.03.20
Posted by cyj4369
,