내용핵심

예를들어 GPIOB_BRR이 0x40010C14라고 하자.

여기서 GPIOB : 0x40010C00이며

BRR은 여기에 + 0x14를 더한것이다.

GPIOA : 0x40010800이며 GPIOA_BRR은 0x40010814이다.


이러한것을 #define을 이용하여 일일이 주소를 치던것을 간단하게 GPIOA_BRR, GPIOB_BRR 등으로 쳐서 표현하자는것


이 책에서 나오는 define은 대부분 STMicroelectronics의 Standard Peripheral Driver Library에 적용되어 있다.


여기에 연습하면서 적은 코드를 적어둔다

/////////////////////////////////////////////////////////////////////////////////////

platform_config.h

#define GPIOA_CRL (*(volatile unsigned *)0x40010800)

#define GPIOA_CRH (*(volatile unsigned *)0x40010804)


typedef enum{

  GPIO_Mode_User_Out_PP=0x00,

  GPIO_Mode_Use_Out_OD=0x01,

  GPIO_Mode_Use_AF_PP=0x10,

  GPIO_Mode_Use_AF_OD=0x11

}GPIOMode_Output_TypeDef;


void GPIO_A_Output_Init(uint16_t pinNum, GPIOSpeed_TypeDef speedValE, GPIOMode_Output_TypeDef modeE){

  //modeE : CNF

  //speedValE : MODE

  //pinNum : 비트방식의 pinNum표시. 0x1(0b1), 0x2(0b10)... 16비트:16핀

  //0xFFFF : 0b1111.1111.1111.1111.

  //GPIOSpeed_TypeDef : stm32f10x_gpio.h에 정의

  uint32_t tmpVal = modeE<<2 | speedValE; //CNF와 MODE 붙임

  uint32_t pinpos = 0x00;


  //pin #0~#7(GPIO_CRL)

  if((pinNum & 0xFF)!=0){

    //하위 8비트에 어떤 값이 존재

    for(pinpos=0x00; pinpos<0x08; pinpos++){

      if(pinNum==((uint32_t)0x01) << pinpos){

        //pinpos : 원하는 설정을 저장할 위치(4비트 단위로 건너뜀)

        pinpos = pinpos*4;

        GPIOA_CRL &= ~(0xF << pinpos);  //대상비트를 0으로 Set. 나머지는 그대로 살림(and)

        GPIOA_CRL |= tmpVal << pinpos;  //대상비트에 설정사항(tmpval)적용

        break;

      }

    }

  }

  

  //pin #8~#15

  else{

    //8비트 오른쪽 shift시켜 CRH의 port bit configuration에 적용

    pinNum = pinNum>>8;

    for(pinpos = 0x00; pinpos < 0x08; pinpos++){

      if(pinNum == ((uint32_t)0x01) << pinpos){

        pinpos = pinpos*4;

        GPIOA_CRH &= ~(0xF << pinpos);

        GPIOA_CRH |= tmpVal << pinpos;

        break;

      }

    }

  }

}


책에 있는데 안적은 내용은, 위에서 언급한 Standard peripheral Driver Library에 있기때문


/////////////////////////////////////////////////////////////////////////////////////////////

Test_LED_Function_Used.c


#include <stm32f10x.h>

#include <platform_config.h>


static void delay_int_count(volatile unsigned int nTime)

{

 for(; nTime > 0; nTime--); 

}


void delay_1_second(void)

{

  delay_int_count(806596); 

}


//앞의 platforconfig.h와 비교

void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;


   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //output

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

   GPIO_Init(GPIOA, &GPIO_InitStructure);

}


void GPIOA_0_On(void){

  GPIOA->BRR |= GPIO_Pin_0; 

}

void GPIOA_1_On(void){

  GPIOA->BRR |= GPIO_Pin_1; 

}

void GPIOA_4_On(void){

  GPIOA->BRR |= GPIO_Pin_4; 

}


void GPIOA_0_Off(void){

  GPIOA->BSRR |= GPIO_Pin_0; 

}

void GPIOA_1_Off(void){

  GPIOA->BSRR |= GPIO_Pin_1; 

}

void GPIOA_4_Off(void){

  GPIOA->BSRR |= GPIO_Pin_4; 

}


void GPIOA_On_All(void){

  GPIOA_0_On(); 

  GPIOA_1_On(); 

  GPIOA_4_On(); 

}


void GPIOA_Off_All(void){

  GPIOA_0_Off(); 

  GPIOA_1_Off();

  GPIOA_4_Off();

}


