stm32 dma 예제

보이드 DMA2_Stream0_IRQHandler(무효) { //이 이미 “stm32f4xx_it.c”에 정의되어 있습니다! 나는 거기에 댓글을 달았습니다! /* 전송 완전 인터럽트 */ (DMA2->LISR 및 DMA_LISR)의 경우 (DMA2->LISR & DMA2_Stream00->CR & DMA_SxCR_TCIE) { DMA2->LIFCR = DMA_LIFCR_CTCIF0; // 인정 인터럽트 DMA_IRQHandler(); IRQin+; } 다른 { 카운터. IRQout ++; } } 이제 단일 응용 프로그램에서 DMA 및 USART의 모든 기능을 사용할 차례입니다. 응용 프로그램별로 20바이트를 수신하고 실제로 14바이트만 수신할 것으로 예상되는 이전 예제로 이동하면 이제 [5] STM32L476VG, http://www.st.com/en/microcontrollers/stm32l476vg.html 처음 몇 줄은 상당히 자명해야 합니다. SPI2 모듈의 송신 버퍼 빈 신호에 대한 DMA 요청은 DMA1의 채널 0, 스트림 4에 위치한다. 우리의 메모리 기본 주소는 배열에 대한 포인터입니다 (배열의 이름은 첫 번째 요소에 대한 포인터일 뿐이므로 ampersand가 필요하지 않습니다. 주변 기본 주소는 SPI2 모듈의 데이터 레지스터에 대한 포인터입니다. 메모리에서 주변 장치로 단일 바이트를 전송합니다. DMA 모드의 경우 두 가지 옵션이 있습니다: 일반 및 원형. 일반 모드에서DMA는 지정된 수의 데이터 단위 후에 바이트 전송을 중지하지만 원형 모드에서는 단순히 초기 포인터로 돌아가고 계속 진행합니다. “초기 포인터?” 당신은 물어 볼 수 있습니다 : 그 다음 두 줄이 재생에 와서 곳이다. 각 전송 후 포인터 중 하나 또는 둘 다 자동으로 증가하도록 DMA 컨트롤러에 요청할 수 있습니다. 즉, 주변 주소가 변경되지 않는 동안 내 예에서 무슨 일이 일어나고 있는지입니다 (분명히 우리는 동일한 레지스터를 읽고 계속하려면), 메모리에 대한 포인터 위치는 내 “screenBuffer”배열을 통해 스테핑하여 증가하게하고, 이 의 크기 배열은 정확히 6*84바이트입니다(48 x 84 픽셀에 해당). 마지막으로 이 DMA 스트림에 대한 우선 순위 수준을 지정합니다(다른 스트림도 활성화되어 있고 버스에 대한 액세스를 위해 경쟁할 수 있기 때문에).

이 예제에서는 순환 모드로 구성된 주변 DMA에 대한 성능 효율적인 DMA 시간 시간 메커니즘을 구현하는 방법을 제공합니다. 이 예제에서는 DMA와 ADC를 사용하여 아날로그 스틱의 두 채널 (x 및 y 축, 그래서 데이터는 코드에서 인터리브됩니다)에서 데이터를 샘플링했습니다.이 게시물에서 설명하는 간단한 게임의 조이스틱으로 사용하고 있습니다. 그것은 간단한 Arkanoid 클론하지만 내가 DMA에 대해 보여 준 것과 STM32F4 내부의 LTDC 컨트롤러와 TFT 디스플레이를 운전에 대한이 다른 게시물에서 설명 한 것을 요약합니다. 전체 소스 코드를 확인하십시오. 우리는 이전 튜토리얼에서 LED 라이브러리를 사용 – 그들은 시작을 나타내고 두 모드에 대한 전송을 중지 – DMA와 CPU. 코드에서 볼 수 있듯이 우선 DMA1 클럭을 켜서 작동하도록 해야 합니다. 그런 다음 설정을 DMA_InitStructure에 로드하기 시작합니다.

Comments are closed.