'Hardware 관련/CPU'에 해당되는 글 2건

http://www.hayanmail.com/jsy/index.html?board=cizblog_zboard3&ln_mode=news_view&id=13&ct_sel=2


AT91SAM7S256

그래픽 처리등으로 많은 메모리와 좀더 빠른 처리시간이 요구 되면서 새로운 MCU가 필요했는데 ATmel에서 아주 유용한 놈이 나왔습니다. 보통 ARM은 CPU로 외부에 RAM과 ROM을 추가로 붙여야 하지만 이 녀석은 마이크로컨트롤러 식으로 RAM과 ROM이 내장된 방식이고 패키지도 LQFP 입니다. OS를 올릴 정도는 안되고 AVR로는 좀 부족한 중급 레벨의 시스템을 구성할 때 좋겠습니다.
드디어 32비트의 세계로 발을 들이게 되었는데 많이 낯설고 레지스터 한 개가 32 비트씩이니까 어지럽군요@.@
48메가로 돌리니까 AVR에 비해 붕붕~ 날아 다닙니다. 예전 486 급의 클럭 스피드니까요. 단순 수치상으로는 3배가 빠르지만 수 백번 반복 연산의 경우 전체 절약시간은 [수 백 x 단위 절약시간] 이 되어 3초 걸리는 일을 1초에 끝내는 것은 2초 절약으로 별 차이가 아니지만 3시간 걸리는 일을 1시간 만에 한다는 것은 2시간이 절약되어 체감상으로 큰 차이입니다.

특징

  • 내장 64KB 램, 256KB 플래시 롬
  • 12Mbps USB 내장
  • 3개의 UART 사용가능
  • 1개의 I/O 포트가 있어 32개의 입출력 핀 사용가능 (5V tolerance I/O)
  • 내장 PLL회로로 55MHz 까지 구동 (누군가는 105 MHz까지 오버클럭 해봤다는 군요^.^)
  • 내부 패리패럴 장치를 위한 13 채널의 DMA 컨트롤러
  • MHz당 0.9MIPS
  • SAM-BA 부트로더가 내부 마스크 롬에 내장
  • 64핀 LQFP 패키지

