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
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
Generated on Sat Jul 16 2022 06:08:34 by 1.7.2