1-3일 삽질
#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)
#define PIO_ASR (*(volatile unsigned int *) 0xFFFFF470)
#define PIO_SODR (*(volatile unsigned int *) 0xFFFFF430)
#define PIO_CODR (*(volatile unsigned int *) 0xFFFFF434)
#define PIO_OER (*(volatile unsigned int *) 0xFFFFF410)
#define PIO_BSR (*(volatile unsigned int *) 0xFFFFF474)
#define PIO_PDR (*(volatile unsigned int *) 0xFFFFF404)
#define PIO_IFER (*(volatile unsigned int *) 0xFFFFF420)
#define PIO_PDSR (*(volatile unsigned int *) 0xFFFFF43C)
#define DBGU_SR (*(volatile unsigned int *) 0xFFFFF214)
#define DBGU_RHR (*(volatile unsigned int *) 0xFFFFF218)
#define DBGU_THR (*(volatile unsigned int *) 0xFFFFF21C)
#define PMC_SCER (*(volatile unsigned int *) 0xFFFFFC00)
#define PIO_PER (*(volatile unsigned int *) 0xFFFFF400)
#define DBGU_MR (*(volatile unsigned int *) 0xFFFFF204)
#define DBGU_BRGR (*(volatile unsigned int *) 0xFFFFF220)
#define DBGU_CR (*(volatile unsigned int *) 0xFFFFF200)
#define PIO_IER (*(volatile unsigned int *) 0xFFFFF440) //인터럽트 인에이플 레지스터
#define PIO_ISR (*(volatile unsigned int *) 0xFFFFF44C) //인터럽트 스테이터스 레지스터
#define AIC_SVR ((volatile unsigned int *) 0xFFFFF080) // 인터럽트 서비스 루틴 등록
#define AIC_SMR ((volatile unsigned int *) 0xFFFFF000) // 인터럽트 설정
#define AIC_IDCR (*(volatile unsigned int *) 0xFFFFF124) // 인터럽트 금지 레지스터
#define AIC_ICCR (*(volatile unsigned int *) 0xFFFFF128) //에지 검출기 클리어
#define AIC_IECR (*(volatile unsigned int *) 0xFFFFF120) // 인터럽트 허용 레지스터
#define PIO_PUDR (*(volatile unsigned int *) 0xFFFFF460)
#define PITC_PIMR (*(volatile unsigned int *) 0xFFFFFD30)
#define PITC_PIVR (*(volatile unsigned int *) 0xFFFFFD38)
//-디버그 유닛 인터럽트 설정-//
#define DBGU_IER (*(volatile unsigned int *) 0xFFFFF208) // 인터럽트 설정 레지스터
//volatile 레지스터 주소 (보레타일)
//---------- 전력 제어 설정
#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)
#define MASTERCLOCK 48000000 //ARM에서 사용하는 클럭수
//--------- 전역 변수
void Delayms(unsigned int ms) //딜레이 함수..
{
volatile unsigned int count, countmax = (MASTERCLOCK / 10000) * ms;
for(count = 0; count < countmax; count++);
}
volatile unsigned int PIT_count=0; // PIT interrupt count
volatile unsigned int PIT_flag=0; // PIT interrupt flag
unsigned int Hz=0; //주기타이머 Hz 보정값
unsigned int k=0x0; //led값 저장변수
unsigned int num=0;
unsigned int val=0;
static int flag=0;
void DBGU_TX_char(unsigned int data) /* transmit a character by DBGU */
{
while(!(DBGU_SR & 0x0002)); // wait until TXRDY=1
DBGU_THR = data; // transmit a character
}
void DBGU_string(char *string) /* transmit a string by DBGU */
{
while(*string != '\0')
{ DBGU_TX_char(*string);
string++;
}
}
void Ledctrl(int val) //계산된 값에 따른 led켜기 함수
{
int i,j=0;
PIO_CODR=0xff;
for(i=0;i<val;i++)
{
j |=1<<i;
}
PIO_SODR = j;
}
unsigned int DBGU_RX_char(void) /* receive a character by DBGU */
{
while(!(DBGU_SR & 0x0001)); // wait until RXRDY=1
return DBGU_RHR; // receive a character
}
void PIT_ISR(void) /* PIT interrupt service routine */
{
unsigned int status;
//AT91F_PITGetPIVR(AT91C_BASE_PITC); // clear PITS
int temp;
static int count=0;
static char pch[10];
if(DBGU_SR & 0x01)
{
temp=DBGU_RHR;
if(temp == '1' && flag==1) //led메뉴 선택시
{
DBGU_string("\rLED 갯수 입력: ");
flag=10;
}
/*else if(temp == '2' && flag==1)
{
DBGU_string("\r시간 입력: ");
flag=2;
}
else if(temp == '3' && flag==1)
{
DBGU_string("\rSTART!\r\n");
PIT_count=Hz;
flag=5;
}
else if(temp == '4' && flag==5)
{
DBGU_string("\rSTOP!\r\n\n");
PIT_count=0;
PIO_CODR=0xff;
flag=0;
}
else if(flag==2)
{
if(temp==13) //입력값이 13(리턴)이라면
{
flag=3;
DBGU_string("\r\n");
Hz=0;
num =1;
val =0;
count--; //배열은 0부터 시작이므로 -1
for( ;count>=0; count--)
{
Hz+=pch[count]*num;
num *= 10;
}
flag=1;
count =0;
return;
}
else if(temp < '0' || temp > '9')
{
DBGU_string("\r\nError!\n");
Hz=0;
flag=0;
count=0;
return;
}
if(count ==0) //0일때 초기화
{
for(num =0 ; num <10; num++)
{
pch[num]=0;
}
}
pch[count] = temp-48; //수신값 입력
count++;
return;
}
*/
else if(flag==10)
{
if(temp < '0' || temp > '9')
{
DBGU_string("\r\nError!\n");
k=0;
flag=0;
return;
}
DBGU_string("\r\n");
k=temp;
k-=48;
flag=1;
DBGU_string("\r\n 1번 메뉴 입력값 먹음\n");
}
return;
}
/*
status=PITC_PIVR;
if(flag!=5)
return;
PIT_count++; // increment PIT_count
if(PIT_count < Hz) // 5Hz/10 = 0.5Hz
return;
PIT_count = 0; // if PIT_count=10, clear it
PIT_flag ^= 0x01; // toggle PIT_flag
if(PIT_flag == 1) //
{
Ledctrl(k);
}
else // if PIT_flag=0, LED2 off
{
PIO_CODR=0xff;
}
}
void Initscreen(void)
{
DBGU_TX_char('\r');
DBGU_string("--MENU--\n\r");
DBGU_string("1. LED\n\r");
DBGU_string("2. PIT\n\r");
DBGU_string("3. START\n\r");
DBGU_string("4. STOP\n\r");
}
int main(void)
{
PIO_OER = 0x00000FFF;
PIO_CODR = 0xFFF;
// enable clock of DBGU
PMC_PCER=(unsigned int)1 << 2;
// DTXD, DRXD by Peripheral A
PIO_ASR = (unsigned int) 1 << 10 | (unsigned int) 1 << 9;
PIO_BSR = 0;
PIO_PDR = (unsigned int) 1 << 10 | (unsigned int) 1 << 9;
// enable peripheral clock for PIT
PMC_PCER = (unsigned int) 1 << 1;
PMC_PCER = (unsigned int) 1 << 2; // enable clock of DBGU
// enable and initialize PIT
PITC_PIMR = (1 * 48 + 8)>>4;
PITC_PIMR = 300000-1;
DBGU_MR = 0x00000800; // normal mode, no parity
DBGU_BRGR = 26; // MCK/16/26 = 115200 bps
DBGU_CR = 0x00000150; // TX, RX enable
DBGU_IER = 0x1; //수신 인터럽트 설정
PITC_PIMR |= (unsigned int) 0x1 << 24;
PITC_PIMR |= (unsigned int) 0x1 << 25;
AIC_IDCR=(unsigned int)1<<1;
AIC_SVR[1]=(unsigned int)PIT_ISR;
AIC_SMR[1]=7;
AIC_ICCR=(unsigned int)1<<1; //sys 인터럽트
AIC_IECR = (unsigned int) 1 <<1;// 인터럽트 허용
while(1)
{
if(flag==0)
{
Initscreen(); //초기메뉴 출력
flag=1;
}
}
}