'Busan IT/ARM Controller'에 해당되는 글 31건

  1. 2015.08.19 Interrupt Code, 초음파 센서 SRF05, Timer/Counter
  2. 2015.08.14 ARM UART Interrupt
  3. 2015.08.12 ARM USART(2)
  4. 2015.08.11 ARM USART
  5. 2015.07.31 AIC(2)
  6. 2015.07.29 Interrupt
  7. 2015.07.23 AT91SAM7S256 데이터 시트, LCD 코딩
  8. 2015.07.21 AT91SAM7S254회로도, LED불켜기
  9. 2015.07.20 ARM 데이터시트 및 소스파일 분석
  10. 2015.07.17 ARM Compiler/Cygwin 설치
Busan IT/ARM Controller2015. 8. 19. 16:43

==================================Outline====================================

Interrupt Code

초음파 센서 SRF05

Timer/Counter

----------------------------------------------------------------------------

Interrupt Code


#include <project.h>


unsigned char DBGU_RX()
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_RXRDY) );  //reciever inactive status holding here

  return *AT91C_DBGU_RHR;    //Data read from DBGU_RHR register  
}

void DBGU_TX(char ucData)
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_TXRDY) );  //transmitter inactive status holding here

  *AT91C_DBGU_THR = ucData;    //put data into THR register

  return;
}

void DBGU_STR(const char * cpStr)
{
  while0 != *cpStr)
  {
    DBGU_TX(*cpStr);
    ++cpStr;
  }
}

void DBGU_Init_Polling()      //initiating
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter    
}
void DBGU_Menu()
{
  DBGU_STR("1. LCD Print\n\r");
  DBGU_STR("m. Menu Print\n\r");    
}

void DBGU_RX_ISR()
{  
  //while(*AT91C_DBGU_RHR == 0);
  switch((*AT91C_DBGU_RHR & 0x000000FF))
  {
    default   :  DBGU_STR("Wrong Instruction\n\r");
          DBGU_Menu();
          break;
          
    case 'M'  :  DBGU_Menu();
          break;    
      
    case 'm'  :  DBGU_Menu();
          break;    
          
    case '1'  :  LCD_Inst(LCD_INST_CLR);
          LCD_Print("Hello World");
          break;
          
  }
  
  //RX TX Enable
}

void DBGU_Init_ISR()      //initiating RX with interrupt
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting


  *AT91C_AIC_IDCR  = 1<<AT91C_ID_SYS;    // SYS인터럽트 핀 커맨드 비 활성화 
  
  AT91C_AIC_SVR[AT91C_ID_SYS] = (unsigned int)DBGU_RX_ISR;  // 핸들러 등록  
  AT91C_AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE|
                  AT91C_AIC_PRIOR_LOWEST;        // 동작모드 및 우선순위 결정
  *AT91C_AIC_ICCR  = 1<<AT91C_ID_SYS;    // 커맨드 레지스터 클리어    
  *AT91C_DBGU_IER  = AT91C_US_RXRDY;  //RXRDY 레지스터 활성화  
  *AT91C_AIC_IECR   = 1<<AT91C_ID_SYS;  // SYS 인터럽트 핀 인터럽트 활성화
  
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter      

}




void DBGU_Init()
{
  DBGU_Init_ISR();
}

 

초음파 센서 SRF05

 

센서는 센서의 감지 값을 직접 변환하여 사용해야 하지만 센서 모듈은 사용자가 직접 프로그래밍 과정을 거치지 않고 작동 원리를 알지 않아도 사용자가 바로 사용할 수 있도록 제공된다.

 

 

//음속 : 340m/s

 

 

 

Timer/Counter

 

초음파 센서를 작동시키기 위해서는 Timer/Counter와 인터럽트를 사용해야 한다.

 

ARMTimer/Counter에 대해서 배워보자.


 

Timer/Counter를 사용하기 위해 PMC에서 클럭을 공급해 주어야 한다. TC_CMR을 사용하아 T/C를 조작해야 한다.


 

카운터가 최대 값에 도달한 후 0으로 떨어질 수도 있지만 숫자가 서서히 감소할 수도 있다.

이를 이용하여 다양한 파형을 만들 수 있다.

반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

