ILI9341 display driver (with SPI DMA) for STM32F4 targets. Fork of https://os.mbed.com/users/beaglescout007/code/Nucleo_Ex06_EMU/file/3dac1f1bc9e0/TFT/. Added support for STM32F407 (Seeed Arch Max).

Dependents:   STM32F407VET6_Pong

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers spidma.cpp Source File

spidma.cpp

00001 /*===================================================================*/
00002 /*                                                                   */
00003 /*  spidma.cpp : SPI DMA function                                    */
00004 /*                                                                   */
00005 /*  2016/1/20  Racoon                                                */
00006 /*                                                                   */
00007 /*===================================================================*/
00008 
00009 #include "mbed.h"
00010 #include "stm32f4xx_hal.h"
00011 
00012 SPI_HandleTypeDef  SpiHandle;
00013 DMA_HandleTypeDef  hdma_tx;
00014 
00015 /*-------------------------------------------------------------------*/
00016 /*  callback                                                         */
00017 /*-------------------------------------------------------------------*/
00018 extern "C" {
00019     void HAL_SPI_MspInit(__SPI_HandleTypeDef *hspi)
00020     {
00021         GPIO_InitTypeDef GPIO_InitStruct;
00022       
00023         __HAL_RCC_GPIOB_CLK_ENABLE();
00024         __HAL_RCC_SPI1_CLK_ENABLE();
00025         __HAL_RCC_DMA2_CLK_ENABLE();
00026 
00027         GPIO_InitStruct.Pin       = GPIO_PIN_3;
00028         GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
00029         GPIO_InitStruct.Pull      = GPIO_PULLUP;
00030         GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;
00031         GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
00032         HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
00033 
00034         GPIO_InitStruct.Pin = GPIO_PIN_4;
00035         HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
00036 
00037         GPIO_InitStruct.Pin = GPIO_PIN_5;
00038         HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
00039 
00040         hdma_tx.Instance                 = DMA2_Stream3;
00041         hdma_tx.Init.Channel             = DMA_CHANNEL_3;
00042         hdma_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;
00043         hdma_tx.Init.PeriphInc           = DMA_PINC_DISABLE;
00044         hdma_tx.Init.MemInc              = DMA_MINC_ENABLE;
00045         hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
00046         hdma_tx.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;
00047         hdma_tx.Init.Mode                = DMA_NORMAL;
00048         hdma_tx.Init.Priority            = DMA_PRIORITY_HIGH;
00049         hdma_tx.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;
00050         hdma_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
00051         hdma_tx.Init.MemBurst            = DMA_MBURST_INC4;
00052         hdma_tx.Init.PeriphBurst         = DMA_MBURST_INC4;
00053 
00054         HAL_DMA_Init(&hdma_tx);
00055 
00056         __HAL_LINKDMA(&SpiHandle, hdmatx, hdma_tx); // SpiHandle->hdmatx = hdma_tx
00057 
00058         HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 0, 1);
00059         HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
00060     }
00061 
00062     void DMA2_Stream3_IRQHandler(void)
00063     {
00064         HAL_DMA_IRQHandler(SpiHandle.hdmatx);
00065     }
00066 } // extern "C"
00067 
00068 /*-------------------------------------------------------------------*/
00069 /*  Write a byte data                                                */
00070 /*-------------------------------------------------------------------*/
00071 void spi_write(uint8_t data)
00072 {
00073     HAL_SPI_Transmit(&SpiHandle, &data, 1, 100);
00074 }
00075 
00076 /*-------------------------------------------------------------------*/
00077 /*  Write a word data                                                */
00078 /*-------------------------------------------------------------------*/
00079 void spi_writew(uint16_t data)
00080 {
00081     HAL_SPI_Transmit(&SpiHandle, (uint8_t *)&data, 2, 100);
00082 }
00083 
00084 /*-------------------------------------------------------------------*/
00085 /*  Write a byte data                                                */
00086 /*-------------------------------------------------------------------*/
00087 void spi_write(uint8_t* pData, uint16_t size)
00088 {
00089     HAL_SPI_Transmit(&SpiHandle, pData, size, 100);
00090 }
00091 
00092 /*-------------------------------------------------------------------*/
00093 /*  Initialize SPI DMA                                               */
00094 /*-------------------------------------------------------------------*/
00095 void spi_init()
00096 {
00097     SpiHandle.Instance               = SPI1;
00098     SpiHandle.Init.Mode              = SPI_MODE_MASTER;
00099     SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
00100     SpiHandle.Init.Direction         = SPI_DIRECTION_2LINES;
00101     SpiHandle.Init.CLKPhase          = SPI_PHASE_1EDGE;
00102     SpiHandle.Init.CLKPolarity       = SPI_POLARITY_HIGH;
00103     SpiHandle.Init.CRCCalculation    = SPI_CRCCALCULATION_DISABLE;
00104     SpiHandle.Init.CRCPolynomial     = 7;
00105     SpiHandle.Init.DataSize          = SPI_DATASIZE_8BIT;
00106     SpiHandle.Init.FirstBit          = SPI_FIRSTBIT_MSB;
00107     SpiHandle.Init.NSS               = SPI_NSS_SOFT;
00108     SpiHandle.Init.TIMode            = SPI_TIMODE_DISABLE;
00109 
00110     if (HAL_SPI_Init(&SpiHandle) != HAL_OK)
00111         while(1);
00112 }
00113