2012/04/08

XMEGA256A3BU+ USB/CDC Standard I/O

AVRStudio5는 적응하기가 힘드네...ASF라는거도 그렇고...
전체적으로 쓰기 쉬운 방향으로 가는건 좋긴한데 적응기간이 필요한거같다.

일단 AVRStudio6를 깔고 버전을 확인해보자.
1. AVRStudio 6 version 6.0.1703 - beta
2. ASF 3.0.1
3. AVRGCC 3.3.2.31

XMEGA256A3BU 모듈보드도 만들어놨으니 이제 디버깅 코드를 만들어서 돌려보자.
CDC를 사용해서 호스트랑 시리얼 통신을 하고 디버깅 메뉴를 추가하면 끝~~

프로젝트 생성부터 시작해보자.

여기로 가서


XMEGA256A3BU니까 이 템플릿을 선택하자. 프로젝트 명은 test로~~


여기서 정확한 MCU 파트명을 정해주면 된다.


프로젝트 만들었고 여기서 ASF Wizard를 실행해보자

여기서 USB/CDC Standard I/O (stdio)(component)를 선택해서 추가하면 된다.
여기까지 하면 USB/CDC를 standard IO로 연결해주는 소스가 프로젝트에 추가된다.

그럼 여기서 끝???

일리가 없지...


일단 클럭설정부터 해보자구. conf_clock.h로 가보자.

기본설정은 2MHz 내부 클럭으로 설정되었는데 USB 구동을 위한 설정은 아래쪽에 이미 설정되어 있다. 

#define CONFIG_USBCLK_SOURCE     USBCLK_SRC_RCOSC
//#define CONFIG_OSC_RC32_CAL      48000000UL
//#define CONFIG_OSC_AUTOCAL          OSC_ID_RC32MHZ
//#define CONFIG_OSC_AUTOCAL_REF_OSC  OSC_ID_USBSOF
//#define CONFIG_SYSCLK_SOURCE     SYSCLK_SRC_RC32MHZ
//#define CONFIG_SYSCLK_PSADIV     SYSCLK_PSADIV_2
//#define CONFIG_SYSCLK_PSBCDIV    SYSCLK_PSBCDIV_1_1
이렇게~~

앞에 주석을 제거하자.

#define CONFIG_SYSCLK_SOURCE          SYSCLK_SRC_RC2MHZ
#define CONFIG_SYSCLK_PSADIV          SYSCLK_PSADIV_1
#define CONFIG_SYSCLK_PSBCDIV         SYSCLK_PSBCDIV_1_1


여기는 주석을 추가해주도록 하자.


다음은 USB 설정...conf_usb.h로 가자.

#define  USB_DEVICE_VENDOR_ID             0x0000
#define  USB_DEVICE_PRODUCT_ID            0x0000

이 설정을

#define  USB_DEVICE_VENDOR_ID             0x03EB
#define  USB_DEVICE_PRODUCT_ID            0x2404

이렇게 바꿔줘야한다.

그리고 아래 콜백 함수들을 
#define  UDI_CDC_ENABLE_EXT()             true
#define  UDI_CDC_DISABLE_EXT()

stdio_usb.c의 stdio_usb_enable()과 stdio_usb_disable() 함수와 연결해준다.
#define  UDI_CDC_ENABLE_EXT() stdio_usb_enable()
#define  UDI_CDC_DISABLE_EXT() stdio_usb_disable()

그리고 그 아래쪽에 설정을 잘 봐둬라.
#define  UDI_CDC_DEFAULT_RATE             115200
#define  UDI_CDC_DEFAULT_STOPBITS         CDC_STOP_BITS_1
#define  UDI_CDC_DEFAULT_PARITY           CDC_PAR_NONE
#define  UDI_CDC_DEFAULT_DATABITS         8

보레잇 115200, Stop bit 1. parity 없음, 데이터비트 8~~


그리고 main() 함수에 셋업 함수를 추가해보자.

int main (void)
{
irq_initialize_vectors();
cpu_irq_enable();
sleepmgr_init();
sysclk_init();
board_init();
stdio_usb_init(&USB);
while(1)
printf("hello\r\n");

// Insert application code here, after the board has been initialized.
}

자 여기까지 하고 컴파일을 함 돌리보자.

아 에러가 뜨네...

stdio_usb 의 함수를 인식못하는거 같응께 conf_usb.h에 stdio_usb.h를 인클루드 시켜주자.
conf_usb.h의 아래부분
/**
 * USB Device Driver Configuration
 * @{
 */
//@}

//! The includes of classes and other headers must be done at the end of this file to avoid compile error
#include "udi_cdc_conf.h"
#include <stdio_usb.h>
#endif // _CONF_USB_H_

여기에다 인클루드시켜주자.

그런다음 컴파일 오케이~~

플립으로 다운로드 하고 리붓~~


이렇게 COM34로 잡힌다. 
드라이버는 atmel_device_cdc.inf다. 프로젝트 폴더내에 생성되어 있으니 걱정마시라.

이제 COM34, 115200/8/none/1/none 으로 접속하면


아차 무한루프로 계속 출력시켰지...


디버그 코드 만든다고 이것저것 테스트 중인데 
printf는 잘 동작하는데
scanf는 이상하게 동작한다.

걍 scanf 말고 udi_cdc_getc 를 대신 썼다.


이것저것 뚝딱뚝딱해서 디버그 코드 완성했다.

소스는 여기



흠...

간단하다고 할수도 없고 복잡하다고 하기도 좀 그렇다. 애매한데...
ASF는 문서화가 관건이겠네. 어플노트를 정확하게만 만들어주면 실무 개발자들은 상당히 편할거같다.








댓글 없음:

댓글 쓰기