Timer/Counter  (0) 2015.09.07
주파수와 ARM 메모리맵  (0) 2015.08.28
ARM UART Interrupt  (0) 2015.08.14
ARM USART(2)  (0) 2015.08.12
ARM USART  (0) 2015.08.11
Posted by newind2000
Busan IT/ARM Controller2015. 8. 14. 17:06

==================================Outline====================================

ARM UART Interrupt 

----------------------------------------------------------------------------

 

수신 인터럽트를 만들어서 데이터 통신을 해보자.

 

 

구현하고자하는 내용은 키보드에 ‘m' 또는 ’M'을 입력하였을 때 ARM에서 메뉴를 표시하게 하고 그 이 외의 값을 입력했을 때는 잘못 입력되었음을 출력하는 것이다.

 

기존에 있던 DBGU_Init 함수를 복사하여 DBGU_Init_ISR을 만들고 난 후 DBGU_Init_Polling으로 이름을 바꾼 후 코딩을 하자.

 

DBGU_Init_ISR에서 인터럽트를 사용하기 위한 코드를 추가해야 한다.

송수신을 활성화 시키는 코드를 가장 밑으로 내리고 그 바로 위에 코딩을 해보자.

 

void DBGU_Init_ISR()      //initiating RX with interrupt
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting


  *AT91C_AIC_IDCR  = 1<<AT91C_ID_SYS;    // SYS인터럽트 핀 커맨드 비 활성화 
  
  AT91C_AIC_SVR[AT91C_ID_SYS] = (unsigned int)DBGU_RX_ISR;  // 핸들러 등록  
  AT91C_AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE|
                  AT91C_AIC_PRIOR_LOWEST;        // 동작모드 및 우선순위 결정
  *AT91C_AIC_ICCR  = 1<<AT91C_ID_SYS;    // 커맨드 레지스터 클리어    
  *AT91C_DBGU_IER  = AT91C_US_RXRDY;  //RXRDY 레지스터 활성화  
  *AT91C_AIC_IECR   = 1<<AT91C_ID_SYS;  // SYS 인터럽트 핀 인터럽트 활성화
  
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter      

} 


interrupt 핸들러에 등록되어 있는 함수를 만들자. 간단하게 메뉴를 띄우는 함수이다.


void DBGU_Menu()
{
  DBGU_STR("1. LCD Print\n\r");
  DBGU_STR("m. Menu Print\n\r");    
}

void DBGU_RX_ISR()
{  
  //while(*AT91C_DBGU_RHR == 0);
  switch((*AT91C_DBGU_RHR & 0x000000FF))
  {
    default   :  DBGU_STR("Wrong Instruction\n\r");
          DBGU_Menu();
          break;
          
    case 'M'  :  DBGU_Menu();
          break;    
      
    case 'm'  :  DBGU_Menu();
          break;          
  }
  
  
  
  //RX TX Enable
}




/*** 전체 소스 코드 ***/


#include <project.h>


unsigned char DBGU_RX()
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_RXRDY) );  //reciever inactive status holding here

  return *AT91C_DBGU_RHR;    //Data read from DBGU_RHR register  
}

void DBGU_TX(char ucData)
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_TXRDY) );  //transmitter inactive status holding here

  *AT91C_DBGU_THR = ucData;    //put data into THR register

  return;
}

void DBGU_Init_Polling()      //initiating
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter    
}
void DBGU_Menu()
{
  DBGU_STR("1. LCD Print\n\r");
  DBGU_STR("m. Menu Print\n\r");    
}

void DBGU_RX_ISR()
{  
  //while(*AT91C_DBGU_RHR == 0);
  switch((*AT91C_DBGU_RHR & 0x000000FF))
  {
    default   :  DBGU_STR("Wrong Instruction\n\r");
          DBGU_Menu();
          break;
          
    case 'M'  :  DBGU_Menu();
          break;    
      
    case 'm'  :  DBGU_Menu();
          break;          
  }
  
  
  
  //RX TX Enable
}

void DBGU_Init_ISR()      //initiating RX with interrupt
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting


  *AT91C_AIC_IDCR  = 1<<AT91C_ID_SYS;    // SYS인터럽트 핀 커맨드 비 활성화 
  
  AT91C_AIC_SVR[AT91C_ID_SYS] = (unsigned int)DBGU_RX_ISR;  // 핸들러 등록  
  AT91C_AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE|
                  AT91C_AIC_PRIOR_LOWEST;        // 동작모드 및 우선순위 결정
  *AT91C_AIC_ICCR  = 1<<AT91C_ID_SYS;    // 커맨드 레지스터 클리어    
  *AT91C_DBGU_IER  = AT91C_US_RXRDY;  //RXRDY 레지스터 활성화  
  *AT91C_AIC_IECR   = 1<<AT91C_ID_SYS;  // SYS 인터럽트 핀 인터럽트 활성화
  
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter      

}


