1)SPI 직렬통신

SPI(Serial Peripheral Interface)는 AVR ATmega128과 주변 장치 또는 동일한 AVR 계열 간의 고속 동기 통신용 모듈로 다음과 같은 특징이 있다.

- 전이중 방식으로 된 , 3선 동기 데이터 전송방식

- 마스터 및 슬레이브 동작

- LSB 또는 MSB 술서로 데이터 송신

- 3비트의 프리스케일 비트를 이용한 7개의 프로그램 비율 조정

- 전송 완료 인터럽트 플래그

- 쓰기 방지 플래그

- idle mode에서의 복귀

- 마스터 SPI 모드의 속도 2배기(doubler)

2)SPI 레지스터

AVR ATmega128의 SPI 모듈의 레지스터로는 SPCR,SPSR,SPDR 등이 있다.

- SPCR(SPI Control Register):SPI 모듈을 설정하고, 위상 및 마스터 등을 설정 하는데 사용한다.

Bit7 : SPIE(SPI Interrupt Enable)

- SPI 전송이 완료되어 SPIFqlxm가 1로 되면서 인터럽트가 발생하는 것을 개별적으로 활성화 한다.

Bit6 : SPE(SPI Enable)

- SPI 모듈을 활성화 한다. SPI를 사용하려면 1로 설정해야 한다.

Bit5 : DORD(Data Order)

- SPI가 데이터를 직렬로 전송하는 순서를 지정하는 비트로 1로 설정하면 LSB부터 전송하고 0으로 설정하면 MSB부터 전송 한다.

Bit4 : MSTR(Master/Slave Select)

- 1로 설정하면 SPI 모듈이 마스터로 동작하고 0으로 설정하면 슬레이브로 동작 한다.

Bit3 : CPOL(Clock Polarity)

- 데이터의 샘플링 동작이 수행되는 SCK 클럭 신호의 극성(Polarity)을 설정한다.

Bit2 : CPHA(Clock Phase)

- 데이터 샘플링 동작이 수행되는 SCK 클럭 신호의 위상(Phase)을 설정한다.

Bit1,0 : SPR1,SPR0(SPI Clock Rate Select 1,0)

-SPI가 마스터로 동작할 경우 SCK클럭 신호의 주파수를 결정한다.

- SPSR(SPI Satus Register) : SPI 모듈의 상태를 나타낸다.

Bit7 : SPIF(SPI Interrupt Flag)

- SPI 전송이 완료되면 1로 셋되어 인터럽트를 요청한다.

Bit6 : WCOL(Wrie Collision Flag)

- SPI가 데이터를 전송하고 있는 동안에 SPDRfp지스터에 새로운 값을 쓰려고 하면 1로셋된다. SPSR 레지스터를 읽고 나서 SPDR 레지스터를 액세스하면 SPIF와 WCOL비트는 0으로 클리어 된다.

Bit5~1 : 예약 비트

Bit0 : SPI2X(Double SPI Speed Bit)

- 1로 설정하면 SPI가 마스터로 동작할 때 SCK 클럭 신호의 주파수를 2배로 설정 된다.

- SPDR(SPI Data Register) : SPI가 송신할 데이터를 저장하거나 수신한 데이터를 저장한다.

Bit7~0 : SPI Data

- SPI가 송신할 데이터를 저장하거나 수신한 데이터를 저장한다. 즉, SPI 데이터 레지스터는 레지스터 파일과 SPI 시프트 레지스터 사이에서 데이터를 전송할 때 읽기/쓰기 레지스터로 사용한다. 쓰기는 레지스터를 초기화시키기 위한 데이터 전송이고, 읽기는 레지스터가 Shift Register가읽혀진 버퍼를 수신한 결과이다.

Posted by 응이

ARM 모델 AT91SAM7S256 를 이용 열센서를 동작 시켜 보자.

먼저 ADC에 대해서 알아보자. ADC란 아날로그 신호를 디지털 신호로 바꿔 신호곡선을 데이터로 변환 하는 일을

처리해 주는 것으로 아래 그림을 보면서 대충 이해하자.

사용자 삽입 이미지

컨버팅(디지털 신호화)을 거쳐 나온 수치 데이터를 이용해서 각종 센서수치로 환산한 후 픽요한 작업들을 하면된다.

아래 함수에 사용된 ADC는 ADC레지스터의 시작 주소를 디파인 한것이다.

 

