EMBEDDED/STM322010. 10. 21. 11:21

이번에는 [STM32F103] 개발환경 구축(2) 에서 생성한 .bin파일을 퓨징해보자.

노트북에 시리얼포트가 없기 때문에 Serial-to-USB 케이블을 사용해야 한다.
필자는 다음의 케이블을 사용한다.


  HL-340 드라이버


그리고 해당 보드의 Serila은 숫놈으로 되어있기 때문에 Serial Cable은 암-암으로 준비해야 한다.

그리고 퓨징 프로그램인 Flash Loader Demostrator를 실행한다.

드라이버가 설치되서 제대로 포트가 인식되면 위와 같이 Port Name에 현재 사용하는 포트가 나와야한다.
Port name은 현재 사용하는 포트로 설정하고 나머지는 위와같이 설정한다.


위와 같은 에러가 나오는 이유는 현재 STM32보드는 BOOT모드와 일반모드 2가지가 있는데 일반모드로 보드를 켜고
퓨징프로그램을 실행했을때 나오는 화면이다.
현재보드에서는 점퍼를 이용하여 모드를 바꿀 수 있다. (점퍼를 빼면 BOOT 모드) 점퍼를 빼고 전원을 다시켠다.


다음과 같이 신호등의 파란불이 뜨면 정상적으로 보드가 인식되었다는 뜻이다.
Next를 클릭한다.


현재 보드의 메모리를 보여주는데 따로 설정하는건 없기 때문에 Next를 클릭!!


위의 Download to device의 Download from file에는 생성한 .bin파일의 경로를 입력한다.
erase necessary pages는 기존의 데이터를 지우고 퓨징하는 것이고 80000000번지에 .bin파일을 올려야한다.(80000000번지가 시작번지. 자세한거는 데이터시트 참조)

퓨징 성공!!
제대로 동작하는지 보드를 재부팅하고 확인한다.

'EMBEDDED > STM32' 카테고리의 다른 글

[STM32F103] 개발환경 구축(2)  (0) 2010.10.21
[STM32F103] 개발환경 구축 (1)  (0) 2010.10.21
Posted by 해해해해해해해해
EMBEDDED/STM322010. 10. 21. 10:12

IAR Embedded Workbench IDE를 실행하면 초기화면은 다음과 같이 나온다.


먼저 프로젝트를 생성한다. 메뉴에서 project -> Create New Project를 클릭한다.

다음과 같은 화면이 나오게 되는데 Empty project로 선택하고 OK를 클릭한다.
 

OK를 클릭하면 project를 저장하는 화면이 나온다. 우선 LED라는 이름으로 project를 저장해본다.

위와 같이 프로젝트가 하나 생성된다. 마우스를 가져다 우클릭을 하고 Option을 클릭한다.

위와같이 Device를 클릭하고 옆의 작은 아이콘을 클릭하면 툴에서 지원하는 칩들이 있는데 STM32f103VE버전이므로
ST->STM32F10xxE를 설정해주고 OK를 클릭한다.

output converter를 클릭하고 위와같이 설정한다.(output 파일 설정) 그리고 OK클릭

프로젝트 이름에서 마우스를 가져다 우클릭을 하고 Add->Add Group을 클릭한다.

그룹이름은 user라고 붙이고 (아무거나 해도 됨) OK 클릭!


위와 같이 user라는 폴더가 project하위에 만들어진다. 여기서 File메뉴를 클릭하고 New->file을 클릭한다.


그럼 위와 같이 새로운 텍스트창이 생성된다. 그럼 아래와 같이 코드를 작성해보자
(STM32F103을 기준으로 코드를 작성하였다.)
[-] Collapse
#define     MYRCC       (*(volatile unsigned long *) 0x40021018) // GPIO-B를 클럭인가해주는 주소
#define     RCC_APB2ENR (*(volatile unsigned long *) 0x40021018)
#define     GPIOB_CRL   (*(volatile unsigned long *) 0x40010C00)
#define     GPIOB_ODR   (*(volatile unsigned long *) 0x40010C0C)