void DBGU_STR(const char * cpStr)
{
  while0 != *cpStr)
  {
    DBGU_TX(*cpStr);
    ++cpStr;
  }
}

void DBGU_Init()
{
  DBGU_Init_ISR();
}


반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

주파수와 ARM 메모리맵  (0) 2015.08.28
Interrupt Code, 초음파 센서 SRF05, Timer/Counter  (0) 2015.08.19
ARM USART(2)  (0) 2015.08.12
ARM USART  (0) 2015.08.11
AIC(2)  (0) 2015.07.31
Posted by newind2000
Busan IT/ARM Controller2015. 8. 12. 17:02

==================================Outline====================================

ARM USART(2)

----------------------------------------------------------------------------

 데이터 시트에 있는 DBGU 레지스터를 보고 데이터 송수신을 위한 코딩을 해보자.







  

/*** 코드 ***/

<DBGU.c>

#include <project.h>

void DBGU_Init()      //initiating
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter    
}

unsigned char DBGU_RX()
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_RXRDY) );  //reciever inactive status holding here

  return *AT91C_DBGU_RHR;    //Data read from DBGU_RHR register  
}

void DBGU_TX(char ucData)
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_TXRDY) );  //transmitter inactive status holding here

  *AT91C_DBGU_THR = ucData;    //put data into THR register

  return;
}


 <main.c>


#include <project.h>

int main(void)
{

  LCD_Init();
  DBGU_Init();
  
  while (1)
  {
    LCD_Data(DBGU_RX() );
  }


  
  return 0;
}

 

반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

Interrupt Code, 초음파 센서 SRF05, Timer/Counter  (0) 2015.08.19
ARM UART Interrupt  (0) 2015.08.14
ARM USART  (0) 2015.08.11
AIC(2)  (0) 2015.07.31
Interrupt  (0) 2015.07.29
Posted by newind2000
Busan IT/ARM Controller2015. 8. 11. 17:42

==================================Outline====================================

ARM USART

----------------------------------------------------------------------------

 

ARM USART

 

DMA(Direct Memory Access)

일반적으로 데이터를 한 메모리에서 다른 메모리로 옮길 때는 CPU를 사용하여야 한다. 하지만 CPU가 연산이 아닌 단순 데이터 이동에만 사용되는 것을 막기 위해 DMA Controller를 사용하여 단순 메모리 이동 작업을 한다.

 

 

Local loopback은 내부적인 가상 LAN이다. 기본 USART모드에 추가하여 상위 3가지 모드를 사용할 수 있다.

 

USART를 사용하기 위한 초기화 설정을 해보자.

 

reset 값이 ‘-’면 리셋시 랜덤 값을 가진다는 의미이다.

 

void DBGU_Init()
{
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RXDIS | AT91C_US_TXDIS; //Transmitter&Reciever Disable

}







 

반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

ARM UART Interrupt  (0) 2015.08.14
ARM USART(2)  (0) 2015.08.12
AIC(2)  (0) 2015.07.31
Interrupt  (0) 2015.07.29
AT91SAM7S256 데이터 시트, LCD 코딩  (0) 2015.07.23
Posted by newind2000
Busan IT/ARM Controller2015. 7. 31. 16:05

==================================Outline====================================

AIC(Advanced Interrupt Controller)

----------------------------------------------------------------------------

Psudo Code(의사코드)에 맞춰서 AIC_Init 계속해서 코딩

 

핸들러를 등록하는 코드에서 AIC_SVR은 인터럽트가 존재하는 소스코드의 주소를 입력해 주어야 한다.

PIO로 입력을 받게 되고 함수의 주소를 넣으려면 함수의 이름을 괄호(‘()’) 없이 써주면 되기 때문에 코드는 아래와 같다.

 

AT91C_AIC_SVR[AT91C_ID_PIOA] = (unsigned int)HANDLER;

핸들러로 넘어와서...