void GPIOA_OnOffAll_Mult(uint32_t count){

  for(;count>0;count--)

  {

    GPIOA_0_Off();

    GPIOA_1_On();

    GPIOA_4_On();

    delay_1_second();

    

    GPIOA_0_On();

    GPIOA_1_Off();

    GPIOA_4_On();

    delay_1_second();

    

    GPIOA_0_On();

    GPIOA_1_On();

    GPIOA_4_Off();

    delay_1_second(); 

  }

}


void GPIOA_Test(void){

#if 0

  GPIOA_On_All();

  delay_1_second();

  GPIOA_Off_All();

  delay_1_second();

#else

  GPIOA_OnOffAll_Mult(10);

#endif

}

int main(void){

  RCC->APB2ENR |= RCC_APB2Periph_GPIOA;

  

  //GPIO_Speed_10MHz : output mode의 Open-drain

  GPIO_A_Output_Init(GPIO_Pin_0,GPIO_Speed_10MHz,GPIO_Mode_User_Out_PP);

  GPIO_A_Output_Init(GPIO_Pin_1,GPIO_Speed_10MHz,GPIO_Mode_User_Out_PP);

  GPIO_A_Output_Init(GPIO_Pin_4,GPIO_Speed_10MHz,GPIO_Mode_User_Out_PP);

  

  while(1){

   GPIOA_Test(); 

  }

}


GPIOA를 이용해서 LED테스트를 해보았다. 직접 읽고 내용을 이해할 수 있었으면 한다.


'중도연재종료 > CORTEX M3' 카테고리의 다른 글

GPIO_Init  (0) 2013.05.25
Key가 눌린것 알아채기  (0) 2013.05.24
LED 끄기[GPIO Set Reset 레지스터]  (0) 2013.05.24
LED회로도를 통한 기본적인 이해  (0) 2013.05.22
Cortex M3 시작. 자료  (0) 2013.05.22
Posted by 십자성군

P171


소스


static void delay_int_count(volatile unsigned int nTime)

{

for(; nTime>0; nTime--);

}


int main(void)