void Delay(volatile int nCount);

int main(void)
{
    MYRCC = 8;
    GPIOB_CRL = (1 << 20);
    GPIOB_ODR = 0xFF;

    while(1)
    {
        GPIOB_ODR = 0xFF;
        Delay(60000);
        GPIOB_ODR = 0x00;
        Delay(60000);
    }
}
void Delay(volatile int nCount)
{
  for(; nCount != 0; nCount--);
}

(코드에 대한 설명은 패쓰!!)


이름은 main.c라고 지정하고 적당한 폴더에 저장한다. 다시 왼쪽에 프로젝트 목록에서 전에 생성한 user폴더에
마우스 우클릭으로 Add->Add files를 클릭한다. 그리고 방금 생성한 main.c를 찾아서 추가해준다.
main.c를 추가해주면 밑에 Output폴더가 자동으로 생성된다. 이 폴더에는 main.c를 컴파일 하고난 결과물이 저장된다.
F7을 눌러서 Make를 해보자.
(workspace 저장화면이 나오면 프로젝트 이름과 같이 생성해주던지 아무거나 지정하고 저장하면 된다.)

 컴파일 하면 위와 같은 화면이 코딩창 아래에 나온다.
그리고 왼쪽의 프로젝트 폴더에 다음과 같이 LED.bin파일이 생성된 것을 확인할 수 있다.

'EMBEDDED > STM32' 카테고리의 다른 글

[STM32F103] 개발환경 구축(3)  (0) 2010.10.21
[STM32F103] 개발환경 구축 (1)  (0) 2010.10.21
Posted by 해해해해해해해해
EMBEDDED/STM322010. 10. 21. 09:44

제조사 홈페이지

stm32와 관련 목록 링크

개발환경 구축에 필요한 프로그램 및 데이터시트 등이 제공된다.

Flash loader demonstrator 링크

Flash loader demonstrator은 컴파일해서 생성된 .hex나 .bin등을 플래쉬로 퓨징해주는 프로그램이다.

다운 받아서 설치!! (설치시 따로 설정해줘야하는 부분은 없으므로 패스..)

datasheet 링크

이 데이터시트에는 레지스터에 대한 설명이 없다. reference manual 이라고 자세히 나온 데이터시트가 따로있다.

reference manual 링크

그리고 마지막으로 통합개발환경 툴을 다운받아야하는데 Keil, IAR, RIDE 등 여러가지 툴들이 있는데 나는 IAR로 

사용했다.

IAR 공식홈페이지 링크

위의 화면과 같이 Downloads를 클릭한다. 

그러면 아래와 같은 화면이 나오게 된다.

IAR Embedded Workbench IDE 링크

여기서 30-day evaluation edition은 30일 체험판이다.

그리고 Kickstart edition은 날짜제한은 없지만 32KByte밖에 파일을 못 만든다. 간단한 학습용으로는 32KB도 충분하기

때문에 Kickstart edition을 다운받는다. (이거또한 설치시 따로 설정해줘야 하는것은 없기 때문에 패쓰)

'EMBEDDED > STM32' 카테고리의 다른 글

[STM32F103] 개발환경 구축(3)  (0) 2010.10.21
[STM32F103] 개발환경 구축(2)  (0) 2010.10.21
Posted by 해해해해해해해해
ARM2010. 6. 22. 16:38

다음은 ARM의 여러가지 동작모드 가운데 유저모드 FIQ모드 IRQ모드 3가지를 사용할 때 쓰이는 레지스터의

모습을 그림으로 나타낸 것 이다.

검은색 삼각형이 없는 레지스터는 모든 동작모드에서 구별하지 않고 동일하게 사용되는 범용 레지스터이다.

검은색 삼각형은 해당하는 모드에서 자신만이 쓰는 레지스터이다. 

여기서 FIQ모드가 IRQ보다 빠른 이유는 먼저 유저모드에서 IRQ로 모드가 변환될 때 IRQ의 값을 스택에 저장하게 된다.