Handler함수에서는 인터럽트가 발생할 시 수행하고 싶은 코드를 입력한다.

#include <AIC.h>
#include <AT91SAM7S256.h>



void LED_Wink(unsigned int uiPort)
{
  volatile unsigned int iCount;
  while (1)
  {
    *AT91C_PIOA_SODR = uiPort; //SET으로 바꾸고 싶은 자리에 1을 넣으면 high로 바뀐다.
               //다른 비트에는 영향을 미치지 않는다.

    for(iCount=0;1000000 >= iCount; ++iCount);

    *AT91C_PIOA_CODR = uiPort; //SET으로 바꾸고 싶은 자리에 1을 넣으면 low로 바뀐다.
               //다른 비트에는 영향을 미치지 않는다.
  

    for(iCount=0;1000000 >= iCount; ++iCount);
  }
}
void HANDLER(void)
{
  volatile unsigned int uiIsr;
  volatile unsigned int uiCnt;

  uiIsr = *AT91C_PIOA_ISR;  //인터럽트 핀 정보 저장 
  if(0 != (uiIsr && (1<< INT_PIN) ) )
  {    
    LCD_Init();    
  }

  for(uiCnt=01000000>uiCnt; ++uiCnt);  //인터럽트 중복 방지 장치

  uiIsr = *AT91C_PIOA_ISR;  //ISR 레지스터 클리어
  *AT91C_AIC_EOICR = 0;  // End Code, no effect but insisted.

  return;  
}


void AIC_Init()  
{
  LCD_Init();    //LCD initiating
  
  *AT91C_PMC_PCER       = 1   <<   AT91C_ID_PIOA;   //전원공급(PIOA)활성화 - 데이터 시트 33PAGE
  *AT91C_PIOA_PER   = 1   <<   INT_PIN | 1 << 0x0A;//핀 활성화 - 데이터 시트 248PAGE
  *AT91C_PIOA_ODR   = 1   <<   INT_PIN | 1 << 0x0A;//핀 출력 비활성화
  *AT91C_PIOA_IDR   = 1   <<   INT_PIN;     //인터럽트 핀 비활성화
  *AT91C_PIOA_IFER   = 1  <<   INT_PIN;     //PIOA 입력 필터 활성화(잡음 제거 필터)

  *AT91C_AIC_IDCR  = 1  <<   AT91C_ID_PIOA;  //인터럽트 핀 커맨드 비 활성화
  *AT91C_AIC_ICCR  = 1  <<   AT91C_ID_PIOA;  //커맨드 레지스터 클리어
  *AT91C_AIC_ISCR    = 1  <<   AT91C_ID_PIOA;  //커맨드 레지스터 셋
  AT91C_AIC_SVR[AT91C_ID_PIOA] 
            =  (unsigned int)HANDLER;  //핸들러 등록 (7/29 여기까지)
  AT91C_AIC_SMR[AT91C_ID_PIOA]
            = AT91C_AIC_SRCTYPE_POSITIVE_EDGE  | 
               AT91C_AIC_PRIOR_LOWEST  ;  //동작 모드 및 우선순위 결정 

  
  *AT91C_PIOA_IER   = 1   <<   INT_PIN;      //인터럽트 핀 인터럽트 활성화  
  *AT91C_AIC_IECR    = 1   <<  AT91C_ID_PIOA;  //AIC 인터럽트 핀 인터럽트 활성화
  
            
  
  
  return;
}


 

 

 

 

 

반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

ARM USART(2)  (0) 2015.08.12
ARM USART  (0) 2015.08.11
Interrupt  (0) 2015.07.29
AT91SAM7S256 데이터 시트, LCD 코딩  (0) 2015.07.23
AT91SAM7S254회로도, LED불켜기  (0) 2015.07.21
Posted by newind2000
Busan IT/ARM Controller2015. 7. 29. 17:40

==================================Outline====================================

Interrupt

----------------------------------------------------------------------------

Interrupt

 

 

ARM은 전형적인 폰노이먼 구조를 띈다.

 

// PMC(Power Management Controller)

 

// AIC(Advanced Interrupt Controller)

 

Interrupt를 사용해 보자.




FIQIRQ보다 속도가 빠르다.

High-drive는 최대 16mA전류를 방출할 수 있다.

//나머지 핀들은 8mA이다.

 

총 핀들의 방출 전류의 합은 150mA를 넘을 수 없다.

 

