코스웨어/10년 스마트폰BSP
[BSP]업무일지-이상구-20100719
알 수 없는 사용자
2010. 7. 19. 22:58
부트로더와 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;
} |