void InitADC(void)
{

//먼저 ADC의 모든 레지스터 값을 초기화 시킨다.
  ADC->ADC_CR = AT91C_ADC_SWRST;  

 //ADC_MR 레지스터를 통해 샘플링 주기 및 기동시간등을 설정한다. 

  ADC->ADC_MR = 0x02020400;  

//ADC에 사용할 채널을 설정한다. 여기선 4번 채널을 이용

 ADC->ADC_CHER = AT91C_ADC_CH4;  

}


volatile unsigned int GetADCValue(void)
{
  ADC->ADC_CR = AT91C_ADC_START;// ADC 는 ADC_CR레지스터의 START비트가 1로 셋되는 순간부터 변환을

                                //시작한다.컨버딩 할때마다 스타트를 매번 1로 해주어야 한다.

//ADC_SR레지스터의 EOCx 비트를 확인하여 1로 되었다면 변환이 완료 된것이므로   ADC->ADC_CDRx 비트의

//디지탈화된 수치데이터를 읽어 들인다.

while(!(ADC->ADC_SR & AT91C_ADC_EOC4));

return (ADC->ADC_CDR4);
}


int main()
{  
  volatile unsigned int Value;
  unsigned char Str[5];
  volatile unsigned int Cnt=0;
  InitADC(); // ADC 초기설정 함수를 호출
   while(1)
  {
    Value = GetADCValue(); //컨버팅후의 데이터를 반환 받는다.      
  } 
  return 0;
}


ADC를 사용하기 위한 순서를 간략하게 설명하면 다음과 같다.

 - ADC_CR 레지스터를 사용해 설정을 초기화 시킨다.

 - ADC_MR 레지스터를 통해 주기등을 설정한다.

 - ADC_CHER 레지스터를 통해 사용할 채널을 활성화 시킨다.

 - ADC_CR 레지스터의 START비트를 1로 설정해 컨버팅을 시작한다.

 - ADC_SR레지스터의 해당 채널의 비트를 확인해 컨버팅이 완료 되었는지를 확인한다.

 - ADC_CDRx 레지스터를 읽어 디지털화된 수치 데이터를 읽어 들인다.


ADC_MR 레지스터 의 값을 계산하는 공식은 다음과 같다.

SHTIM : Sample & Hold Time

샘플/홀드 시간 = (SHTIM +1)/ADC 클럭 주파수

STARTUP : Start Up Time

기동 시간 = (STARTUP +1)*8/ADC 클럭 주파수

PRESCAL : Prescaler Rate Selection

ADC 클럭 주파수 = MCK/((PRESCAL+1)*2)


 - 10비트 분해능을 사용할 때는 A/D 클럭으로 5MHz 이하를 사용해야 하며, 8비트 분해능을 사용할 때는  A/D 클럭으로 8MHz 이하를 사용해야 한다.

 - 샘플/홀드 시간은 최소 600ns이상이 필요하다.

윗 코드에서는 PRESACL=4로 지정하여 A/D 컨버터에 공급되는 클럭 주파수는 48MHz/((4+1)*2) = 4.8MHz로 설정 하였으며

분해능은 10비트로 설정하였다. 또한SHTIM=2로 설정하여 A/D변환기의 샘플/홀드시간=(2+1)/4.8MHz = 625ns가 되도록 하였고,

STARTUP = 2로 설정하여 기동시간=(2+1)*8/4.8MHz = 5us가 되도록 하였다.

Posted by 응이

ARM Character LCD 제어..

ARM 2008. 11. 12. 19:18

문자 처리.
문자열 처리.
하이퍼터미널로 받은값 처리.
CGRAM 사용으로 사용자 정의문자 처리.


SI로 컴파일..
전부 하나하나 함수이기때문에 갔따 쓰면된다.. 알아서 잘배끼라 ..!!





#include "project.h"
#include "AT91SAM7S256.h"

//#define _StringLCD
//#define _SerialLCD
#define _UserMode  


#define   PIN(num)    AT91C_PIO_PA##num

#define  MY_LOW  (*(AT91_REG *)AT91C_PIOA_CODR)
#define MY_HIGH  (*(AT91_REG *)AT91C_PIOA_SODR)

#define   MY_RS   PIN(8)
#define   MY_RW   PIN(11)
#define   MY_ENB   PIN(12)
#define   MY_DB(num)  PIN(num)

#define MAIN_OSC  18432000     // 크리스탈 속도
#define MAIN_CLK  ((MAIN_OSC*73/14)/2)          // 체배기를 거친 후 속도
#define DBGU_SPEED  115200     // 디버그 유닛 속도