ARM에서는 인터럽트 함수 이름을 사용자가 정의할 수 있다.

//ATmega는 인터럽트 함수 이름이 정의되어 있다.

 

C에서 함수 자체는 주소 값을 뜻함으로 interrupt의 주소에 사용자가 만든 함수를 넣으면 사용자가 작성한 함수가 호출되게 된다.

 

//ATmegaARM의 인터럽트 사용법이 다른 이유는 사용하는 core가 다르기 때문이다.

 

검출 모드 설정(트리거 설정)



 

FIQ가 가장 우선시 되고 PRIOR7이 우선순위이고 0으로 갈수록 우선순위가 낮아진다.

 

 

IRQID: Current Interrupt Identifier

The Interrupt Status Register returns the current interrupt source number.

 

PID 2번에 맞춰서 짜겠다.

 

PSUDO CODE란 인간이 인지할 수 있는 문장으로 어떠한 코드를 작성할 것인지 적어 놓은 것이다.


주어진 PSUDO CODE에 따른 코드는 다음과 같다.


#include "AIC.h"
#include "AT91SAM7S256.h"

void HANDLER(void)
{
  static volatile unsigned int uiIsr;
  volatile unsigned int uiCnt;

  if()
  {
  
  }

  for(uiCnt=01000000>uiCnt; ++uiCnt);

  return;  
}


void AIC_Init()  
{
  *PMC_PCER       = 1   <<   AT91C_ID_PIOA;   //전원공급(PIOA)활성화 - 데이터 시트 33PAGE
  *AT91C_PIOA_PER   = 1   <<   INT_PIN;      //핀 활성화 - 데이터 시트 248PAGE
  *AT91C_PIOA_ODR   = 1   <<   INT_PIN;       //핀 출력 비활성화
  *AT91C_PIOA_IDR   = 1   <<   INT_PIN;       //인터럽트 핀 비활성화
  *AT91C_PIOA_IFER   = 1  <<   INT_PIN;       //PIOA 입력 필터 활성화(잡음 제거 필터)

  *AT91C_AIC_IDCR  = 1  <<   AT91C_ID_PIOA;  //인터럽트 핀 커맨드 비 활성화
  *AT91C_AIC_ICCR  = 1  <<   AT91C_ID_PIOA;  //커맨드 레지스터 클리어
  *AT91C_AIC_ISCR    = 1  <<   AT91C_ID_PIOA;  //커맨드 레지스터 셋
  AT91C_AIC_SVR[AT91C_ID_PIOA] 
            =  (unsigned int)HANDLER;  //핸들러 등록 (7/29 여기까지)  
  
  return;
}




반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

ARM USART  (0) 2015.08.11
AIC(2)  (0) 2015.07.31
AT91SAM7S256 데이터 시트, LCD 코딩  (0) 2015.07.23
AT91SAM7S254회로도, LED불켜기  (0) 2015.07.21
ARM 데이터시트 및 소스파일 분석  (0) 2015.07.20
Posted by newind2000
Busan IT/ARM Controller2015. 7. 23. 17:42

================================ Outline ====================================

AT91SAM7S256 데이터 시트

LCD 코딩 

----------------------------------------------------------------------------

 

AT91SAM7S256 데이터 시트

 

5V-tolerant I/Os, including Four High-current Drive I/O lines, Up to 16 mA Each (SAM7S161/16 I/Os Not 5V-tolerant)

 

- ARM3.3V전압을 인가 받지만 5V 전압도 견딜 수 있게 설계되어 있다.

 

우리가 사용하는 character LCD5V를 사용하지만 다행히 ARM에서 인가하는 3.3V도 작동한다.

 

//현재 사용하고 있는 Character LCDback light 연결을 위해서 15pinGND

//16pinGCC(5V)이다.

 

assembly에서 ‘\’를 사용하면 엔터 입력 시 다음 줄이 이전 줄에 줄맞춤 된다.

 

 

 

AT91SAM7S256.h에서 PIOdefine 된 값을 찾아보자.

 

LCD 코딩

Assembly로 정의될 때만 PIO_PER를 쓸 수 있을 뿐만 아니라 주소 값도 datasheet에서 본 FFFFF400이 아님을 알 수 있다.

 

우리가 찾는 FFFFF400값을 검색해서 찾아보자.

 

 

#ifndef __ASSEMBLY__

