STM32F407 4장. DMA(Direct Memory Access)(TRUESTUDIO, HAL_Driver) :: 찬찬히 로봇 메이커
반응형

그 동안 바빴었고, 또 바빴다...라고도 생각했지만 이젠 잘 모르겠다.....

오랜만에 쓰려니 전에 했던 것도 벌써 다 잊어버린 느낌이다. 그래도 해야하긴 하니까..... 벌써부터 힘이 빠지는 것 같지만 다시 한번 힘을 내야겠다.

이번엔 저번에 공부한 ADC에 연관된 DMA를 포스팅한다. DMA는 Direct Memory Access의 약자로 메모리 직접 접근의 약자이다. 이게 무엇이고 왜 쓰이냐 하면...

원래 ADC를 사용할 때에는 ADC의 SOC(start of conversion)을 해주고 변환된 값을 레지스터에서 내가 만든 변수에 옮겨주는 일을 해야했다. 그리고 레지스터에 저장된 변환된 값을 지우고, 다시 값을 받고 내가 만든 변수에 옮기고...의 반복을 해야했다. 게다가 혹시라도 값이 잘못 들어가면 안되니까 내가 만든 변수에 값을 옮겨주고 다기 초기화를 해야할 때도 있을 것이다. 그렇게 되면 아무리 짧은 코드라도 연속적으로 반복이 되니 별로 효율적이진 않을 것이다. 그래서 DMA라는 기능을 사용한다. 

위에서 설명한 레지스터에서 내가 만든 변수에 옮겨주는 일을 DMA가 직접 해준다. HAL라이브러리를 쓰면 DMA에 관한 함수가 있다. 그 함수를 쓰면 내가 만든 배열, 어느 정도 자료형(크기)에 넣을껀지를 한 줄로 써서 사용할 수 있다. 물론 설정은 많다.

위에 사진은 설정에 관한 것이고 아래 사진은 IRQHandler가 불려져서 내가 만든 함수 DMA 인터럽트 서비스 루틴이 실행되는 것을 보여준다. 일단 위에 함수를 보면 많이 복잡하고 여려워 보이지만 생각보다 어렵진 않고 당연히 설정해줘야 하는 것들로 이루어져있다.

DMA 맵을 보면 ADC1은 채널 0에 스트림0과 4에서 사용할 수 있는 것을 확인할 수 있다. 
direction은 'ADC'에서 'CPU memory에 있는 변수'이므로 Peripheral(외부장치)에서 memory(내부장치)이다. 
PeriphInc는 Increment Peripheral Adress라는 뜻으로, 값을 한 번 받을 때 마다 요청하는 Peripheral의 주소값을 한 칸씩 미루는 기능을 말한다. 아마 여러 개가 붙어 있는 센서를 사용하거나 할 때 쓰이는 기능같다. 하지만 나는 각자 개별적인 ADC를 사용하기 때문에 disable로 놓는다.
MemInc도 똑같이 한 번 DMA를 동작을 할 때마다 다음 값을 받는 주소값을 미루는 것을 말한다. 이것은 여러 개의 값을 여러 곳에 넣을 땐 필요한 레지스터이다. 예를 들어 값을 받을 때에는 배열에 받는다. 배열을 arr[]라 할 때, adc 하나는 arr[0]에, adc 다른 하나는 arr[1]에... 이런식으로 받게 되는데 배열은 포인터이기도 하고, 자료형 크기로 서로 붙어있으니 주소값이 하나씩 옆으로 가면서 배열에 하나씩 값을 넣을 수 있게 되는 것이다. 그래서 순차적으로 배열에 값을 넣을 수 있게 된다. 따라서 enable해준다.
DataAligment는 Data 저장되는 크기로 word는 32비트 (4바이트=int)크기로 저장이 된다는 뜻이다. 참고로 half word는 16비트, byte는 8비트의 크기로도 받을 수 있다.
마무리로는 DMA 인터럽트를 쓸 것인지를 설정하고 다른 인터럽트 쓸 때 처럼 인터럽트의 순위를 정해주면 끝이다.

그러면 마무리로 main에 DMA를 사용하겠다고 써주면 DMA가 작동이 된다. g_ADCBuffer는 내가 만든 배열의 이름으로 첫번째배열의 주소값이 된다. 4는 배열의 크기를 말한다.

추가로 이건 내가 직접 레지스터를 건드려서 설정해본 것인데...... 작동이 안되어 주석처리를 면치 못했다. 도대체 뭐가 문제인지......아 아직 멀었구나...

DMA는 확실히 옮겨주기만 하는 녀석이라 옮겨주는 위치, 크기 방향등만 설정하면 쉽게 사용할 수 있었다. 역시 문제는 ADC... 아직 더 파볼게 많은 것 같다. 다음 포스팅은 언제가 될지... 일본 마우스 대회가 곧이라... 공부할 것도 많고 공모전, 대회도 많고, 학업도 많고, 그 와중에 하고픈 것도 많다. 질풍노도의 시기라면 지금을 말하는게 아닐지... 그래도 이왕 시작했으니 끝은 봐야겠다.

반응형

+ Recent posts