void Reset_DBGU()
{
 // Reset and disable receiver
 AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX;

 // Disable interrupts
 AT91C_BASE_DBGU->DBGU_IDR = 0xFFFFFFFF;

 // Configure PIOs for DBGU
 AT91C_BASE_PIOA->PIO_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD;
 AT91C_BASE_PIOA->PIO_BSR = 0;
 AT91C_BASE_PIOA->PIO_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD;

 // === Configure serial link ===
 // Define the baud rate divisor register [BRGR = MAIN_CLK / (115200 * 16)]
 AT91C_BASE_DBGU->DBGU_BRGR = MAIN_CLK / (DBGU_SPEED * 16);
 // Define the USART mode
 AT91C_BASE_DBGU->DBGU_MR = AT91C_US_PAR_NONE | AT91C_US_CHMODE_NORMAL;

 // Disable the RX and TX PDC transfer requests
 AT91C_BASE_DBGU->DBGU_PTCR = AT91C_PDC_RXTDIS;
 AT91C_BASE_DBGU->DBGU_PTCR = AT91C_PDC_TXTDIS;

 // Enable transmitter
 AT91C_BASE_DBGU->DBGU_CR = AT91C_US_TXEN | AT91C_US_RXEN;
 
}


unsigned char DBGU_Recv_Char()
{
 while (0 == (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY));

 return AT91C_BASE_DBGU->DBGU_RHR;
}


void init_LED()
{
  (*(AT91_REG *)AT91C_PIOA_PER) =  MY_DB(13)|MY_DB(29)|MY_DB(30);
  (*(AT91_REG *)AT91C_PIOA_OER) = MY_DB(13)|MY_DB(29)|MY_DB(30);
  MY_LOW = MY_DB(13)|MY_DB(30);
  MY_HIGH = MY_DB(29);
}

void CharLCDEnable()
{
 AT91C_BASE_PIOA->PIO_PER = PIN(0)|PIN(1)|PIN(2)|PIN(3)|PIN(4)|PIN(5)|PIN(6)|PIN(7)|PIN(8)|PIN(11)|PIN(12);
 
 AT91C_BASE_PIOA->PIO_OER = PIN(0)|PIN(1)|PIN(2)|PIN(3)|PIN(4)|PIN(5)|PIN(6)|PIN(7)|PIN(8)|PIN(11)|PIN(12);
 
}

void Delay()
{
 volatile unsigned int iCnt1;
 for(iCnt1 = 0; iCnt1 < 10000 ; ++iCnt1);
 
}

void CharAllLOW()
{
 MY_LOW = PIN(0)|PIN(1)|PIN(2)|PIN(3)|PIN(4)|PIN(5)|PIN(6)|PIN(7)|PIN(8)|PIN(11)|PIN(12);
}

void Start()
{
 CharAllLOW();
 MY_LOW  = MY_RW;
 Delay();
 MY_HIGH  = MY_ENB;   //4
 Delay();
 
}


void End()
{
 Delay();
 MY_LOW = MY_ENB;
 Delay();
 MY_HIGH = MY_ENB;
 
}


void ClearDisplay()
{
 Start();
 MY_HIGH = MY_DB(0);
 End();
}


void DisplayOnOff()
{
 Start();
 MY_HIGH = MY_DB(2)|MY_DB(3);
 End();
}

void CursorOrDisplayShift()
{
 Start();
 MY_HIGH =MY_DB(2)|MY_DB(3)|MY_DB(4);
 End();
}
void FunctionSet()
{
 Start();
 MY_HIGH = MY_DB(2)|MY_DB(3)|MY_DB(4)|MY_DB(5);
 End();
}


void EntryMode()
{
 Start();
 MY_HIGH = MY_DB(1)|MY_DB(2);
 End();
}

void SetLCD()
{
  FunctionSet();
  DisplayOnOff();
  CursorOrDisplayShift();
  EntryMode();
  ClearDisplay();
}

void WriteDataRam(volatile  unsigned char  cData)
{
 
  CharAllLOW();
  MY_HIGH = MY_RS;
  MY_HIGH  = MY_ENB;   //4
  Delay();

  MY_HIGH = cData;
  Delay();
  MY_LOW = MY_ENB;
  Delay();
  MY_HIGH =MY_RW;
  Delay();
}