typedef volatile unsigned int AT91_REG;// Hardware register definition

#define AT91_CAST(a) (a)

#else

#define AT91_CAST(a)

#endif

 

Assembly가 아님으로 밑에 #define AT91_CAST(a) (a) 값이 작동하며 본래 그대로의 값임을 알 수 있다.

 

AT91_REG * typedef volatile unsigned int 이다.


타이밍도를 보고 딜레이를 주어 코딩을 해보자.




#include <AT91SAM7S256.h>
#include "LCD.h"

volatile unsigned int uiCnt;

#define Delay(x) for(uiCnt = 0; uiCnt < x; ++uiCnt)
#define LCD_FAR_INST(x) (    ((x))  << 16  & (LCD_BUS)       );
void LCD_Init()
{    
  //*PIO_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  //Assembly code
  *AT91C_PIOA_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  
  //AT91C_BASE_PIOA->PIO_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  
  *AT91C_PIOA_PPUDR = LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  
}

void LCD_Inst(unsigned int uiInst)
{
  //initiatation in reference with timing map

  *AT91C_PIOA_CODR = LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  //all pin low :: all init
  Delay(100000);
  Delay(100000);

  *AT91C_PIOA_SODR = LCD_EN;    //only enable high

  Delay(100000);
  Delay(100000);     
  
  *AT91C_PIOA_SODR = LCD_FAR_INST(uiInst);  //input data
  
  Delay(100000);
  Delay(100000);    

  *AT91C_PIOA_CODR = LCD_EN;    //only enable low

  Delay(100000);    
  Delay(100000);      
}


반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

AIC(2)  (0) 2015.07.31
Interrupt  (0) 2015.07.29
AT91SAM7S254회로도, LED불켜기  (0) 2015.07.21
ARM 데이터시트 및 소스파일 분석  (0) 2015.07.20
ARM Compiler/Cygwin 설치  (0) 2015.07.17
Posted by newind2000
Busan IT/ARM Controller2015. 7. 21. 17:27

================================ Outline ====================================

AT91SAM7S254회로도 

LED불켜기

----------------------------------------------------------------------------

AT91SAM7S254회로도 


http://www.devicemart.co.kr/5713 에서 회로도를 다운로드 받는다.




 

 

 

 

regulator - 전압을 규칙적으로 공급해주는 소자

Regulator에서 남은 전압은 열로 방출되기 때문에 발열이 발생한다.

발열이 많은 소자는 보드에서 떨어뜨린 후(플라스틱을 사용하여 이격) 납땜을 한다.




LED 불켜기


LED에 불을 켜는 코딩을 해보자.


소스를 컴파일 한 후 arm을 USB 포트에 연결하여 pc에 끼운다.


Sam-ba를 실행한다.


컴파일 된 flash용 bin파일을 올려준다.








/*** 소스 ***/


#define  PIO_PER    (*((volatile unsigned int *)0xFFFFF400))  //PIO enable register
#define  PIO_PDR    (*((volatile unsigned int *)0xFFFFF404))
#define  PIO_PSR    (*((volatile unsigned int *)0xFFFFF408))
#define  PIO_OER    (*((volatile unsigned int *)0xFFFFF410))
#define  PIO_ODR    (*((volatile unsigned int *)0xFFFFF414))
#define  PIO_OSR    (*((volatile unsigned int *)0xFFFFF418))
#define  PIO_IFER  (*((volatile unsigned int *)0xFFFFF420))
#define  PIO_IFDR  (*((volatile unsigned int *)0xFFFFF424))
#define  PIO_IFSR  (*((volatile unsigned int *)0xFFFFF428))
#define  PIO_SODR  (*((volatile unsigned int *)0xFFFFF430))
#define  PIO_CODR  (*((volatile unsigned int *)0xFFFFF434))
#define  PIO_ODSR  (*((volatile unsigned int *)0xFFFFF438))
#define  PIO_PDSR  (*((volatile unsigned int *)0xFFFFF43C))
#define  PIO_IER    (*((volatile unsigned int *)0xFFFFF440))
#define  PIO_IDR    (*((volatile unsigned int *)0xFFFFF444))
#define  PIO_IMR    (*((volatile unsigned int *)0xFFFFF448))
#define  PIO_ISR    (*((volatile unsigned int *)0xFFFFF44C))
#define  PIO_MDER  (*((volatile unsigned int *)0xFFFFF450))
#define  PIO_MDDR  (*((volatile unsigned int *)0xFFFFF454))
#define  PIO_MDSR  (*((volatile unsigned int *)0xFFFFF458))
#define  PIO_PUDR  (*((volatile unsigned int *)0xFFFFF460))
#define  PIO_PUER  (*((volatile unsigned int *)0xFFFFF464))
#define  PIO_PUSR  (*((volatile unsigned int *)0xFFFFF468))
#define  PIO_ASR    (*((volatile unsigned int *)0xFFFFF470))
#define  PIO_BSR    (*((volatile unsigned int *)0xFFFFF474))
#define  PIO_ABSR  (*((volatile unsigned int *)0xFFFFF478))
#define  PIO_OWER  (*((volatile unsigned int *)0xFFFFF4A0))
#define  PIO_OWDR  (*((volatile unsigned int *)0xFFFFF4A4))
#define  PIO_OWSR  (*((volatile unsigned int *)0xFFFFF4A8))

