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

spidma.cpp

Committer:
hudakz
Date:
2019-04-11
Revision:
0:5c2870105122

File content as of revision 0:5c2870105122:

/*===================================================================*/
/*                                                                   */
/*  spidma.cpp : SPI DMA function                                    */
/*                                                                   */
/*  2016/1/20  Racoon                                                */
/*                                                                   */
/*===================================================================*/

#include "mbed.h"
#include "stm32f4xx_hal.h"

SPI_HandleTypeDef  SpiHandle;
DMA_HandleTypeDef  hdma_tx;

/*-------------------------------------------------------------------*/
/*  callback                                                         */
/*-------------------------------------------------------------------*/
extern "C" {
    void HAL_SPI_MspInit(__SPI_HandleTypeDef *hspi)
    {
        GPIO_InitTypeDef GPIO_InitStruct;
      
        __HAL_RCC_GPIOB_CLK_ENABLE();
        __HAL_RCC_SPI1_CLK_ENABLE();
        __HAL_RCC_DMA2_CLK_ENABLE();

        GPIO_InitStruct.Pin       = GPIO_PIN_3;
        GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull      = GPIO_PULLUP;
        GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

        GPIO_InitStruct.Pin = GPIO_PIN_4;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

        GPIO_InitStruct.Pin = GPIO_PIN_5;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

        hdma_tx.Instance                 = DMA2_Stream3;
        hdma_tx.Init.Channel             = DMA_CHANNEL_3;
        hdma_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;
        hdma_tx.Init.PeriphInc           = DMA_PINC_DISABLE;
        hdma_tx.Init.MemInc              = DMA_MINC_ENABLE;
        hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
        hdma_tx.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;
        hdma_tx.Init.Mode                = DMA_NORMAL;
        hdma_tx.Init.Priority            = DMA_PRIORITY_HIGH;
        hdma_tx.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;
        hdma_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
        hdma_tx.Init.MemBurst            = DMA_MBURST_INC4;
        hdma_tx.Init.PeriphBurst         = DMA_MBURST_INC4;

        HAL_DMA_Init(&hdma_tx);

        __HAL_LINKDMA(&SpiHandle, hdmatx, hdma_tx); // SpiHandle->hdmatx = hdma_tx

        HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 0, 1);
        HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
    }

    void DMA2_Stream3_IRQHandler(void)
    {
        HAL_DMA_IRQHandler(SpiHandle.hdmatx);
    }
} // extern "C"

/*-------------------------------------------------------------------*/
/*  Write a byte data                                                */
/*-------------------------------------------------------------------*/
void spi_write(uint8_t data)
{
    HAL_SPI_Transmit(&SpiHandle, &data, 1, 100);
}

/*-------------------------------------------------------------------*/
/*  Write a word data                                                */
/*-------------------------------------------------------------------*/
void spi_writew(uint16_t data)
{
    HAL_SPI_Transmit(&SpiHandle, (uint8_t *)&data, 2, 100);
}

/*-------------------------------------------------------------------*/
/*  Write a byte data                                                */
/*-------------------------------------------------------------------*/
void spi_write(uint8_t* pData, uint16_t size)
{
    HAL_SPI_Transmit(&SpiHandle, pData, size, 100);
}

/*-------------------------------------------------------------------*/
/*  Initialize SPI DMA                                               */
/*-------------------------------------------------------------------*/
void spi_init()
{
    SpiHandle.Instance               = SPI1;
    SpiHandle.Init.Mode              = SPI_MODE_MASTER;
    SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
    SpiHandle.Init.Direction         = SPI_DIRECTION_2LINES;
    SpiHandle.Init.CLKPhase          = SPI_PHASE_1EDGE;
    SpiHandle.Init.CLKPolarity       = SPI_POLARITY_HIGH;
    SpiHandle.Init.CRCCalculation    = SPI_CRCCALCULATION_DISABLE;
    SpiHandle.Init.CRCPolynomial     = 7;
    SpiHandle.Init.DataSize          = SPI_DATASIZE_8BIT;
    SpiHandle.Init.FirstBit          = SPI_FIRSTBIT_MSB;
    SpiHandle.Init.NSS               = SPI_NSS_SOFT;
    SpiHandle.Init.TIMode            = SPI_TIMODE_DISABLE;

    if (HAL_SPI_Init(&SpiHandle) != HAL_OK)
        while(1);
}