{

(*(volatile unsigned *)0x40021018 |= 0x8;

(*(volatile unsigned *)0x40010C04 |=0x10;


(*(volatile unsigned *)0x40010C14 |= 0x200;

delay_int_count(10000);

(*(volatile unsigned *)0x40010C10 |= 0x200;


while(1)

{

;

}

}


[GPIO Set Reset 레지스터]

GPIO핀의 값을 Reset하고 Set하는 작업으로 동작을 On, Off시켰다.


1.Port bit Reset register [GPIOx_BRR]

Address offset:0x14

Reset value: 0x0000 0000


GPIO register map을 참고한다.

0x40010C14 |= 0x200;

0x200=0b001000000000이 된다. 즉, BR9가 ON되어 핀9가 Reset된다.(Register reset)


2.Port bit set/reset register [GPIOx_BSRR]

Address offset: 0x10

Reset value : 0x0000 0000


0x40010C10 |= 0x200으로 인해 BS9가 ON되어 핀9가 Set된다.(Register set)


delay_int_count(10000);

시간지연. 설명 pass

'중도연재종료 > CORTEX M3' 카테고리의 다른 글

GPIO_Init  (0) 2013.05.25
Key가 눌린것 알아채기  (0) 2013.05.24
고급스러운 코딩1.  (0) 2013.05.24
LED회로도를 통한 기본적인 이해  (0) 2013.05.22
Cortex M3 시작. 자료  (0) 2013.05.22
Posted by 십자성군

p136, 159




MamoryMap

MamoryMap




RCC register map






GPIO register map



소스코드


int main(void){

(*(volatile unsigned*)0x40021018) |= 0x8;

(*(volatile unsigned*)0x40010C04) |= 0x10;


while(1)

{;}

}


schematic



volatile를 사용하는 이유:

컴파일과정에서 컴파일러가 쓸모없다고 판단하여 삭제해버리는 내용이 있다. 이를 삭제하지말고 컴파일 하게 할 때 사용한다.


소스해석


1.

(*(volatile unsigned*)0x40021018) |= 0x8;

0x40021018 : 위 메모리맵의 AHB 영역에서 RCC에 해당한다. RCC레지스터맵에서 0x18은 RCC_APB2ENR을 나타낸다.

0x8은 16진수표현이다. 이를 2진수로 표현하면 0b1000이다. RCC_APB2ENR에서 IOPBEN에 1이 들어간것과 같은의미.


APB2 peripheral clock enable register (RCC_APB2ENR)

address: 0x18    (해당주소. base 0x40021000 + 0x18 = 0x40021018)


역할

GPIO B를 사용하기 위해서, 이것에 Clock을 공급할 수 있도록 enable 시키는것.

APB2ENR의 IOPBEN을 ON시키기 위해서.


2.

(*(volatile unsigned*)0x40010C04) |= 0x10;

0x40010C04=0x40010C00+0x04

이는 GPIOB_CRH이다.


Port configuration register low(GPIOx_CRL)

Address offset : 0x00


Port configuration register high(GPIOx_CRH)

Address offset : 0x04


Table50을 보자. 32비트 레지스터 내용은 각 Pin별로 4비트씩 설정을 할 수 있도록 되어있다.

CRH에서 0x10을 or 시키면, 0b00010000이 된다. 핀 9번, 8번에 대하여 적용되어, pin8번은 0000, 핀9번은 0001이 적용되어 CNF:00, MODE:01이 된다.


책을보면, MODE 01로 Output mode, max speed 10MHz가 적용, CNFy 00으로 General purpose output push-pull이적용된다.


pull-up, pull-down.과

Open-Drain의 PMOS와 NMOS의 공부가 필요

'중도연재종료 > CORTEX M3' 카테고리의 다른 글

GPIO_Init  (0) 2013.05.25
Key가 눌린것 알아채기  (0) 2013.05.24
고급스러운 코딩1.  (0) 2013.05.24
LED 끄기[GPIO Set Reset 레지스터]  (0) 2013.05.24
Cortex M3 시작. 자료  (0) 2013.05.22
Posted by 십자성군


ARM.zip

첨부내용:

13475.pdf : STM32F103xx 함수설명서

STM32_Module_Sch_V1_2 : 모듈 회로도

STM32_Module_v1_2 : 모듈 설명서

STM32_Reference_manual : 영문메뉴얼

stm32시작하기_2 : 학습자료. 별로 참고하지 않음


사용장비

(주. 인셈)STM32F103 Module Board(STM32_M)

사용교재

ARM Cortex-M3 시스템 프로그래밍 완전정복 I


교재내용을 읽으면서 학습. 보충설명과 같이 기재하겠음

'중도연재종료 > CORTEX M3' 카테고리의 다른 글

GPIO_Init  (0) 2013.05.25
Key가 눌린것 알아채기  (0) 2013.05.24
고급스러운 코딩1.  (0) 2013.05.24
LED 끄기[GPIO Set Reset 레지스터]  (0) 2013.05.24
LED회로도를 통한 기본적인 이해  (0) 2013.05.22
Posted by 십자성군
카테고리 없음2013. 3. 7. 23:59



1열에 대하여 det를 구하는 공식을 사용


재귀함수를 이용.(ex. 3X3행렬의 det를 구하려면 각 요소(n,1)에 대한 det도 구해야 한다)

재귀함수명:polyNominal(A,B)

A:(n,1)요소

B:요소의 행,열을 제외한 (n-1,n-1)행렬


위의 예시의 결과:

det=S^3 -15S^2 -18S-0


Posted by 십자성군
Mechatronics/제어2013. 3. 7. 23:38

y=makesysArr(A)




ex)


'Mechatronics > 제어' 카테고리의 다른 글

Matlab[시스템 전달함수]  (0) 2013.03.07
대각정준형식  (0) 2011.07.31
동반정준형  (0) 2011.07.31
미분방정식 학습  (0) 2011.07.30
기계제어. 스프링-댐퍼-질량모델의 전달함수 (1)의 다른방법  (1) 2011.07.30
Posted by 십자성군
Mechatronics/제어2013. 3. 7. 22:59


matlab_전달함수.zip


구현내용만을 설명한다.






을 기본모델로 삼는다


mainsys(A,B,C)

A:시스템 행렬

B:입력행렬(b)

C:출력행렬(c)


makesysArr(y)

[S-A]행렬 생성


makeDeter(sysArr)

[S-A]행렬의 행렬식 구하기


cofactor([S-A])

[S-A]행렬의 여인수 행렬 구하기


ABMat(cofactorArr, B)

 구하기



'Mechatronics > 제어' 카테고리의 다른 글

Matlab. makesysArr  (0) 2013.03.07
대각정준형식  (0) 2011.07.31
동반정준형  (0) 2011.07.31
미분방정식 학습  (0) 2011.07.30
기계제어. 스프링-댐퍼-질량모델의 전달함수 (1)의 다른방법  (1) 2011.07.30
Posted by 십자성군
Software/Programming2012. 8. 12. 00:24

클래스 마법사를 이용

클래스 속성의 이벤트 오픈


가상함수는 원래 존재하는 함수의 기능을 바꾸어 구현할때 사용

Posted by 십자성군
Software/Programming2012. 8. 11. 19:33

목표.

1. bmp파일을 연다

2. 8비트와 24비트 컬러를 출력한다.


프로젝트명 : BmpReading


BmpReading.h

==========================================================================================

// BmpReadingDoc.h : CBmpReadingDoc 클래스의 인터페이스

//


#pragma once



class CBmpReadingDoc : public CDocument

{

protected: // serialization에서만 만들어집니다.

CBmpReadingDoc();

DECLARE_DYNCREATE(CBmpReadingDoc)


// 특성입니다.

public:


// 작업입니다.

public:


// 재정의입니다.

public:

virtual BOOL OnNewDocument();

virtual void Serialize(CArchive& ar);

#ifdef SHARED_HANDLERS

virtual void InitializeSearchContent();

virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);

#endif // SHARED_HANDLERS


// 구현입니다.

public:

unsigned char *m_InImg;       // bmp파일의 이미지 내용 저장

unsigned char *m_OutImg;     // bmp이미지 출력용 배열

BITMAPFILEHEADER dibHf;    // 비트맵 파일헤드 구조체

BITMAPINFOHEADER dibHi;    // 비트맵 영상헤드 구조체

RGBQUAD palRGB[256];        // 팔레트 정보 구조체 배열

virtual ~CBmpReadingDoc();   // 이들을 가상변수로 구현화 한다

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif


protected:


// 생성된 메시지 맵 함수

protected:

DECLARE_MESSAGE_MAP()


#ifdef SHARED_HANDLERS

// 검색 처리기에 대한 검색 콘텐츠를 설정하는 도우미 함수

void SetSearchContent(const CString& value);

#endif // SHARED_HANDLERS

public:

virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);

virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);

};


