[DSP]/PICCOLO2011. 4. 30. 20:30

[TMS320F28069 EVM] Timer Interrupt Test - 1초 만들기

[TMS320F28069] Timer Interrupt Test - 1초 만들기

TMS320F28069 Piccolo시리즈는 3개의 32비트 시스템 타이머가 있다.



시스템 타이머 초기화 함수
ConfigCpuTimer() 함수를 이용하면 쉽게 설정 가능하다. 설정할 인자는 각각 아래와 같다.

//-----------------------------------------------------------------------------
//Timer0 Init
void Timer0Init(void)
{
 //인터럽트 루핸들러 설정
 EALLOW;
 PieVectTable.TINT0 = &Timer0Isr;
 EDIS;

//CPU Timer초기화
 InitCpuTimers();

 // Configure CPU-Timer 0 to interrupt every second:
 // 80MHz CPU Freq, 1 second Period (in uSeconds)
 ConfigCpuTimer(&CpuTimer0, 80, 1000);
 StartCpuTimer0();
 
 // Enable CPU INT1 which is connected to CPU-Timer 0:
    IER |= M_INT1;

 // Enable TINT0 in the PIE: Group 1 interrupt 7
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    
 // Enable global Interrupts and higher priority real-time debug events:
    ERTM;   // Enable Global realtime interrupt DBGM    
}
//-----------------------------------------------------------------------------

interrupt void Timer0Isr(void)
{
 Timer0Handler(); 

 // Acknowledge this interrupt to receive more interrupts from group 1
 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}



TMS320F28069 EVM Timer 테스트 예제 소스
1초마다 LED깜박이는 예제 테스트
#include "system.h"
#include "timer.h"

void Timer0Handler(void);

volatile unsigned int gTimeTick_1ms = 0;

void Timer0Handler(void)
{
 gTimeTick_1ms++;
}

void main(void)
{
 //DSP System Initialize
 SystemInit();

 Led1Init();
 Led1On();

 //타이 인터럽트 초기화
 Timer0Init();
 enable();  //Enable Global realtime interrupt

 while(1)
 {
  if(gTimeTick_1ms>1000)
  {
   gTimeTick_1ms = 0;
   Led1Toggle();
  }
 }
}  
Posted by nexp

댓글을 달아 주세요

[DSP]/PICCOLO2011. 4. 30. 18:30

[TMS320F28069 EVM] GPIO토글 속토 측정

[TMS320F28069 EVM] GPIO토글 속토 측정



TMS320F28069 는 최대 클럭 80Mhz까지 가능하다. GPIO Toggle 속도를 측정해 보았다.

void main(void)
{
 //DSP System Initialize
 SystemInit();

 //LED Initialize
 Led1Init();
 Led1On();

 while(1)
 {
  GpioDataRegs.GPBTOGGLE.all = BIT34;
 }
}


메모리로 제어하기
아래 코드와 같이 비트 단위로 쉽게 제어 하기 위해 메모리로 제어하면  5Mhz정도가 정도가 나온다.
GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;





레지스터로 제어하기
8Mhz정도가 나오는데... 메모리 제어 처럼 보이지만 결국 레지스터 주소를 사용하므로 레지스터만 사용한다.



컴파일러에서 옵티마이즈 해 줄것으로 예상했지만 옵션을 바꿔봐도 메모리 제어, 레지스터 제어 결과가 다르게 나온다.
프로그램작성은 편할지 몰라도 그만큼 속도의 희생이 필요한것 같다.

앞으로 GPIO제어에는 레지스터 접근방법을 사용해야 겠다.
#define Led1Off()      GpioDataRegs.GPBSET.bit.GPIO34 = 1;
#define Led1On()      GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;

[참고] MCU속도 측정 결과 
Posted by nexp

댓글을 달아 주세요

[DSP]/PICCOLO2011. 4. 29. 22:30

[TMS320F28069 EVM] UART 테스트

[TMS320F28069 EVM] UART 테스트


UART를 테스트 하기 위해 예제 코드를 수정해서 테스트했다. 기존 TMS320F2808 예제 소스코드와 거의 동일하기 때문에 특별히 수정할것이 없을것 같았는데... 컴파일까지는 에러없이 된다.

다운로드 후 테스트 해보니 UART로 아무런 데이터도 전송되지 않는다.
무엇때문일까?


