본문 바로가기
코스웨어/10년 스마트폰BSP

[BSP]업무일지-이상구-20100719

by 알 수 없는 사용자 2010. 7. 19.
728x90
반응형


부트로더와 Self Programming

셀프 프로그래밍이란? (Self Programming)
 - AVR에 부트로더를 설치하여 부트로더에 의해 RS232케이블로 펌웨어를 다운로드 하는 과정

부트로더 ? (Boot Loader)
 - 플래시 메모리의 부트로더 섹션에 위치
 - 호스트와의 통신을 담당
 - 플래시와 EEPROM에 데이터를 읽고 쓰는 기능

프로그램 메모리
 - Application Flash Section : 프로그램 코드(.hex등) 이 ISP(In-System Programming) 포트를 이용하여 저장되는 영역
 - Boot Flash Section : ISP 포트를 이용하지 않고 HEX 코드를 내부 플래시 영역에 저장하는 방법을 제공하기 위한 영역
 - Self-Programming : BootFlashSection 의 BootLoader를 이용한 다운로드




윈도우기반 직렬통신 프로그래밍

단방향 직렬통신 프로그램 만들기



예제1.

//송신부

#include  <stdio.h>
#include <windows.h>

int main(void)
{
  char szPort[15]; //포트명 저장 변수
  wsprintf(szPort, "COM%d"4); //4번 포트로 통신

  HANDLE m_hComm = NULL;

  m_hComm = CreateFile(szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);


  if(m_hComm == INVALID_HANDLE_VALUE)
  {
    printf("(!) Failed to create a Comm Device file");
    return FALSE;
  }

  DCB dcb;
  dcb.DCBlength = sizeof(DCB);

  GetCommState(m_hComm, &dcb);

  dcb.BaudRate = 115200;
  dcb.ByteSize = 8;
  dcb.Parity = 0;
  dcb.StopBits = 0;

  SetCommState(m_hComm, &dcb);

  OVERLAPPED osWrite;
  osWrite.Offset = 0;
  osWrite.OffsetHigh = 0;
  osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

  char buf[100= "Hello World \r\n";

  while(1)
  {
    printf("send:%s", buf);
    WriteFile(m_hComm, buf, strlen(buf), NULL, &osWrite);
    Sleep(1000);
  }

  CloseHandle(m_hComm);
  system("pause");
  return 0;
}


//수신부

#include <stdio.h>
#include <windows.h>

int main(void)
{
  char szPort[15];
  wsprintf(szPort, "COM%d"5);

  HANDLE m_hComm = NULL;

  m_hComm = CreateFile(szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

  if(m_hComm == INVALID_HANDLE_VALUE)
  {
    printf("(!) Failed to create a Comm Device file");
    return FALSE;
  }

  DCB dcb;
  dcb.DCBlength = sizeof(DCB);

  GetCommState(m_hComm, &dcb);

  dcb.BaudRate = 115200;
  dcb.ByteSize = 8;
  dcb.Parity = 0;
  dcb.StopBits = 0;

  SetCommState(m_hComm, &dcb);


  OVERLAPPED osRead;
  osRead.Offset = 0;
  osRead.OffsetHigh = 0;
  osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

  char buf[100]="\0";

  while(1)
  {
    printf("recv1:%s", buf);
    ReadFile(m_hComm, buf,100, NULL, &osRead);
    Sleep(1000);
  }

  CloseHandle(m_hComm);
  system("pause");
  return 0;
}





양방향 직렬통신 프로그램 만들기



예제2.

//포트 4 사용

#include <stdio.h>
#include <windows.h>

int main(void)
{
  char szPort[15];
  wsprintf(szPort, "COM%d"4);

  HANDLE m_hComm = NULL;

  m_hComm = CreateFile(szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

  if(m_hComm == INVALID_HANDLE_VALUE)
  {
    printf("(!) Failed to create a Comm Device file");
    return FALSE;
  }

  DCB dcb;
  dcb.DCBlength = sizeof(DCB);

  GetCommState(m_hComm, &dcb);

  dcb.BaudRate = 9600;
  dcb.ByteSize = 8;
  dcb.Parity = 0;
  dcb.StopBits = 0;

  SetCommState(m_hComm, &dcb);

  OVERLAPPED osWrite;
  osWrite.Offset = 0;
  osWrite.OffsetHigh = 0;
  osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

  OVERLAPPED osRead;
  osRead.Offset = 0;
  osRead.OffsetHigh = 0;
  osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

  char buf[100= "Hello World \r\n";

  while(1)
  {
    printf("send:%s", buf);
    WriteFile(m_hComm, buf, strlen(buf), NULL, &osWrite);
    Sleep(1000);
    printf("recv1:%s", buf);
    ReadFile(m_hComm, buf,100, NULL, &osRead);
    Sleep(1000);  
  }

  CloseHandle(m_hComm);
  system("pause");
  return 0;
}


//포트 5 사용

#include <stdio.h>
#include <windows.h>

int main(void)
{
  char szPort[15];
  wsprintf(szPort, "COM%d"5);

  HANDLE m_hComm = NULL;

  m_hComm = CreateFile(szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

  if(m_hComm == INVALID_HANDLE_VALUE)
  {
    printf("(!) Failed to create a Comm Device file");
    return FALSE;
  }

  DCB dcb;
  dcb.DCBlength = sizeof(DCB);

  GetCommState(m_hComm, &dcb);

  dcb.BaudRate = 9600;
  dcb.ByteSize = 8;
  dcb.Parity = 0;
  dcb.StopBits = 0;

  SetCommState(m_hComm, &dcb);

  OVERLAPPED osWrite;
  osWrite.Offset = 0;
  osWrite.OffsetHigh = 0;
  osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

  OVERLAPPED osRead;
  osRead.Offset = 0;
  osRead.OffsetHigh = 0;
  osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

  char buf[100= "\0\n";

  while(1)
  {
    printf("recv1:%s", buf);
    ReadFile(m_hComm, buf,100, NULL, &osRead);
    Sleep(1000);
    printf("send:%s", buf);
    WriteFile(m_hComm, buf, strlen(buf), NULL, &osWrite);
    Sleep(1000);
  }

  CloseHandle(m_hComm);
  system("pause");
  return 0;
}




예제3.
#include <stdio.h>
#include <windows.h>

int main(void)
{
  char szPort[15];
  wsprintf(szPort, "COM%d",4);

  HANDLE m_hComm = NULL;
  m_hComm = CreateFile(szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if(m_hComm == INVALID_HANDLE_VALUE)
  {
    printf("(!) Failed to create a Comm device file");
    return FALSE;
  }

  DCB dcb;
  dcb.DCBlength = sizeof(DCB);

  GetCommState(m_hComm, &dcb);

  dcb.BaudRate = 9600;
  dcb.ByteSize = 8;
  dcb.Parity = 0;
  dcb.StopBits = 0;

  SetCommState(m_hComm, &dcb);

  OVERLAPPED osRead;
  osRead.Offset = 0;
  osRead.OffsetHigh = 0;
  osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

  OVERLAPPED osWrite;
  osWrite.Offset = 0;
  osWrite.OffsetHigh = 0;
  osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  
  char tmp[100];
  while(1)
  {
    printf("COM4의 송신문자 : ");
    gets(tmp);
    WriteFile(m_hComm, tmp, 100, NULL, &osWrite);
    if(tmp[0== '-' && tmp[1== '1')
      break;
    ReadFile(m_hComm, tmp, 100, NULL, &osRead);
    printf("COM5로부터 받은 문자 : ");
    puts(tmp);
    if(tmp[0== '-' && tmp[1== '1')
    break;
    Sleep(1000);
  }
  CloseHandle(m_hComm);

  system("pause");
  return 0;
}


#include <stdio.h>
#include <windows.h>

int main(void)
{
  char szPort[15];
  wsprintf(szPort, "COM%d",5);

  HANDLE m_hComm = NULL;
  m_hComm = CreateFile(szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
             OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if(m_hComm == INVALID_HANDLE_VALUE)
  {
    printf("(!) Failed to create a Comm device file");
    return FALSE;
  }

  DCB dcb;
  dcb.DCBlength = sizeof(DCB);

  GetCommState(m_hComm, &dcb);

  dcb.BaudRate = 9600;
  dcb.ByteSize = 8;
  dcb.Parity = 0;
  dcb.StopBits = 0;

  SetCommState(m_hComm, &dcb);

  OVERLAPPED osRead;
  osRead.Offset = 0;
  osRead.OffsetHigh = 0;
  osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

  OVERLAPPED osWrite;
  osWrite.Offset = 0;
  osWrite.OffsetHigh = 0;
  osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);


  char tmp[100];
  while(1)
  {
    ReadFile(m_hComm, tmp, 100, NULL, &osRead);
    printf("COM4로부터 받은 문자 : ");
    puts(tmp);
    if(tmp[0== '-' && tmp[1== '1')
    break;
    Sleep(1000);
    printf("COM5가 보낼 문자 : ");
    gets(tmp);
    WriteFile(m_hComm, tmp, 100, NULL, &osWrite);
    if(tmp[0== '-' && tmp[1== '1')
    break;
  }
  CloseHandle(m_hComm);
  
  system("pause");
  return 0;
}



타이머카운터 응용 실습

랜덤으로 LED 하나씩 켜고 끄는 프로그램 만들기

예제4.
//LED하나씩 랜덤으로 ON/OFF를 각각 0.5초씩 유지

#define DDRF (*(volatile unsigned char *) 0x61//출력설정
#define PORTF (*(volatile unsigned char *) 0x62//입출력설정

#define CPU_CLOCK 16000000
#define TICKS_PER_SEC 1000
#define PRESCALER 64

#include<avr/interrupt.h>

volatile unsigned int g_elapsed_time=0;

void initLED(void);
void setTCCR0(void);
void initCNT0(void);
void initOCR0(void);
void setTIMSK(void);
void toggleLED(void);
void sleep(unsigned int elapsed_time);
SIGNAL(SIG_OUTPUT_COMPARE0);

int main(void)
{
  initLED();
  setTCCR0();
  initCNT0();
  initOCR0();
  setTIMSK();
  sei();
  while(1)
  {
    toggleLED();
  }
  return 0;
}

void initLED(void)
{
  DDRF=0xFF;
  PORTF=0x99;
}

void setTCCR0(void)
{
  TCCR0=0x0C;
}

void initCNT0(void)
{
  TCNT0=0x00;
}

void initOCR0(void)
{
  OCR0=CPU_CLOCK/TICKS_PER_SEC/PRESCALER; //250
}

void setTIMSK(void)
{
  TIMSK=0x02;
}

void toggleLED()
{
  signed char num;
  
  num=rand()%7;
  PORTF=~(1<<num);
  sleep(500);
  PORTF=0xFF;
  sleep(500);

}

void sleep(unsigned int elapsed_time)
{
  for(;;)
  {
    if(g_elapsed_time==elapsed_time)
    {
      g_elapsed_time=0;
      break;
    }
  }
}
SIGNAL(SIG_OUTPUT_COMPARE0)
{
  g_elapsed_time++;
  TCNT0=0x00;
}
728x90