=======================================================================================

BmpReadingDoc.cpp    (일부)

=======================================================================================


#define WIDTHBYTES(bits) (((bits)+31)/32*4) //추가, 영상의 가로줄은 4바이트의 배수


//새로 정의한 가상함수 OnOpenDocument

BOOL CBmpReadingDoc::OnOpenDocument(LPCTSTR lpszPathName)

{

if (!CDocument::OnOpenDocument(lpszPathName))

return FALSE;


// TODO:  여기에 특수화된 작성 코드를 추가합니다.

//CFile에서 처리

CFile hFile;        //파일을 읽어들이면 이 클래스 형식으로 저장.


int height;        //이미지의 높이를 저장할 변수

int width;        //이미지의 가로길이를 저장할 변수



hFile.Open(lpszPathName,CFile::modeRead | CFile::typeBinary);    //파일 열기

hFile.Read(&dibHf,sizeof(BITMAPFILEHEADER));                          //dibHf에 파일헤더를 읽어들인다.

//이 파일이 BMP파일인지 검사 

if(dibHf.bfType!=0x4D42

{

AfxMessageBox(L"Not BMP file!!");                                        //프로젝트 생성시 유니코드를 사용하게 할 경우

return FALSE;                                                                      //L을 붙여준다

}

hFile.Read(&dibHi,sizeof(BITMAPINFOHEADER));                             //영상정보의 header를 읽기

if(dibHi.biBitCount != 8 && dibHi.biBitCount != 24)                                //8,24비트가 아닐경우

{

AfxMessageBox(L"Gray/True Color Possible!!");

return FALSE;

}

if(dibHi.biBitCount==8)

//8비트의 경우 팔레트를 생성해 주어야 한다. 총 256가지 색이므로 그 길이만큼 읽어들인다

hFile.Read(palRGB,sizeof(RGBQUAD)*256);

//메모리 할당

int ImgSize;

if(dibHi.biBitCount == 8)

{

ImgSize = hFile.GetLength()-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER)-256*sizeof(RGBQUAD);    //이미지의 크기는 파일 총 길이에서, 두 헤드와 팔레트의 사이즈를 

}                                                                       //제외한다.

else if(dibHi.biBitCount == 24) //컬러영상

{

ImgSize = hFile.GetLength()-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER);

}


//이미지를 저장, 출력할 배열생성.

m_InImg = new unsigned char [ImgSize];

m_OutImg = new unsigned char [ImgSize];

hFile.Read(m_InImg, ImgSize);

hFile.Close();


//이미지의 길이정보

height = dibHi.biHeight;