int main()
{
  volatile unsigned int iCount = 0;
  
  PIO_PER = 0x00000003;  //0,1번 핀을 활성화 시킨다.
  PIO_OER = 0x00000003;  //0,1번 핀을 출력 시킨다.
  

  

  while (1)
  {
    PIO_SODR = 0x00000003//SET으로 바꾸고 싶은 자리에 1을 넣으면 high로 바뀐다.
               //다른 비트에는 영향을 미치지 않는다.

    for(iCount=0;1000000 >= iCount; ++iCount);

    PIO_CODR = 0x00000003//SET으로 바꾸고 싶은 자리에 1을 넣으면 low로 바뀐다.
               //다른 비트에는 영향을 미치지 않는다.
  

    for(iCount=0;1000000 >= iCount; ++iCount);
  }  


  return 0;
}




cstartup.S


elf32-littlearm.lds


lowlevel.c


main.c


Makefile



반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

Interrupt  (0) 2015.07.29
AT91SAM7S256 데이터 시트, LCD 코딩  (0) 2015.07.23
ARM 데이터시트 및 소스파일 분석  (0) 2015.07.20
ARM Compiler/Cygwin 설치  (0) 2015.07.17
AT91SAM7S256 데이터시트, 드라이버 설치  (0) 2015.07.16
Posted by newind2000
Busan IT/ARM Controller2015. 7. 20. 17:34

================================ Outline ====================================

ARM 데이터시트 및 소스파일 분석

----------------------------------------------------------------------------

 

보드(board)를 사용할 때 우선적으로 해야 할 것은 보드에 대한 제어권을 얻는 것이다. 데이터 시트와 driver, 컴파일러를 다운 받아 설치한다.(개발 환경을 만든다.)

 

압축을 푼 폴더를 열어 index.html을 실행시킨다.

프로젝트 부분에 가면 몇가지 예제들이 소스 코드와 함께 나와 있다.. 무료 컴파일러인 GNU소스를 참조하면 된다.

ATmega를 사용할 때 WinAVR에서 make파일과 컴파일러를 링크 파일을 사용하여 연결해준다.

 

//Booting은 프로그램을 시작하기 위한 작업을 한다. 이 때 Boot Code를 사용한다. Boot Code는 기계어 또는 Asseble어를 사용하여 만든다.

 

예제 소스코드가 있는 폴더를 열어보자.

elf32-littlearm.lds 코드를 열어본다.




 

// 헤더 파일에는 본문의 형식이 적혀 있다.

.text 영역에는 code가 적혀있다. ‘.rodata’는 읽기 전용 데이터로써 변수가 적혀있다. ‘.data’형식에는 전역 변수가 적혀있다.

 

PE format(Portable Executable)은 마이크로소프트의 윈도우 3.1부터 지원하는 실행 파일의 형식을 말한다.

SECTIONS

{

/*** 코드 영역 ***/

.text : {

_stext = .;

*(.text)

*(.rodata)

*(.rodata*)

. = ALIGN(4); //4byte 단위로 최적화

_etext = . ;

}

/*** 데이터 영역 ***/

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

//코드 영역과 데이터 영역이 붙어있다.

_sdata = .;

*(.vectors)

*(.data)

_edata = .;

}

 

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

.bss (NOLOAD) : {

. = ALIGN(4);

_sbss = .;

*(.bss)

_ebss = .;

}

}