예제 코드를 보니 TMS320F2808과 같은 구조이다.(거의 코드 수정없이 가능하다. 코드는 문제가 아니라는 것인데...) 그렇다면 큰 문제없어야 할텐데...
클럭이 다르긴 한데.. 클럭이 달라진다고 해도 보레이트만 달라질 뿐 뭐라도 날아와야 하는데..


일단 TMS320F2806x에서 하드웨어 적으로 뭔가 달라진 것이 없는지 체크할 필요가 있다.
핀맵은 동일하고.. 내부 구조나 enable, 클럭등을 확인할 필요가 있다.

혹시 메모리 맵이나. 기타 설정에 문제가 있는것이 아닌지...
데이터시트를 좀더 자세히 들여다 봐야 할것 같다.

TMS320F28069 SCI 블록도




TMS320F28069 SCI UART 초기화코드

void U0_Init(unsigned char baud)
{
  InitSciaGpio();

  SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
                                   // No parity,8 char bits,
                                   // async mode, idle-line protocol
 SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
                                   // Disable RX ERR, SLEEP, TXWAKE
 SciaRegs.SCICTL2.all =0x0003;
 SciaRegs.SCICTL2.bit.TXINTENA =1;
 SciaRegs.SCICTL2.bit.RXBKINTENA =1;

 U0_SetBaud(baud);

 SciaRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset
}


코드적으로 한가지 의심스러운 것은  TX,RX인터럽트를 설정하고 있는데... 물론 기존 코드에서도 문제가 없긴하지만 인터럽트 백터가 이상하다면 문제가 될 수 있을것 같다. 이부분 삭제하고 테스트 해볼 필요가 있을것 같다.
 SciaRegs.SCICTL2.all =0x0003;
 SciaRegs.SCICTL2.bit.TXINTENA =1;
 SciaRegs.SCICTL2.bit.RXBKINTENA =1;
->테스트 결과 문제없다.  인터럽트는 사용하지 않으므로 문제가 없다.



무엇이 문제 일까? 항상 새로운 칩들은 문제가 발생하기 마련이다. 이런 문제를 풀어나가는 과정을 즐겨야 한다. 항상 해결하고나면 아무것도 아닌데...


USER Guide를 천천히 읽어보니 약간의  차이를 발견할 수 있다.

문제는 보레이트 설정에 있었던것 같다. 기존 TMS320F2808과는 보레이트 설정에 차이가 있다.


BRR = LSPCLK/8/Baudrate @LSPCLK 20Mhz


결정적으로 TI에서 제공하는 예제코드에 문제가 있다. 보레이트 설정 레지스터(SCIHBAUD, SCILBAUD)가 각각 8비트만 의미 있다.
    SciaRegs.SCIHBAUD    =0x0000;  // 9600 baud @LSPCLK = 20MHz (80 MHz SYSCLK).
    SciaRegs.SCILBAUD    =0x0103;

TI에서 제공하는것인데.. 좀이상하다. 컴파일러 환경이 달라서 그런가? CCS 4.x에서 테스트 해볼 필요가 있겠다.
->아무튼 아래와 같이 수정하니 잘 동작한다.
      SciaRegs.SCIHBAUD    =0x0001;
      SciaRegs.SCILBAUD    =0x0003;


PICCOLO TMS320F28069 UART테스트 예제 소스코드
나머지는 TMS320F2808 기존 코드를 그대로 사용해도 잘 동작한다. 프로그램을 좀 수정하여 printf 도 사용 가능하도록 수정하였다.
#include "system.h"
#include "serial.h"

void main(void)
{
 unsigned int cnt = 0;

 //DSP System Initialize
 SystemInit();

 DebugInit(BAUD_115200);
 DebugPrint("TMS320F28069 EVM Serial Test(%d)Mhz\r\n", _SYS_CLK);

 Led1Init();
 Led2Init();
 Led1On();

 while(1)
 {
  if(DebugIsByte())
  {
   switch(U0_GetByte())
   {
   case '0':
    Led1Off();
    DebugPrint("LED OFF\r\n");
    break;

   case '1':
    Led1On();

    DebugPrint("LED ON\r\n");   
    break;

   case '+':
    DebugPrint("Cnt Value=%d(0x%02X)\r\n", cnt++);   
    break;
   } 
  }
 }
}  
Posted by nexp

댓글을 달아 주세요

[DSP]/PICCOLO2011. 4. 29. 10:45