width = dibHi.biWidth;


return TRUE;

}



BOOL CBmpReadingDoc::OnSaveDocument(LPCTSTR lpszPathName)

{

// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.

CFile hFile;

if(!hFile.Open(lpszPathName,CFile::modeCreate | CFile::modeWrite | CFile::typeBinary))

return FALSE;

//정보저장

hFile.Write(&dibHf,sizeof(BITMAPFILEHEADER));

hFile.Write(&dibHi,sizeof(BITMAPINFOHEADER));

if(dibHi.biBitCount==8)

hFile.Write(palRGB,sizeof(RGBQUAD)*256);

hFile.Write(m_InImg,dibHi.biSizeImage);

hFile.Close();

return TRUE;

}


===============================================================================

BmpReadingView.h    (일부)

===============================================================================

// 구현입니다.

public:

BITMAPINFO* BmInfo;            //비트맵 영상헤드를 선언

virtual ~CBmpReadingView();


===============================================================================

BmpReadingView.cpp    (일부)

===============================================================================

CBmpReadingView::CBmpReadingView()

{

// TODO: 여기에 생성 코드를 추가합니다.

BmInfo = (BITMAPINFO*)malloc(sizeof(BITMAPINFO)+256*sizeof(RGBQUAD));

for(int i=0; i<256; i++)

{

BmInfo->bmiColors[i] .rgbRed= BmInfo->bmiColors[i] .rgbGreen = BmInfo->bmiColors[i] .rgbReserved = 0;

}

}


CBmpReadingView::~CBmpReadingView()

{

if(BmInfo) delete BmInfo;

}


void CBmpReadingView::OnDraw(CDC* pDC)

{

#define WIDTHBYTES(bits) (((bits)+31)/32*4);        //이미지 가로 바이트 길이는 4바이트의 배수

//BmInfo;

int height;

int width;

int rwsize;


CBmpReadingDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.

if(pDoc->m_InImg==NULL)

return;


//24비트 비트맵 파일의 영상출력

if(pDoc->dibHi.biBitCount==24){

height=pDoc->dibHi.biHeight;

width=pDoc->dibHi.biWidth;

rwsize=WIDTHBYTES(pDoc->dibHi.biBitCount*pDoc->dibHi.biWidth);

BmInfo -> bmiHeader = pDoc->dibHi;

SetDIBitsToDevice(pDC->GetSafeHdc(),0,0,width,height,0,0,0,height,pDoc->m_InImg,BmInfo,DIB_RGB_COLORS);

}

else //8비트 컬러일 경우

{

int index;

rwsize=WIDTHBYTES(pDoc->dibHi.biBitCount*pDoc->dibHi.biWidth);


   //팔레트를 읽어들이며 반복출력

for(int i=0; i<pDoc->dibHi.biHeight;i++)

for(int j=0; j<pDoc->dibHi.biWidth;j++){

index=pDoc->m_InImg[i*rwsize+j];

BYTE R=pDoc->palRGB[index].rgbRed;

BYTE G=pDoc->palRGB[index].rgbGreen;

BYTE B=pDoc->palRGB[index].rgbBlue;


//pDC->SetPixel(j,i,RGB(R,G,B));

 //영상 반전출력

pDC->SetPixel(j,pDoc->dibHi.biHeight-i-1,RGB(R,G,B));


}

}

}

Posted by 십자성군
Software/Programming2012. 8. 10. 22:28


1193120077_BmpTest001.rar

4개의 비트맵 파일을 불러와서 메모리비트맵에 저장한 다음

새로운 메모리비트맵에 4개의 비트맵을 차례로 출력 후 그림파일로 

저장하는 예제입니다...

소스폴더에 보시면 1.bmp부터 4.bmp까지 있는데

다른 비트맵파일로 바꾼뒤에 테스트 해보셔도 됩니다.

CMyImage클래스가 그림을 불러오고 저장하는 클래스니 확인하셔야 하구요

View클래스의 OnInitialUpdate함수에 그림파일을 불러오는 부분이 있으니

잘 해석해보시면 어떻게 해야할지 아실줄로 생각됩니다.

View클래스외에는 수정한게 없으니

CMyImage클래스와 View클래스만 보시면 될 것 같네요...

 

다운받으시려면 아래 다운로드에 마우스커서를 놓고

오른쪽 버튼을 누른 뒤 "다른 이름으로 대상 저장" 을 눌러 저장해 주세요...

아래 다운로드 소스는 제 Paran블로그에 올려두었습니다... (물론 비공개글입니다.)

Posted by 십자성군