void SetDDRamAddr(volatile unsigned int iData)
{
 Start();
 MY_HIGH = MY_DB(7)|iData;
 End();
}


void SetCGRamAddr(volatile unsigned int iData)
{
 Start();
 MY_HIGH = MY_DB(6)|iData;
 End();
}


void StringLCD(volatile unsigned char * cData)
{
 volatile unsigned int iCnt =0;
 
 while(*(cData + iCnt) != 0)
 {
  CharAllLOW();
  MY_HIGH  = MY_RS;
  MY_HIGH  = MY_ENB;   //4
  Delay();

  MY_HIGH = *(cData+iCnt);
  Delay();
  MY_LOW = MY_ENB;
  Delay();
  MY_HIGH =MY_RW;
  Delay();
  iCnt++;
 }
}


void SerialLCD()
{
 volatile unsigned char  DD;
 volatile unsigned int iCnt = 0;
 Reset_DBGU();
 
 while(1)
 {
 
  DD = DBGU_Recv_Char();
 
  if(iCnt == 17)
  {
   SetDDRamAddr(0x40);
  }
 
  if(iCnt == 33)
  {
   ClearDisplay();
   iCnt = 0;
  }
  WriteDataRam(DD);
  iCnt++;
 }
}

void UserMode()
{
 volatile  unsigned int iCnt;
 volatile  unsigned int font[] = {
  0x0E, 0x11, 0x11, 0x0E, 0x00, 0x00, 0x1F, 0x00,
  0x09, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x09,
  0x1E, 0x02, 0x02, 0x02, 0x1F, 0x04, 0x04, 0x04,
  0x00, 0x00, 0x00, 0x15, 0x0A, 0x00, 0x00, 0x00};


 SetCGRamAddr(0x40);
 for(iCnt=0; iCnt <32; iCnt++)
 {
  WriteDataRam(font[iCnt]);
 }

 SetDDRamAddr(0x86);  
 
 WriteDataRam(0x00);
 WriteDataRam(0x01);
 WriteDataRam(0x02);
 WriteDataRam(0x03);
 
}



int main()
{
 init_LED();    // LED SETTING
 CharLCDEnable();   // ALL LCD ENABLE
 CharAllLOW();   // ALL DB LOW SETTING
 
 SetLCD();    // LCD SETTING
 
#ifdef _StringLCD
 StringLCD("ABCDEFG");  // STRING LCD
#endif


#ifdef _SerialLCD
 SerialLCD();    // SERIAL LCD
#endif


#ifdef _UserMode
 UserMode();    // USERMODE(KOREAN)
#endif

 return 0;
}

Posted by 응이

ARM-DBGU 제어 절차

ARM 2008. 10. 24. 10:14

파일확인 해라!!!!!!!
Posted by 응이

ARM Make 분석

ARM 2008. 10. 24. 10:13

AT91SAM7S256 Makefile에 대한 설명

#-----------------------------

# 2008 Mecha Cource - By CM WC, 2008.09.10.

#-----------------------------

ifndef ERASE_FCT// ERASE_FCT 가 정의되어 있지 않다면 정의함

ERASE_FCT=rm -rf// 삭제시 사용할 명령어

endif

ifndef WCCROSS_COMPILE// WCCROSS_COMPILE 가 정의되어 있지 않으면 정의

WCCROSS_COMPILE=arm-elf-// GNUARM의 실행파일명의 일부를 정의

endif

WCTOOL=gcc// GCC 컴파일을 선언

WCOUTFILE_SRAM=at91sam7s_sram_wc// 생성할 기술파일명을 선언함

WCOUTFILE_FLASH=at91sam7s_flash_wc// 생성할 기술파일명을 선언함

WCTARGET=AT91SAM7S256// 타겟은 현재 사용중인 ARM칩으로 설정

WCINCL=./include// 해더파일의 경로를 설정함

# Debug Mode

OPTIM=-Os

// Make 에 내부적으로 미리 정의되어 있음

ifeq ($(WCTOOL), gcc)// define으로 선언된 WCTOOL와 gcc 비교. 만약

AS=$(WCCROSS_COMPILE)gcc// WCTOOL과 gcc가 같다면 밑에있는 endif까지 실행함

CC=$(WCCROSS_COMPILE)gcc// AS는 전처리기. CC는 C컴파일러

LD=$(WCCROSS_COMPILE)gcc// LD는 링커 GCC의 경우 3가지를 모두 포함함