[TMS320F28069 EVM] PICCOLO 시리즈 개발환경 설정 - CCS v3.3

[TMS320F28069 EVM] PICCOLO 시리즈 개발환경 설정 - CCS v3.3


무료버전의 CCS v4.0를 사용하다가 무료 기간도 지나고 해서 다시 CCS v3.3으로 테스트 하려고 한다. 무엇보다도 CCS v4.x는 너무 속도도 느리고 환경설정이 깔끔하지 못해서 아주 불편한것 같다.
물론 새로운 PICCOLO시리즈 부터는 CCS 3.3 버전 예제를 제공하지 않지만 컴파일러 자체는 동일하므로 예전 코드가 그대로 호환되는것 같다. 기존 코드가 CCS 3.x로 많이 작성되어 있으므로 CCS v3.3으로 결정하고 PICCOLO시리즈에서 특별히 설정해 주어야 하는것만 다시 정리해 본다.

일단 디렉토리 구조는 프로젝트 파일 수정할 필요 없도록 예전과 동일한 구조로 만들고 내용만 제공코드로 변경하는것로 했다.



소스코드의 파일명은 F2806x_로 시작하는것으로 변경되었으로 다시 ADD해 준다.



옵션은 크게 변경된것이 없지만 정리차원에서..
..\..\DSP280x_headers\include;..\..\DSP280x_common\include;..\01_drv\;$(Proj_dir)



Code Entry Point는 변경된것 같다.



이제 환경 설정이 끝났다. 빠르고 깔끔하네.. 



간단히 TMS320F28069 LED제어 코드를 작성해 보자.
LED는 GPIO34, GPIO39에 연결되어 있다. 기존 TMS320F2808과 달리 GPIO가 확장되어 있다.



config.h 파일에 수정할 driver코드
//-----------------------------------------------------------------------------
//LED Driver
#define Led1Off()      GpioDataRegs.GPBSET.bit.GPIO34 = 1;NOP();
#define Led1On()      GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;NOP();
#define Led1Toggle()     GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1

#define Led1Init()       EALLOW;\
          GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;\
          GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;\
          EDIS; 
          

#define Led2Off()      GpioDataRegs.GPBSET.bit.GPIO39 = 1;NOP();
#define Led2On()      GpioDataRegs.GPBCLEAR.bit.GPIO39 = 1;NOP();
#define Led2Toggle()     GpioDataRegs.GPBTOGGLE.bit.GPIO39 = 1

#define Led2Init()       EALLOW;\
          GpioCtrlRegs.GPBMUX1.bit.GPIO39 = 0;\
          GpioCtrlRegs.GPBDIR.bit.GPIO39 = 1;\
          EDIS;  


TMS320F28069 LED테스트 예제 소스코드
#include "system.h"

void main(void)
{
 //DSP System Initialize
 SystemInit();

 //LED Initialize
 Led1Init();
 Led1On();

 Led2Init();
 Led2Off();

 while(1)
 {
  Led1Toggle();
  Led2Toggle();

  Delay(500);
 }
}  


코드 작성하고 컴파일 하니 잘 동작한다.

Posted by nexp

댓글을 달아 주세요

[DSP]/PICCOLO2011. 4. 6. 20:42

[DSP2806x EVM] Piccolo TMS320F28069 보드제작

[DSP2806x EVM] Piccolo TMS320F28069 보드제작


TI에서 새로운 Piccolo시리즈 TMS320F2806x 가 출시되었다. 80핀, 100핀의 두종류인데.. 80핀으로 하면  [SM-Type EVM]으로 만들수 있어 표준핀맵으로 제작해 보았다.

TMS320F28069 예제 소스코드
TMS320F28069_exam.zip


TMS320F28069 특징
80 MHz (12.5-ns Cycle Time)
16 x 16 and 32 x 32 MAC Operations
16 x 16 Dual MAC
Harvard Bus Architecture
Atomic Operations
Fast Interrupt Response and Processing
Unified Memory Programming Model
Code-Efficient (in C/C++ and Assembly)



TMS320F28069 회로도

dsp28069_sch.pdf



   





TMS320F28069 확장 테스트 보드





TMS320F28069  테스트 동영상


Posted by nexp

댓글을 달아 주세요

  1. 유희락

    관리자의 승인을 기다리고 있는 댓글입니다

    2011.09.29 21:08 [ ADDR : EDIT/ DEL : REPLY ]