* 8비트 마이컴과의 차이점

  • 기동시 PLL 로 동작 주파수를 설정함
  • ARM의 전원관리 기능 때문에 사용하려는 내부 장치의 전원(클럭)을 먼저 살려줘야 함
  • set용 레지스터와 clear 용 레지스터가 분리돼 있음
  • 포트를 예전처럼 사용하려면 해당 핀을 direct drive 모드로 설정해야 함
  • int 형이 16비트에서 32비트로 바뀜
  • 구조체의 sizeof() 연산자 사용시 크기가 바뀔수 있음을 주의
    (gcc의 경우는 __attribute__ ((packed)), 일반적으로는 #pragma pack(1) ~ #pragma pack() 사용)

* 아트웍시 주의사항: TST, JTAGSEL, ERASE 핀은 사용하지 않을 시 GND에 연결하는 것이 좋음
외부 노이즈에 의한 HIGH 유입시 증상: TST 및 ERASE(부팅시 프로그램 지워짐), JTAGSEL(프로그램 정지)


WinARM GCC 컴파일러

AVR의 WinAVR 식으로 나온 것입니다.
홈페이지는
http://gandalf.arubi.uni-kl.de/avr_projects/arm_projects/index.html
역시 경로에 C:\WinARM\bin;C:\WinARM\utils\bin 을 추가해야 합니다.
WinAVR이 설치된 경우는 C:\WinARM\utils\bin 부분이 필요 없습니다.

SAM-BA 를 통한 ISP 지원

별도 롬에 내장된 부트로더로 USB 또는 RS232 포트(DBGU)로 인 시스템 프로그래밍(ISP)을 지원 합니다. PC측 프로그램은 Atmel 사이트에서 다운 받을 수 있습니다. SAM-BA는 플래시 롬에 있을 때 실행되며 사용자 프로그램을 라이팅하게 되면 플래시를 덮어쓰게 되므로 이 부트로더는 지워지게 됩니다. 지워졌을 경우는 System Recovery 과정을 통해 내장된 별도 롬에서 플래시 롬으로 다시 복사할 수 있습니다. 최초에는 플래시 롬이 비여있는 상태이므로 SAM-BA를 복사해야 합니다.
실제 사용에는 불편하여 별도 부트로더를 작성해 사용하게 됩니다. SAM-BA는 단지 부트로더를 처음 write할 때 사용합니다.

WinARM용 부트로더(bootloader)

SAM-BA의 불편함과 불합리한 점 때문에 다른 프로그램을 참고로 WinARM용 부트로더를 만들어 봤습니다.
사용자 프로그램에 통합된 형태이고 시리얼 포트를 이용합니다. 다른 컴파일러에서도 조금 수정하면 사용가능할 것입니다.
자세한 사항은 readme.txt 파일을 참고하세요.
sam7flash.zip ver 1.0.4 (134KB)

ARM은 RAM 에서 코드 실행이 가능합니다. makefile에서 RUN_MODE를 RAM_RUN으로 설정하면 RAM에서 실행되도록 컴파일 할 수 있습니다.
sam7flash 부트로더에서 사용 가능한 RAM 실행 데모 입니다.
ramdemo.zip (53KB)

위 부트로더를 롬 이미지로 만든 버전입니다. 평소에는 RAM을 소비하지 않습니다.
u_boot.zip (130KB)

JTAG 장비

단순 인터페이스 인데 가격이 좀 비싸군요. USB 패킷을 잡아보면 호환 제품을 자작하는 것도 가능할 것입니다.

WIGGLER는 패러랠 포트를 사용하는 초저가 형입니다.
DTC114 블럭은 디지털 TR로 단순 인버터 기능이므로 74HC14로 구성해도 됩니다.

Simple JTAG interface circuit.
==============================

25 pin Male parallel                                              20 pin JTAG header

    17-25 <--------------+-------------------------+--+-----------<  4,6,8,
              GND        |                         |  |              10,12,14,
                         |    AC244          200nF =  = 4.7uF        16,18,20 (GND)
                         | +------------+  Vcc     |  |
         TDI          0v +-| 1       20 |-+--------+--+-----------<  1,2 (VCC)
    5  >-------------------| 2       19 |-+
         TMS               | 3       18 |-----XXXX---------------->  5 (TDI)
    3  >-------------------| 4       17 |     51R     
         TCLK              | 5       16 |-----XXXX---------------->  7 (TMS)
    4  >-------------------| 6       15 |     51R
                           | 7       14 |-----XXXX---------------->  9 (TCK)
                      +----| 8       13 |     51R
                      |    | 9       12 |-----XXXX---+
                      |  +-| 10      11 |     51R    |
                      |  | +------------+            |
                      |  V 0v                        |
                      +------------------------------------------<   13 (TDO)
         TDO                                         |
    11 <---------------------------------------------+


                            DTC114   /-------xxxx----------------<   15 (nRST)
         RST            10k       | /        51R
    2  >----------------XXXX--+---|<
                              |   | \
                              X      V
                         47k  X      |  
                              X      |
                              |      |
                              V 0v   V

usbjtag USB포트를 사용하는 자작 JTAG 에뮬레이터
J-Link 수 백만원 대의 Multi-ICE 보다 저렴한 JTAG 에뮬레이터
AT91SAM-ICE J-Link의 ATmel 버전 (22만원) : 타 ARM CPU에 사용하려면 별도 라이센스를 구매해야 함

AT91SAM7X256

SAM7S 시리즈가 핀수가 적어 더 많은 제어핀이 필요한 경우 SAM7X 시리즈를 사용할 수 있습니다.
- 포트B 가 추가되어 31핀을 더 사용할 수 있음
- SPI 1채널 추가. Ethernet MAC 추가
- SAM-BA 를 호출하는 방식이 편리하게 바뀜.
즉, ERASE핀에 220ms 이상 high 신호를 입력해 주면 플래시가 지워지고 NVM 플래그가 초기화되어 내장 부트롬(SAM-BA)으로 부팅하도록 됨. SAM-BA로 라이팅후 다시 NVM 플래그를 설정해야 플래시로 부팅가능하여 사용자 프로그램이 실행되게 됨.
초기 출하상태는 내장 부트롬(SMA-BA)으로 부팅 가능한 상태임.
- USB 엔드포인트 2개 추가로 총 6개의 엔드포인트 지원.

AT91SAM7SE256

EBI 인터페이스가 있어서 DRAM 등을 추가로 장착할 수 있는 버전입니다.

openocd 사용법 (JTAG을 이용한 디버깅 방법)

1. openocd 설치

일단, JTAGSEL 핀은 사용하지 않습니다. 오픈 상태로 두거나 GND로 처리해야 합니다.
디버그에 필요한 파일은 WinARM 패키지에 모두 들어있습니다.
OpenOCD 홈페이지(http://openocd.berlios.de/web)에서는 현재 최신버전을 Yagarto(http://www.yagarto.de/)에서 제공한다고 돼있습니다.
최신 버전을 설치하고 사용하는 JTAG 장비의 PC인터페이스에 맞는 config 파일을 준비해야 합니다.
패러랠 포트나 FT2232를 사용한 USB포트를 지원하고 있습니다.
사용자 환경에 맞춰 OpenOCD를 실행합니다.

예) openocd-ftd2xx.exe -f arm7_ft2232.cfg (USB 포트의 경우)
openocd-pp.exe -f arm7_wig.cfg (Wiggler의 경우)

실행이 되어 JTAG 장비와 연결에 성공하면 아래와 같은 메시지가 출력됩니다.

Info: openocd.c:84 main(): Open On-Chip Debugger (2007-01-31 12:00 CET)
Warning: arm7_9_common.c:683 arm7_9_assert_reset(): srst resets test logic, too

여기까지만 성공하면 절반은 성공입니다.

2. openocd 사용법 I - 텔넷을 통한 연결

openocd 자체로는 아무것도 할 수 없습니다. 단지 드라이버를 통해 JTAG장비와 연결해주고 클라이언트 S/W와의 통신을 지원하는 디버그 서버의 역할만 합니다.

openocd는 telnet과 gdb 연결을 지원합니다. telnet은 4444 포트를, gdb는 3333 포트를 사용합니다.
이제 도스창에서 telnet을 실행해서 JTAG이 제대로 동작하는지 확인해 봅니다.

telnet localhost 4444

연결되면 아래와 같은 메시지가 출력됩니다.
Open On-Chip Debugger
]