OBJCOPY=$(WCCROSS_COMPILE)objcopy

// 오브젝트 파일을 다른 오브젝트 파일로 복사할 때 사용하는데, 선택적으로

필요한 부분만을 복사할 수 있기 때문에 파일의 사이즈를 줄이는 데 주로 사용되고,

바이너리 포맷을 바꾸는 데도 이용 됨.

OBJDUMP=$(WCCROSS_COMPILE)objdump

// 오브젝트 파일에 대한 정보를 출력한다. 옵션은 어떤 정보를

출력할지 결정함

NM= $(WCCROSS_COMPILE)nm

SIZE=$(WCCROSS_COMPILE)size

CCFLAGS=-g -mcpu=arm7tdmi $(OPTIM) -Wall -I$(WCINCL) -D$(WCTARGET)

// C컴파일러 플래그 정의 (object 파일을 만들기 위함). 내부적으로 정의됨

ASFLAGS=-D__ASSEMBLY__ -D$(WCTARGET) -g -mcpu=arm7tdmi -c $(OPTIM) -Wall -I$(WCINCL)

// 전처리기 플래그 정의 (object 파일을 만들기 위함). 내부적으로 정의됨

LDFLAGS+=-nostartfiles -Wl,--cref

LDFLAGS+=-lc -lgcc

LDFLAGS+=-T elf32-littlearm.lds

// 오브젝트 파일을 링킹 시킬대 사용할 플래그를 정의

OBJS=cstartup.o

endif

OBJS+= lowlevel.o \

main.o

OBJS 는 위에서 보면 cstartup.o 와 lowlevel.o main.o 를 의미함.

3가지 파일이 없기 때문에 각각의 라벨을 찾는다

처음에는 cstartup.o 라벨로 점프 해서 작업을 수행하고 작업완료 하면 lowlevel.o

라벨로 점프해서 작업. 그다음 main.o 로 점프해서 작업을 함.

각각의 작업을 완료하고 나면 sram 라벨로 돌아와서 다음 작업을 수행함

sram 작업이 끝나면 flash 작업을 수행

실행 순서

all->sram->$(OBJS) ->cstartup.o->sram->$(OBJS) ->lowlevel.o ->sram->$(OBJS) ->main.o->sram완료->all->flash->flash완료->all 완료

(6->5->4->2->3->1->) 순서임

all: sram flash

@echo "============111111111111111111111111==============="

rebuild: clean all

sram: $(OBJS)// Ttext는 사용할 처음 주소를 나타냄

@echo "============222222222222222222222222222============="

$(LD) $(LDFLAGS) -Ttext 0x201000 -Tdata 0x200000 -n -o $(WCOUTFILE_SRAM).elf $(OBJS)

$(OBJCOPY) --strip-debug --strip-unneeded $(WCOUTFILE_SRAM).elf -O binary $(WCOUTFILE_SRAM).bin

@echo "============2-------------------------2============="

flash: $(OBJS)// Ttext는 사용할 처음 주소를 나타냄

@echo "============333333333333333333333333333============="

$(LD) $(LDFLAGS) -Ttext 0x100000 -Tdata 0x200000 -n -o $(WCOUTFILE_FLASH).elf $(OBJS)

$(OBJCOPY) --strip-debug --strip-unneeded $(WCOUTFILE_FLASH).elf -O binary $(WCOUTFILE_FLASH).bin

@echo "============3-------------------------3============="

main.o: main.c// 미리정의된 C컴파일러 플래그를 이용하여 오브젝트 파일생성

@echo "============444444444444444444444444444============="

$(CC) -c $(CCFLAGS) main.c -o main.o

@echo "============4-------------------------4============="

lowlevel.o: lowlevel.c// 미리정의된 C컴파일러 플래그를 이용하여 오브젝트 파일생성

@echo "============555555555555555555555555555============="

$(CC) -c $(CCFLAGS) lowlevel.c -o lowlevel.o

@echo "============5-------------------------5============="

cstartup.o: cstartup.S// 미리정의된 전처리기 플래그를 이용하여 오브젝트 파일생성

@echo "============666666666666666666666666666============="

$(AS) $(ASFLAGS) cstartup.S -o cstartup.o

@echo "============6-------------------------6============="

clean:// *.o, *.bin, *elf, * map 파일 clean

@echo "============777777777777777777777777777============="

@clear

$(ERASE_FCT) *.o *.bin *.elf *.map

@echo "============7-------------------------7============="

