티스토리 뷰

STM32/DMA

STM32CubeMX DMA란?

고졸 공돌이 2018. 5. 8. 19:52

이번 포스팅은 DMA가 무엇인지 그리고 STM MCU에서는 DMA가 어떻게 사용 및 동작하는지에 대해 올려보겠습니다.(이번 포스팅에 사용하는 자료들은 STM Tech Training 중급 코스에서 사용하였던 문서를 참고하였습니다.)



DMA의 정의


DMA란 Direct Memory Access의 줄임말로 쉽게 말해 직접 메모리 접근이라고 합니다. 그럼 여기서 또 문제가 생기죠. 
그럼 직접 메모리 접근이 뭡니까?? 
사실 그 자체입니다. 직접 메모리에 접근하여 데이터를 읽던지 쓰던지 하는 것이죠.

더 자세히 설명하자면 CPU에 대해 독립적으로 동작하는 bus slave간 데이터 전송 기능을 가지는 장치입니다.
CPU 몰래 끙차끙차 데이터를 옮기는 것이죠. 원래 데이터를 옮기는 일은 CPU가 전적으로 담당했는데 이 일을 DMA가 하게 되면 CPU는 비교적 일이 줄어들고 다른 일에 집중을 할 수 있게 되는 것이죠. 




DMA의 동작



DMA의 구조는 이렇습니다.  ARM Cortex-M 계열 CPU Core와 DMA가 보입니다.
STM32L4 계열 MCU를 기반으로 한 자료입니다.





MCU의 Peripheral들은 이렇게 DMA Request를 보낼 수 있게 하나의 DMA에 대응되게 버스로 연결되어있습니다. 




아래에는 DMA가 어떻게 동작하는지 설명하도록 하겠습니다.



먼저 USART1 Peripheral로 데이터가 들어옵니다.





그럼 Peripehral에서는 연결된 버스로 해당 DMA에게 DMA Request를 보냅니다.
나 데이터 받았어~~~~~ 이런 식으로죠 ㅋㅋ




그럼 DMA는 버스를 통해 Peripheral에서 받은 데이터를 가져오게(READ) 됩니다.






그럼 DMA는 버스를 통해 메모리에 데이터를 보내게(WRITE. 쓴다는 표현이 더 맞겠네요) 되는 거죠.


DMA는 이런 식으로 동작하게 됩니다. 어때요. 이 과정에서 Core가 간섭한 적이 한 번이라도 있었나요? 없었습니다. 제가 왜 DMA는 CPU 몰래 데이터를 끙차끙차 옮기는 것이라는지 이해할 수 있겠죠?




DMA 구조



DMA는 7개의 채널을 가지며 각각의 채널은 허가된 Request Source(Request를 보내는 Peripheral)과 연결될 수 있습니다.(자세한 내용은 각 MCU의 Reference Manual을 참고하세요)
DMA Data Stream은 우선순위에 따른 Channel Request에 맞게 처리를 수행합니다.
Channel의 우선순위는 고정된 것이 아니라 프로그램으로 충분히 4단계로 수정할 수 있습니다.(CubeMX로 수정이 가능합니다)





이렇게 CubeMX의 DMA Configuration 창에서 설정할 수 있죠 Low-Medium-High-Very High 단계순입니다.




DMA Operation


DMA가 데이터를 이동시킬 수 있는 루트(방향)는 총 세가지입니다.
Memory to Peripheral, PeriPheral to Memory, Memory to Momory입니다.


DMA의 모드는 2가지로 설정할 수 있는데, Normal Mode와 Circular Mode입니다.
DMA는 Request를 통해 Source(출발지)의 데이터를 Destination(목적지)로 지정된 횟수(NDT : Number of Data to Transfer 라고 합니다)만큼 데이터를 옮기게 됩니다. 




Normal 모드

Normal 모드는 NDT 레지스터가 0이 되면 전송이 중지됩니다. DMA가 데이터를 이동시킬 때마다 NDT 레지스터의 값이 이동시킨 데이터의 수 만큼 감소하는데 이때 설정한 NDT만큼 전송을 완료하면 NDT 값이 0이므로 Peripheral에 아무리 데이터가 계속 들어와도 DMA는 데이터를 이동시키기 않습니다.
그래서 만약 데이터를 다시 이동시키고 싶다면 DMA로 데이터를 NDT 만큼 이동시키라는 코드를 호출해야겠죠?



Circular 모드


Circular 모드는 전송이 다 될 때마다 코드를 다시 호출해야 되는 Normal 모드의 불편함(귀찮음??)을 해소하기 위한 방법입니다. Circular 모드는 NDT 레지스터 값이 0이 되면 최초에 설정한 값으로 자동으로 reload되는데 만약 최초로 NDT 값을 100이라 선언했다면 DMA가 100바이트를 다 이동시켜 NDT가 0이 되었을 때 다시 NDT가 자동으로 100으로 변하여 지속적으로 데이터를 이동시킬 수 있게 됩니다. 



Circular 모드를 보다 자세히 이해할 수 있는 자료입니다.



Circular 모드를 사용하면 원형큐를 만들 수 있게 되는데요.
어떤 센서로부터 데이터를 받아오는데 센서가 같은 주기마다 보내는 데이터의 수가 일정하지 않을 때 Normal 모드를 사용하면  센서가 보내던 데이터를 일부 잃어버릴 수 있는데 Circular 모드를 사용하면 NDT가 0일 때 자동으로 reload되어 지속적으로 수신하므로 버퍼만 충분히 크게 잡아놓는다면 데이터를 잃어버릴 일이 없습니다. 

물론 상황에 따라 Normal 모드와 Circular 모드를 구분해서 사용해야 할 것입니다.




DMA Interrupt source


DMA는 인터럽트를 두 번의 경우에 발생시킵니다.

1. TC(Transmission Complete)
설정한 NDT만큼 데이터의 이동이 완료되면 DMA는 인터럽트를 발생시킵니다.

2. HT(Half-Transfer Complete)
설정한 NDT의 반만큼 데이터의 이동이 완료되면 DMA는 인터럽트를 발생시킵니다.


저도 아직 DMA가 무엇이고 언제 사용해야 되고 얻는 이점이 무엇인지 100% 알진 못하지만 이렇게라도 정리해 놓으니 무언가 뿌듯하네요. 아직 부족한 고등학생이 올린 글이라 틀린 부분이 많을 수 있으니 혹시 틀린 부분이나 생각하시던 개념과 다르다면 댓글로 알려주시면 감사하겠습니다. 


긴 글 읽어주셔서 감사합니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함