여기서 자기만이 쓰는 레지스터(r13_irq,r14_irq)는 스택에 복사되지 않고 범용 레지스터 부분만 스택에 저장하게 되며

다시 유저모드로 돌아갈 때 r0 ~ r12까지의 값을 다시 가져오게 된다.

반면에 FIQ모드는 자기만이 쓰는 r8_fiq ~ r14_fiq는 스택에 저장하지 않고 r0 ~ r7만 스택에 저장하고 다시 모드가 변환

될 때 r0 ~ r7레지스터만 불러오기 때문에 상대적으로 12개의 레지스터를 저장하고 불러오는 IRQ모드보다 8개의

레지스터만 사용하는 FIQ모드가 보다 빠르다.


'ARM' 카테고리의 다른 글

ADS(ARM Developer Suite) 설정하기  (0) 2010.06.21
Posted by 해해해해해해해해
C++2010. 6. 22. 10:52

클래스를 헤더파일과 구현 파일에 나누어 담는 방법을 배워보자. 우선은 point 클래스의 최종 소스코드를 보자.

소스코드가 딱 봐도 복잡하기 때문에 나누어 담아주는 것이 좋다.

#include <iostream>
using namespace std;

class point
{
public:
  void print();

  point();
  point(int initialx, int initialy);
  point(const point& pt);

  void setx(int value)
  {
    if(value < 0)      x = 0;
    else if(value > 100)  x = 100;
    else          x = value;
  }

  void sety(int value)
  {
    if(value < 0)      y = 0;
    else if(value > 100)  y = 100;
    else          y = value;
  }
  int getx()  {return x;};
  int gety()  {return y;};

private:
  int x;
  int y;
};

point::point(const point& pt)
{
  x = pt.x;
  y = pt.y;
}
point::point(int initialx, int initialy)
{
  setx(initialx);
  sety(initialy);
}
point::point()
{
  x = 0;
  y = 0;
}
void point::print()
{
  cout<< "( " << x << ", " << y << ")\n";
}

int main()
{
  point pt(-50,200);

  pt.print();
  
  return 0;
}

위의 코드를 다음과 같이 3개의 파일로 나누어 작성해보자.

point.h - 클래스 정의 헤더파일

point.cpp - 클래스 멈버구현

main.cpp - main함수 구현

<point.h>

#ifndef POINT_H
#define POINT_H

class point
{
public:
  void print();
  
  point();
  point(int initialx, int initialy);
  point(const point& pt);
  
  void setx(int value)
  {
    if(value < 0)      x = 0;
    else if(value > 100)  x = 100;
    else          x = value;
  }
  
  void sety(int value)
  {
    if(value < 0)      y = 0;
    else if(value > 100)  y = 100;
    else          y = value;
  }
  int getx()  {return x;};
  int gety()  {return y;};
  
private:
  int x;
  int y;
};
#endif

<point.cpp>

#include "point.h"
#include <iostream>

using namespace std;

point::point(const point& pt)
{
  x = pt.x;
  y = pt.y;
}
point::point(int initialx, int initialy)
{
  setx(initialx);
  sety(initialy);
}
point::point()
{
  x = 0;
  y = 0;
}
void point::print()
{
  cout<< "( " << x << ", " << y << ")\n";
}

<main.c>

#include "point.h"

int main()
{
  point pt(-50,200);
  
  pt.print();
  
  return 0;
}

이렇게 나누면 다음과 훨씬 코드가 간결해져서 읽기가 편해진다.

파일을 나눌때 주의해야 할 점은 point.h파일에서와 같이 처음부분에 #ifndef POINT.H와 #define POINT.H 그리고 마지막줄에 #endif를 추가해줘야한다.

ifndef의 역할은 헤더파일이 겹치는 것을 막는 일종의 매크로이다. 




Posted by 해해해해해해해해
ARM2010. 6. 21. 17:01

1. [File] - [New]를 클릭하면 다음과 같은 화면이 나오는데 ARM Executable Image를 클릭한후 프로젝트 이름을 test로 입력한다. 경로는 아무곳이나 상관없다. 확인 클릭