Posted by 응이

ARM-JTAG-SAMBA 메뉴얼

ARM 2008. 10. 24. 10:13

내용확인은 파일로...
Posted by 응이

elf32-littlearm.lds 분석

/* 2008.09.10. */

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

/*ELF32의 little endian으로 코드를 생성하겠다.*/

/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/

OUTPUT_ARCH(arm)/* binary를 실행할 수 있는 CPU architecture로 Arm*/

ENTRY(reset_handler)/* 프로그램의 시작을 가리키며, 시작되는 함수의 */

/* 이름은 "reset_handler"*/

/* reset_hanger은 cstartup.S의 파일에 있는 루틴*/

SECTIONS

{

.text : { /*실행할 프로그램 코드영역 */

_stext = .;/*Makefile파일에서 가져와서 넣어준다 . 운영체제가.*/

*(.text)/*함수위치*/

*(.rodata)/*Read only Data의 위치 */

*(.rodata*)/*그외에 잡다한것들 */

. = ALIGN(4);/*4바위트 단위로 */

_etext = . ;/*텍스트 영역의 끝주소*/

}

/* collect all initialized .data sections that go into FLASH */

.data : AT ( ADDR (.text) + SIZEOF (.text) ) {

_sdata = .;/* 텍스트 영역의 시작주소 Makefile 로부터 받아옴 */

*(.vectors)/* 벡터테이블 */

*(.data)/* 초기화된 데이타 영역 */

_edata = .;/* 마지막주소 End */

}

/* collect all uninitialized .bss sections that go into FLASH */

.bss (NOLOAD) : { /* 0값이므로 마지막을 게산할 필요가 없음 */

. = ALIGN(4);

_sbss = .;

*(.bss)/*초기화되지 않은 데이타 영역 */

_ebss = .;/*bss영역의 마지막 주소 */

}

}

end = .;

Posted by 응이
 
DBGU를 이용한 UART 통신 순서
Posted by 응이

AT91SAM7S256

ARM 2008. 9. 16. 09:16

#include "project.h"


#define MAIN_OSC  18432000    // 크리스탈 속도
#define MAIN_CLK  ((MAIN_OSC*73/14)/2) // 체배기를 거친 후 속도
#define DBGU_SPEED  115200     // 디버그 유닛 속도
void Test()
{
 // Reset and disable receiver
 AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX;

 // Disable interrupts
 AT91C_BASE_DBGU->DBGU_IDR = 0xFFFFFFFF;

 // Configure PIOs for DBGU
 AT91C_BASE_PIOA->PIO_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD;
 AT91C_BASE_PIOA->PIO_BSR = 0;
 AT91C_BASE_PIOA->PIO_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD;

 // === Configure serial link ===
 // Define the baud rate divisor register [BRGR = MAIN_CLK / (115200 * 16)]
 AT91C_BASE_DBGU->DBGU_BRGR = MAIN_CLK / (DBGU_SPEED * 16);
 // Define the USART mode
 AT91C_BASE_DBGU->DBGU_MR = AT91C_US_PAR_NONE | AT91C_US_CHMODE_NORMAL;

 // Disable the RX and TX PDC transfer requests
 AT91C_BASE_DBGU->DBGU_PTCR = AT91C_PDC_RXTDIS;
 AT91C_BASE_DBGU->DBGU_PTCR = AT91C_PDC_TXTDIS;

 // Enable transmitter
 AT91C_BASE_DBGU->DBGU_CR = AT91C_US_TXEN;
}

void DBGU_Write_String(const char *cData)
{
 while (0 != *cData)
 {
  while (0 == (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY));

  AT91C_BASE_DBGU->DBGU_THR = (*cData++);
 }
}

int main()
{
 volatile unsigned int iCount = 0;

 Test();

 (*(volatile unsigned int *)0xFFFFF400) = 0x0000000F;
 (*(volatile unsigned int *)0xFFFFF410) = 0x0000000F;
 (*(volatile unsigned int *)0xFFFFF430) = 0x00000003;

 while (1)
 {
  for(iCount=0;1000000 >= iCount; ++iCount);
  (*(volatile unsigned int *)0xFFFFF430) = 0x00000001;

  DBGU_Write_String("test\n\r");

  for(iCount=0;1000000 >= iCount; ++iCount);
  (*(volatile unsigned int *)0xFFFFF434) = 0x00000001;

 }
}

Posted by 응이
1

Dream come true.
응이

달력

태그목록