DMA
CPU의 관여 없이 하드웨어적으로 메모리간 또는 메모리와 페리페럴간 데이터를 이동시킬 수 있는 컨트롤러이다.
DMA의 특징
- DMA 모듈이 데이터 이동을 시작하기 위해서는 페리퍼럴 또는 소프트웨어 트리거가 필요하다.
- 6개의 독립적인 DMA 채널이 있고, 각각의 채널은 PIE interrupt를 가지고 CPU에게 데이터 전송 시작시점 또는 완료시점을 알릴 수 있다.
- DMA 채널1은 다른 채널보다 우선순위를 가질 수 있게 설정할 수 있다.
DMA Block Diagram
DMA 가 접근가능한 페리페럴과 메모리 영역에 대해 나와있다. 특히 메모리쪽을 보면 RAMGS는 접근가능하지만 RAMM 이나 RAMLS는 접근을 못한다.
DMA를 사용하기 위해 필요한 설정
1. 데이터를 옮길 주소에 대한 설정 : SRC/DST_ADDR
당연히 어느 주소에서 어느 주소로 옮길지에 대한 설정이 필요하다.
이 주소값은 SRC/DST_ADDR_SHADOW 레지스터에 쓰여지는데 맨 처음 transfer를 시작할 때 이 값이 그대로 SRC/DST_ADDR_ACTIVE 로 복사되고 그 다음부터는 BURST STEP, TRANSFER STEP 설정에 따라 증가한다.
2. 데이터를 옮길 단위에 대한 설정 : WORD, BURST, TRANSFER
설명을 위해 필요한 용어는 Word, Burst, Transfer이다. Word는 데이터 이동의 최소 단위로 16bits 또는 32bit로 설정가능한데 C28x코어에선 16bits설정이 일반적인것 같다. 그리고 Busrt는 여러 Word로 구성되고 Transfer는 여러 Burst로 구성된다.
DMA 의 작동방식은 그림과 같이 중첩 루프로 되어있고, 안쪽 루프가 Burst 바깥쪽 루프가 Transfer이다. 처음 Transfer가 시작되면 TRANSFER_SIZE 만큼 Burst가 일어나야 Transfer가 종료되는데 이 Burst는 그냥 일어나는게 아니라 페리페럴 또는 소프웨어 트리거가 발생했을 때 한번의 Burst(ONE Shot Mode disabled 시)가 일어나는 것이다. 그리고 한번 Burst가 일어나면 BURST_SIZE만큼 word를 옮긴다.
BURST_SIZE+1 : 한번의 트리거로 인해 옮겨지는 Words의 양
TRANSFER_SIZE+1 : 최종적으로 옮겨질 Burst의 양
❗ 참고로 뒤에 SIZE가 붙은것들은 다 +1해서 생각하면 된다. 예를들어 BURST_SIZE가 0으로 설정되어 있으면 트리거가 들어왔을 때 1 word를 옮기는 것이다.
❗ Transfer Size Times만큼 Burst를 반복 후 Transfer 가 끝난 상태에는 아무리 트리거가 들어와도 DMA는 아무 반응을 하지 않는다.(Continuouse Mode disabled 시)
3. 데이터를 어떻게 옮길지에 대한 설정 : SRC/DST_BURST_STEP, SRC/DST_TRANSFER_STEP
STEP은 포인터의 이동으로 보면 된다.
- SRC/DST_BURST_STEP : 매 Burst 내에서 source/destination 주소값을 몇씩 증가/감소시킬지에 대한 설정. 일반적으로 연속된 데이터를 옮긴다고 할 때 1값을 가질테지만, 음수값을 가질 수 도있고 페리페럴과 메모리간 데이터를 이동할 때는 페리페럴 베이스 주소값이 옮겨가지 않도록 이 값을 0으로 설정할 수 도 있다.
- SRC/DST_TRANSFER_STEP : 직전 Burst가 끝나고 다음 Burst가 시작하기 전에 source/destination 주소값을 몇씩 증가/감소시킬지에 대한 설정. 0 또는 양수/음수값을 설정할 수 있다. 이 설정은 레지스터나 메모리에서 Reserved 영역이 있을 때 피해하기 위해 사용할 수도 있다.
4. WRAP 설정
되감기 설정으로 SRC/DST_WRAP_SIZE+1 만큼의 Burst가 일어나고 나면 처음 주소로 돌아가겠다는 뜻이다. 단, 처음 시작주소에서 또 SRC/DST_WRAP_STEP 만큼 이동하여 시작한다. Circular Buffer 등에서 사용될 수 있다.
SRC/DST_WRAP_STEP이 0으로 설정되어 있다면 Wrap이 일어났을 때 처음 시작주소가 바로 SRC/DST_ADDR_ACTIVE가 되고 다음 트리거가 들어오면 거기서 Burst가 일어난다.
✔ 만약, SRC/DST_WRAP_SIZE 가 TRANSFER _SIZE 값보다 크게 설정되어 있다면 WRAP 기능이 disabled 된거나 마찬가지다.
✔ SRC 와 DST 각각 독립적으로 Wrap 설정을 할 수 있다.
다음은 Wrap 설정을 하지 않았을 때의 예시이다.
3번의 Burst로 총 6 Word 를 이동하고 종료하게 된다.
다음은 위와 같은 설정에서 Wrap설정만 추가되었을 때의 예시이다.
결국 이동된 결과는 똑같지만 과정은 다르다.
Source 쪽의 과정을 보면 SRC_WRAP_SIZE+1 인 두 번의 burst 후에 다시 처음 시작주소로 돌아가고 SRC_WRAP_STEP 인 6만큼 증가하여 다음 세번째 트리거가 오면 Src_Addr+6 에서 Burst를 시작하게된다.
주요 DMA 설정
1. OneShot Mode
DMA MODE 레지스터의 OneShot Mode 비트가 1로 설정되어 있으면 트리거 한번에 TRANSFER_SIZE+1 만큼의 모든 버스트가 다 나간다.
OneShot Mode 비트가 0으로 설정되어 있을 때는 매 Burst 마다 트리거가 필요하다.
2. Continuous Mode
Continous Mode 비트가 0으로 설정되어 있으면 한 Transfer의 모든 Burst가 완료되어 Transfer가 완료된 이후에는 다음 트리거로 Burst가 일어나게 하기 위해서는 CONTROL Resgiter의 RUN 비트를 set하여 채널이 re-enabled 되어야한다.
반면, Continous Mode 비트가 1로 설정되어 있다면 한 Transfer가 완료된 이후에도 채널은 계속 Active한 상태로 남아있기 때문에 Trigger가 들어오면 Burst가 나간다.
3. Channel Interrupt Mode
Transfer 시작시 또는 완료시 DMA interrupt가 걸리도록 설정할 수 있다.
다음은 2838x의 Workshop 자료이긴한데 DMA 레지스터에 관한 설명이다.
참고 : https://www.youtube.com/watch?v=V86d0qX0810
'임베디드 개발 > TMS320F2838x (C28x)' 카테고리의 다른 글
TMS320F28388D ] CPU2에서 SD카드 사용 + 속도 테스트 (0) | 2022.12.28 |
---|---|
TMS320F28388D ] DMA 예제 (0) | 2022.12.11 |
TMS320F28388D ] CPU2에서 SCI, SPI 사용하기 위한 설정방법 (2) | 2022.12.06 |
TMS320F28388D ] 타이머, Timer Interrupt 사용하기 (0) | 2022.12.05 |
TMS320F28388D ] Watchdog Timer 사용하기 (1) | 2022.12.03 |