개요 |
|
STM32 (STM32L4x6) 에서 SPI 활용시 DMA 기반으로 통신처리하는 방법. 전체 구현흐름. 1. STM32CubeMX 의 SPI 설정에서 DMA 사용가능하게 설정. 2. 상기1에서 프로젝트 생성하여 (본 예에서는 KEIL MDK-ARM 용 프로젝트 생성함.) 3. 상기 2의 펌웨어 코드에서 SPI DMA 읽기/쓰기 처리 코드 추가. |
|
상세 |
||||
STM32CubeMX 에서 SPI DMA 설정. SPI 설정창의 탭 "DMA Settings" 에서 RX 용 TX 용 2개모두 등록한다. - 2개 모두 등록함이 중요하다. 실제 코드에서 TX는 사용하지 않고 RX만 사용하는 경우에도 설정에서 2개 모두 등록해야 RX 만 사용하는 경우에도 정상 작동한다. 위와 같이 DMA를 선택하게 되면 DMA1 Channel2,3 의 인터럽트 는 자동으로 활성화된다. (아래그림.) SPI1 global interrupt 는 SPI DMA사용하기 위한 필수 아니므로 선택하지 않아도 됨. SPI 인터럽트 방식 핸들링 하려는 경우에는 필수. 프로젝트 생성하여 KEIL 에서 보면, 자동 생성된 코드는 아래와 같다. MX_DMA_Init 내에 보면 클럭 설정과 DMA인터럽트 설정이 전부이다. DMA 사용하는 SPI1의 설정에서는 DMA 선택한 것에 해당하는 설정은 main.c에 등록된 코드 상에서는 별반 다를것 없고 HAL_SPI_Init() 함수 내에서 DMA관련 설정이 이뤄지고 있다. 자동 생성된 코드 그대로 두면됨 우리가 수정할 건 없다. SPI DMA 송/수신 함수 활용 . SPI에서 DMA방식으로 슬레이브로부터 데이터 읽기 하려면 아래 함수를 호출한다. . 함수 HAL_SPI_Receive_DMA 호출해도 되나 full duplex 모드로 SPI 설정한 경우에는 HAL_SPI_Receive_DMA 내부적으로 HAL_SPI_TransmitReceive_DMA 가 호출되므로 동일한 것이다.
SPI 에서 DMA방식으로 슬레이브에 데이터 쓰기 하려면 아래 함수를 호출한다.
DMA 인터럽트 핸들러 추가. DMA 방식으로 SPI 통신하는 경우 송수신 완료 상태시 처리를 위하여 인터럽트 핸들러를 추가한다. - 폴링으로 송수신 상태를 파악할 수도 있으나 DMA 사용한다 함은 CPU부하 감소시킬려고 하는것인데 폴링으로 검출하게 되면 CPU 부하 감소 효과를 보지 못하므로 인터럽트방식으로 송수신 완료시의 처리를 수행하는 것이 타당하다. 아래 인터럽트 핸들러는 DMA방식에서도 사용되지만 인터럽트 방식으로 사용할때도 동일한 이름의 함수로 정의된다. 함수 HAL_SPI_TxRxCpltCallback( 의 선언은 이미 라이브러리에 되어있기 때문에 사용자 코드에서 선언부는 추가하지 않아도 된다.
|
||||
연관
https://igotit.tistory.com/244 의 STM32
첫 등록 : 2016.03.29
최종 수정 :
단축 주소 : https://igotit.tistory.com/726
'임베디드.일렉트로닉스 > STM32' 카테고리의 다른 글
STM32. DfuSe Demo 사용법. (0) | 2016.04.12 |
---|---|
STM32. DfuSe 3.0.4 Bug 해결된 DfuFileMgr.exe, STDFUFiles.dll (0) | 2016.04.12 |
STM32. L4x6 SPI 개요. (0) | 2016.03.23 |
STM32. 리셋핀 NRST 풀업저항. (0) | 2016.03.17 |
STM32. I2C 사용하기. (0) | 2016.03.10 |
댓글