[MCU]2016. 7. 11. 12:25

Intel Quark D2000 32-Bit MCU

최근 들어 IoT열풍에 인텔도 뒤쳐지지 않으려고 많은 노력을 하는것 같다. 

인텔 갈릴레오, 에디슨, 아두이노 호환 Arduino 101(Genuino 101) 등이 출시 되었다. 


ARM사의 Cortex-M3급으로 D2000을 출시 했는데 저전력에 저렴한 임베디드 MCU로 ARM을 대항해서 어느정도 시장을 점유 할지 기대가 된다.



D2000 스펙은 아래와 같다.



Intel Quark™ Microcontroller D-Series Core

32MHz clock, 32-bit address bus

Intel Pentium® Processor-based x86 ISA compatible CPU, no FPU

Integrated local APIC and I/O APIC

32kB of on-die NVM +8kB OTP on-die NVM

8kB of on-die SRAM




국내 쇼핑몰에서는 소량구매시 5천원대에 판매하고 있으므로 쉽게 구해서 테스트 해 볼 수 있다.

FND2000 SR2KF (http://eleparts.co.kr/EPXGR7C4)



기존의 인텔 제품들은 시장에서 구하기가 쉽지 않았는데 이번에는 공격적으로 여러 소싱업체에 뿌리고 있는듯 해 보인다.

ARM Cortex코어가 성공한것이 누구사 쉽게 사용할 수 있도록 한결과가 아닐까... (Cortex-M3코어 제품들은 시중에서 1$이하로 쉽게 구매 해서 테스트 가능하다.)



그리고 D2000 개발보드를 15$에 판매하고 있다. 아두이노와 호환되는 핀맵을 가지는데 코드는 호환이 되지 않는다고 한다.

약간 아쉬운 부분이다.

6축 멤스센서 포함하고 15$ 이면 훌륭한것 같다.




개인적으로 보기에 스펙상으로는 ARM코어에 대적하기에는 약간은 무리가 있어 보이기는 하는데...

X86코어에 인텔의 브랜드를 통해 홈런 한방 칠수 있을지 좀더 지켜볼 만 한것 같다.

Posted by nexp

댓글을 달아 주세요

[MCU]/adStar2015. 1. 22. 23:11

adStart - 소프트웨어 리셋 테스트

adStart - 소프트웨어 리셋


소프트웨어 리셋방법에 여러가지가 있겠지만 간단하게 아래와 같이 구현 했다. 동작은 잘 한다.

void (*ResettFunc)();


int main()

{

ResetFunc = main;



  if(GetKey())

 {

ResetFunc();

 } 


:


}


Posted by nexp

댓글을 달아 주세요

[MCU]/adStar2013. 8. 18. 02:59

adStar Internet Radio 테스트 (Web Radio)

adStar Internet Radio 테스트 (Web Radio)




adStar의 가장큰 장점은 칩내부에 16MB의 SDRAM이 내장되어 있어 대량 메모리가 필요한 곳에 아주 유용하다. 

특히 인터넷 라디오와 같이 스트림 데이터는 네트웍 상황에 따라 전송율이 변화기 때문에 메모리를 이용해 버퍼링이 필요하다. 

adStar의 SDRAM을 이용하여 버퍼링 하는 예제로 인터넷 라디오를 제작 해 보았다.


보드는 기존 이더넷(W5100), MP3(VS1053), MCU(adStar)모듈들을 재활용 할 수 있는 확장 테스트 보드를 이용했다. 이더넷은 W5100을 이용하여 고속의 이더넷 전송이 가능하도록 했다. 물론 STM32와 같은 Cortex-M3를 사용해도 되지만 버퍼링을 확실히 할수 있는 메모리를 갖추고 저렴하면서 소형인 adStar를 이용하기로 했다. 테스트 결과 최장 15분정도의 버퍼링도 가능했다.




인터넷 라디오는 ICY프로토콜을 이용한다. Shoutcast Server 에 접속하여 HTTP프로토콜을 이용해 Request를 보내면 그에 따른 응답이 오고 이후 MP3데이터를 수신할 수 있다. 예를 들어 URL (sc03.saycast.com)에 접쇽하려면 우선 DNS에 접속하여 IP와 포트번호를  알아낸다. IP 를 알아 냈다면 TCP로 접속한 후 GET 명령을 보내면 서버에서 이에 따른 응답이 온다.



Request 메시지

아래와 같이 GET메지지를 전송하면 응답 메시지가 날아온다. 사실 "GET / HTTP/1.0"  "Host : ip" 만 보내면 된다.

GET sc03.saycast.com HTTP/1.0
User-Agent: GOMA mpg123/1.15.1
Host: 211.43.215.141
Accept:audio/mpeg, audio/x-mpeg, audio/mp3, audio/x-mp3, audio/mpeg3, audio/x-mpeg3, audio/mpg, audio/x-mpg, audio/x-mpegaudio, application/octet-stream, audio/mpegurl, audio/mpeg-url, audio/x-mpegurl, audio/x-scpls, audio/scpls, application/pls, application/x-scpls, */*
Icy-MetaData: 1

Connection: close




응답 메시지

"ICY 200  OK"가 전송되면 정상적으로 접속이 된것이고 이후에 MP3데이터가 출력된다. 물론 곡 정보나 전송률등의 메타데이터도 함께 전송된다.

ICY 200 OK
content-type:audio/mpeg
icy-br:128
icy-genre:뮤직카페
icy-metaint:16384
icy-name:《 М 4 Ц 》 ‥ ───‥ http://m4ucast.co.kr ⌒∇⌒γ
icy-notice1:<BR>This stream requires <a href="http://www.saycast.com/">SayRadio</a><BR>
icy-notice2:SayCast Distributed Network Audio Server/Linux v2.0.0<BR>
icy-pub:1

icy-url:http://saycast.sayclub.com/saycast/gateway/winamp?domainid=m4u




MP3데이터를 받으면 VS1053의 데이터 버퍼에 쓰면 되는데 인터넷 속도에 따라 버퍼링이 필요하기 때문에 adStar의 SDAM을 이용해 저장하고 적절한 버퍼링이 되면 출력 하도록 했다.


SDRAM에 메모리 할당

#define RINGBUFFER_SIZE (4096*1024)


//SDRAM에 버퍼 메모리 할당

m_RxBuffer.buffer = malloc(RINGBUFFER_SIZE);




수신된 internet radio MP3 데이터 처리

//수신되 데이터 링버퍼에 저장

void Copy_to_StreamBuffer(u16 len, u8 *tmp_buffer)

{

u16 i;


for ( i = 0; i < len; i++)

{

SetRingBuffer(&m_RxBuffer, tmp_buffer[i]);

}

}


//저장된 MP3 데이터 출력 함수

void Push_to_VS1053(void)

{

u32 remain_bytes;

remain_bytes = GetDataSize(&m_RxBuffer);


if(remain_bytes == 0)

{

Enable_Play = 0;

}

        else if (remain_bytes > BUFFERING_SIZE)

                // buffering

Enable_Play = 1;

}

        //데이터 출력

if (Enable_Play == 1)

{

if(IsVs1053DataReady())

{

VS_WriteData(GetRingBuffer(&m_RxBuffer));

}

}

:

}






테스트 동영상

간단한 인터넷 라디오를 제작하기 위해 우선 몇개의 인터넷 라디오 사이트를 저장해 두고 스위치를 누름에 따라 각각의 서버에 접속해 라디오를 출력하는 예제를 작성해 보았다.







 

인터넷 라디오 TCP 처리 함수

인터넷 라디오의 이더넷 처리 부분은 아래와 같이 구현이 가능하다.

void ProcessiRadio(unsigned int sock, unsigned int port)

{

int len;

u8 tmp_buffer[MAX_BUF_SIZE];

switch (getSn_SR(sock))

{

case SOCK_ESTABLISHED:

//데이터 수신 검사

if (state == -1)

{

//Request 전송

SendProbe();

state = 0;

}

else if (state == 0)

{

//HTTP Request 전송

SendRequest();

DebugPrint("\r\nSend HTTP request\r\n");


state = 1;

}

else if (state == 1)

{

//응답 메시지 분석

if (ParseReply(sock) > 0) 

{

state = 2;

}

}

else if (state == 2)

{

//MP3 데이터 버퍼링

if ((len = getSn_RX_RSR(sock)) > 0) 

{

len = recv(sock, tmp_buffer, len);

Copy_to_StreamBuffer(len, tmp_buffer);

gTotalWriteCount += len;

}

}

break;

case SOCK_CLOSE_WAIT:                          

//If the client request to close

disconnect(sock);

m_SokStatus1 = 0;

break;

case SOCK_CLOSED:

if(!m_SokStatus1)m_SokStatus1 = 1;


if (getSn_RX_RSR(sock) > 0)

{

       DebugPrint("\r\nParse_Reply2"); 

 Parse_Reply(SOCK_CLIENT);

      }

    

     close(SOCK_CLIENT);


//URL일 경우 DNS 접속

if (Need_DNS(Server_URL, strlen(Server_URL)) == 1) 

{

if (dns_query(Server_URL) != -1)

{

DebugPrint("\r\nDNS ok");


//얻어온 IP 및 포트로 접속

init_socket(sock, Config_Msg.Sip, Config_Msg.Sport);

}else 

{

DebugPrint("\r\nDNS Fail");

}

}

else

{

//IP일 경우 

init_socket(sock, Config_Msg.Sip, Config_Msg.Sport);

}

break;


    default:

        break;

}

}


 

 

결론

기존에도 인너넷 라디오를 제작해 보았지만 네트웍 상황에 따라 끊기는 현상이 발생하는데 메모리 가격 때문에 상용 제품 형태로 제작하기에는 문제가 많았다. 저렴한 가격에 메모리가 포함된 adStar를 이용하면 이러한 문제점들을 해결할 수 있을것 같다. 좀더 다듬으면 훌륭한 인터넷 라디오를 제작할 수 있을것 같다.

Posted by nexp

댓글을 달아 주세요

  1. 비밀댓글입니다

    2013.08.24 03:51 [ ADDR : EDIT/ DEL : REPLY ]

[MCU]/adStar2013. 6. 29. 15:44

adStar Timer Counter 테스트

adStar Timer Counter 테스트

adStar는 4개의 16비트 타이머, 카운터, Capture, PWM 기능이 있는 Timer가 있다.

Timer Counter WAV OUT 기능이 있어 오디오 출력에 장점이 있다. Timer한가지 아쉬운점은 16비트 타이머 카운터이다.

 

adStar Timer Counter 블록도

 

 

  

 

adStar 타이머 테스트

타이머의 클럭소스는 입력 System Clock 이다. EVM에서는 12Mhz를 사용하고 있다.

 

 

 

 

adStar Timer 테스트 예제코드

#include "system.h"
#include "serial.h"


volatile unsigned int gTimerTick1_1ms = 0;


//----------------------------------------------------------------------------
//Timer Interrupt Handler
void Timer0ISR(void)
{

 gTimerTick1_1ms++;

}
//----------------------------------------------------------------------------


int main()
{
 int flag = 0;
 
 SystemInit();

 Led1Init();
 Led1On();

 U0_Init(BAUD_115200);
 DebugPrint("adStar EVM - Timer Test\r\n");



 //Timer  초기화

 set_interrupt(INTNUM_TIMER0,Timer0ISR);
 set_timer(0,1);


 while(1)
 {
  if( gTimerTick1_1ms>1000)
  {
   gTimerTick1_1ms = 0;
    
   flag ^= 1;
   if(flag)Led1On();
   else Led1Off();
  }
 }
 
 return 0;
}


Posted by nexp

댓글을 달아 주세요

[MCU]/adStar2013. 4. 27. 23:30

adStar - W5100 TCP/IP 전송 속도 테스트 (외부 메모리 제어 모드 사용)

adStar - W5100 TCP/IP 전송 속도 테스트 (외부 메모리 제어 모드 사용)

 

 

 

adStar 도 CANTUS 와 같이 외부 메모리 제어 모드가 있다.  외부 메모리를 연결할 수 있고,  특히 W5100과 같이 고속 이더넷이 필요할 때 사용하면 편리하다. [adStar TFT-EX] 보드에는 메모리 방식의 W5100을 연결할 수 있는 커넥터가 있기 때문에 이를 테스트 해 보았다.

 

메모리 제어 기능은 PORT3, PORT4에서 설정할 수 있다.

 

 

 

adStar의 CS0 할당 번지는 0x5000 0000 이다.

기존 CANTUS 와 약간의 차이가 있는것은 메모리 번지와 제어 레지스터 번지이다. 나름의 이유가 있었겠지만 기존 코드와 호환성을 유지하기 위해 동일하게 했으면 하는 생각이 든다.

 

 

 

 

asStar W5100 초기화 코드

 

void W5100_IO_INIT()
{
 *(volatile U16*)0x80000800 = BIT10; //BANK 0 8Bit

 *R_PAF3 = 0; //SRAM interface address, data
 Cbi(*R_PAF4, GP_CFG(1) | GP_CFG(3)| GP_CFG(4)| GP_CFG(5));// nCS, nWE, nRE, ALE  

 

 

 

asStar W5100 메모리 제어 방식(INDIRECT)을 이용한 TCP/IP 전송 속도 테스트

회로적으로 간단하게 테스트 하기위해 INDIRECT방식을 이용했는데도 6Mbps 이상 나오고 있는데 DIRECT모드를 이용하면 더 빠를 수 있을것 같다. 

 

 

 

Posted by nexp

댓글을 달아 주세요