플래시 메모리 정보를 보기 위해 다음 명령을 입력합니다.
] flash info 0

그러면 아래와 같은 메시지가 출력됩니다.

#1: at91sam7 at 0x00100000, size 0x00020000, buswidth 4, chipwidth 0

at91sam7 information: Chip is AT91SAM7X128
cidr: 0x275a0740, arch: 0x0075, eproc: ARM7TDMI, version:0x000, flashsize: 0x00020000
master clock(estimated): 52369kHz
pagesize: 256, lockbits: 8 0x0000, pages in lock region: 64
securitybit: 0, nvmbits: 0x4
]

플래시에 프로그램을 라이팅하기위해 아래의 명령을 사용해 lockbits을 해제합니다.
초기 상태는 lockbits이 해제된 상태입니다.

flash protect 0 0 15 off -- AT91SAM7S256의 경우 lockbits 해제
flash protect 0 0 7 off -- AT91SAM7X128의 경우 lockbits 해제

플래시에 프로그램을 기록하려면 아래의 명령을 사용합니다.

flash write 0 main.bin 0
여기서 main.bin 은 openocd가 실행된 폴더에 있어야만 가능합니다.

또는 경로를 지정하여 다음과 같이 입력합니다.

flash write 0 c:\test\main.bin 0

기타 명령으로는,
reg: 레지스터 정보를 출력합니다.
exit: 텔넷을 종료 합니다.
shutdown: openocd를 종료합니다.
help: 도움말을 출력합니다.

3. openocd 사용법 II - Insight를 통한 디버깅

먼저 플래시메모리에 디버깅할 프로그램을 굽고 시작합니다.

(1) WinARM/utils/insight/bin (또는 WinARM/bin) 폴더에서 arm-elf-insight.exe 를 실행합니다.
(2) File -- Open... 에서 디버깅하려는 elf 파일을 선택합니다.
(3) File -- Target settings..에서
Target은 Remote/TCP로, Hostname은 localhist로, 포트는 3333으로 설정합니다.
브레이크 포인트는 Set breakpoint at 'main' 만 선택합니다.
Run Method는 Continue from Last Stop을 선택합니다.
More options에서 Command to issue after attaching:에서 아래 내용을 입력하고 OK버튼을 누릅니다.
monitor arm7_9 force_hw_bkpts enable
(4) Run -- Connect Target을 실행합니다.
(5) Run -- Download를 실행합니다.
(6) Run -- Run 을 실행합니다.

그러면 main()에서 브레이크가 걸리게 됩니다.
원하는 라인의 왼쪽을 클릭하면 브레이크포인트가 설정됩니다.

여기서 주의사항은 소프트웨어브레이크 포인트는 2개만 지원합니다.
그 이상을 설정하고 진행하려 하면 openocd창에 아래와 같은 메시지가 출력됩니다.
Info: breakpoints.c:65 breakpoint_add(): can't add software breakpoint, resource not available
그러면 브레이크 포인트를 해제해야 진행이 가능합니다.
(Only two software breakpoints are supported. So, you have to remove some breakpoints to continue.)

링크

AT91SAM7S C-Startup Sequence
Procyon ARMlib
AT91 ARM Forum
WinARM User Forum
Philips ARM Design Contest 2005
FreeRTOS
TNKernel
OpenOCD Quick Reference

 

* 참고

Philips 의 LPC2101은 이와 유사한 마이크로콘트롤러이며 70MHz에 가격은 3,500원 대입니다.

신고
블로그 이미지

꽃중년

불만있으면 떠나라...


신고
블로그 이미지

꽃중년

불만있으면 떠나라...

Tag 68K

티스토리 툴바