2. 확인을 클릭하면 다음과 같은 화면이 나오는데 화면에 대고 우클릭하면 add files 와 create group 두가지가 나온다

먼저 create group을 클릭한 후  Cstartup이라는 부트코드 폴더를 만들고 부트코드를 추가한다.

3. 그럼 Cstartup이라는 부트코드를 담을 폴더가 생긴다 . 다시 이 폴더에 마우스 우클릭을 하면 add files와 creat group

그리고 delete가 뜬다. 그럼 add files를 클릭한 후 부트코드를 추가한다. 

4. 그리고 다음화면이 나오면 그냥 OK.

5. 다음과 같이 나오면 성공적으로 부트코드를 추가한 것이다.

6. 다시 다음화면에서 아무데나 우클릭하면 add files과 create group이 나오는데 create group을 클릭한후 source폴더를 만든다. source폴더에 우클릭하고 add files를 클릭한다.

7. 그리고 작성한 소스코드를 추가한다.

8. 그리고 main.c를 더블클릭한 후 [project] - [compile] 클릭 후 다시 [project] - [make]를 누르면 다음과 같이 

successful!!



'ARM' 카테고리의 다른 글

ARM-state general registers and program counter  (0) 2010.06.22
Posted by 해해해해해해해해
C language2010. 6. 19. 23:21

#include <stdio.h>

double sum(double g[][3], int n);

void printarray(double g[][3], int n);

   

int main(void)

{

int i = 0;

double x[][3] = { {1,2,3},{7,8,9},{4,5,6},{10,11,12} };

   

int rowsize = sizeof(x) / sizeof(x[0]);

printf("2차원 배열의 자료값은 다음과 같습니다.\n");

printarray (x,rowsize);

printf("함수에서 구한 2차원 배열원소 합은 %3.1f 이다.\n",sum(x,rowsize));

   

return 0;

}

   

double sum(double g[][3], int n)//2차원배열 더하는 함수

{

int i;

int j;

double total = 0;

   

for(i = 0;i < n;i++)

{

for(j = 0;j < 3;j++)

{

total += g[i][j];

}

}

   

return total;

}

   

void printarray(double g[][3], int n)// 배열 출력함수

{

int i;

int j;

   

for(i = 0;i < n;i++)

{

printf("% d행 원소: ",i + 1);

for(j = 0;j < 3;j++)

{

printf("x[%d][%d] = %5.2lf ",i,j,g[i][j]);

}

printf("\n");

}

printf("\n");

}

   

   

'C language' 카테고리의 다른 글

업무일지(strlen함수 작성,각 메모리영역 설명)  (0) 2010.06.10
Posted by 해해해해해해해해
C language2010. 6. 10. 15:51

#include <stdio.h>

int strlen2(const char *p);

int main()
{
int inum;
inum = strlen2("test");
printf("%d",inum);


return 0;
}


int strlen2(const char *p)
{
int icnt;


for(icnt = 0;*p !=0;++icnt)
{
++p;
}

return icnt;

}

실행결과




heap,stack영역에 대한설명

#include <stdio.h>
#include <malloc.h>

int main()
{
char *p;
int *d;
d = malloc(100);

printf("P의 주소%p\t\n", &p);
printf("main의 주소%p\t\n", main);
printf("printf의 주소%p\t\n", printf);
printf("malloc의 주소%p\t\n", d);
printf("문자열의 주소%p\t\n", "abc");

return 0;
}


메모리영역에 대한 설명


동적할당을 받은 메모리의 주소를 포인터 변수에 저장하고 동적할당을 받은 메모리를 반환한다.

이 때 , 동적할당을 받았을 때 저장했던 주소에 값을 다시 쓸 수 있을까??

정답은 쓸 수 있다이다. 다만 오류가 날 수도 있다.

'C language' 카테고리의 다른 글

2차원배열을 이용,배열원소의 합구하는 프로그램  (0) 2010.06.19
Posted by 해해해해해해해해