Direct Memory Access (DMA)
- 주변장치들이 메모리에 직접 접근하여 읽거나 쓸 수 있도록 하는 기능
- CPU 의 개입 없이 I/O 장치와 기억장치 데이터를 전송하는 접근 방식
- Interrupt 와 달리 별도의 중앙제어장치는 명령을 실행할 필요가 없음
- 메모리 처리 Interrupt 의 사이클 만큼 성능의 향상
일반적인 메모리접근 방식 VS DMA 방식
일반적인 메모리접근 방식
- 모든 I/O 로의 접근은 CPU를 통해서 수행
- Data를 전달할 때마다 CPU가 관여함
DMA 방식
- RAM이 I/O 장치로부터 데이터가 필요해지면, CPU는 DMA 컨트롤러에게 신호(전송 크기, 주소 등등)를 보냄
- DMA 컨트롤러가 RAM 주소로 데이터를 bus를 통해 주고 받음
- 모든 데이터 전송이 끝나면, DMA Controller가 CPU에게 Interrupt 신호를 보냄
DMA Channel
- 모듈은 DMA Controller 의 DMA 채널을 통해 메모리 R/W
- STM32 보드 DMA 채널은 총 12 개
- DAM1 채널 7개, DMA2 채널 5개
- 한 DMA의 여러 채널 사이 요청은 Priority에 따라 동작
- 4 level: very high, high, medium, low
- Peripheral-to-memory, memory-to-peripheral, and peripheral-to-peripheral 전송
DMA Mode
- Normal Mode
- DMA Controller 는 데이터를 전송할 때 마다 NDT 값을 감소시킴
- NDT 는 DMA 를 통해 전송할 데이터의 총 용량을 의미하며 레지스터의 값이 0이 되면 데이터 전송 중단
- 데이터 전송을 받고 싶을 때 마다 새롭게 요청이 필요
- Circular Mode
- 주기적인 값의 전송(업데이트)이 필요할 때 사용하는 모드
- NDT 값이 0이 될 경우 설정한 데이터 최대 크기로 재설정됨
DMA Controller
주변 장치의 Request Signal 의 발생
- DMA Controller 에서 우선순위 설정 및 요청에 대한 서비스 제공
- Request / ACK 방식을 통한 주변 장치와 DMA Controller 간 통신
DMA1 및 DMA2 채널
ADC 설정
- Interrupt를 쓰지 말고 DMA를 이용해야 하므로
- ADC_ITConfig 함수 대신 ADC_DMACmd 함수를 써야 함
Volatile
- 전역변수로 선언한 ADC 값을 저장할 공간을 항상 참조하도록 volatile 키워드 이용
a value of type "uint32_t volatile *" cannot be assigned to an entity of type "uint32_t“
- 이런 종류의 에러가 뜨면 변수명 앞에 (uint32_t) 로 형 변환하세요
작성코드 및 보고서 : https://github.com/yunzae/Embeded-System/tree/main/Embeded/11주차
'Project > 나만의 주점(STM32,Arduino,android)' 카테고리의 다른 글
나만의 주점.. (0) | 2022.12.29 |
---|---|
STM32- Timer와 PWM (0) | 2022.12.16 |
STM32- LCD 및 ADC (0) | 2022.12.16 |
STM32-블루투스 (1) | 2022.12.16 |
STM32- Interrupt 방싱을 활용한 GPIO 제어 및 UART 통신 (0) | 2022.12.16 |