end = .;

 

 

지역변수(stack영역)는 파일을 실행할 때(메모리에 올릴 때) 크기를 차지한다. 전역변수(data, bss, code영역)은 컴파일 시 할당된다.

 

 

BSS영역의 데이터(값이 ‘0’인 전역변수) code영역에서 크기가 얼마나 되는지 기입만 해놓는다. 때문에 따로 load할 필요가 없다.




code 영역이 늘어나는 경우는 코딩의 양이 많거나 상수를 많이 쓰는 경우이다. 때문에 중복되는 상수를 사용할 경우에는 포인터를 사용하여 해당 상수를 출력해 주어야 한다.

 

lowlevel.ccstartup.S가 사용하는 코드이다.(cstartup.S의 일부이다.)

 

makefile의 내용은 아래와 같다.

all: sram flash 에서 사용하는 code영역(-Ttext)의 메모리 주소를 기억해 두자.

 

 

CDMA는 미국의 Qualcomm사가 만들어서 한국에서 1996년에 최초로 상용화하였다. 이 때 사용한 칩이 ARM사의 MSM이다.

 

과거에는 CPUCDMA가 일체형으로 들어있었지만 현재는 CPUCDMA가 분리되어 있다.

 

include 폴더에 있는 AT91SAM7S256.h 헤더파일은 ARM사에서 제공하는 메모리 값이 정의된 파일이다. 이것을 사용하지 않고 직접 작성하여 사용하기로 한다. -_

 

ARM7TDMI

 

ICE: core를 외부에서 조작할 수 있다.

 

JTAG: 외부에서 연결가능, 프로그램 동작 중 정지 시킬 수 있다. visual studiodebug 기능과 유사하다.

 

//block diagram에서 굵은 화살표는 bus를 가리킨다.

 

 

ARM 폰 노이만 구조를 띈다.

 

internal flash메모리가 첫 번째 메모리의 주소를 가지고 있다.

//메모리 위치를 바꾸는 것을 전문 용어로 remap이라 한다.

 

실제로 조작 가능한 메모리는 internal memories3mb만 사용하고 그 중에서도 실제로 사용하는 메모리는 260kb에 불가하다.

 

flash는 코드 영역이고 sram은 시스템 영역이다. heap은 동작 중에 사용 된다.

 

Peripheral mapping GPIO를 말한다. Internal PeripheralsSYSCPIOA의 주소를 찾아서 조작하여야 한다.






 

20150720.hwp


반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

Interrupt  (0) 2015.07.29
AT91SAM7S256 데이터 시트, LCD 코딩  (0) 2015.07.23
AT91SAM7S254회로도, LED불켜기  (0) 2015.07.21
ARM Compiler/Cygwin 설치  (0) 2015.07.17
AT91SAM7S256 데이터시트, 드라이버 설치  (0) 2015.07.16
Posted by newind2000
Busan IT/ARM Controller2015. 7. 17. 16:55

================================ Outline ====================================

ARM Compiler 설치

Cygwin 설치

----------------------------------------------------------------------------

 

ARM compiler 설치

 

http://www.doc.ironwoodlabs.com/gnuarm/gnuarm-distribution/web/www.gnuarm.com// 에 접속하여,

요놈을 다운 받는다. 다운 받은 후 별도의 조작 없이 설치한다.

 

 

도스를 실행 시켜서 아래와 같이 나와야 컴파일러가 정상적으로 설치된 것이다.

 

경로는 C:\Program Files\GNUARM 이다.

 

다운받은 소스파일이 있는 폴더에서 도스 명령어창을 실행하여 'make'를 입력한다.

make clean명령어를 입력하면 오류가 뜨는데 makefile을 띄워서 맨 아래 clean 부분을 다음과 같이 수정해 준다.

 

clean:

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

 

Cygwin 설치


https://www.cygwin.com/ 에 접속하여 Windows에 맞는 setup파일을 다운로드 받아 설치한다. 리눅스 명령어를 윈도우 도스 창에서도 사용 가능하도록 만들어주는 프로그램이다.

 

별 다른 조작 없이 설치해주고 다운로드 받을 적당한 서버를 선택한 후 select packages 창이 뜨면 ‘Base’ 값을 Default에서 'Install'로 바꿔준다.




 

 

반응형
Posted by newind2000