I have ported my old project “pNesX” game console emulator to the nucleo.
Dependencies: SDFileSystem mbed
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 00014 /*-------------------------------------------------------------------*/ 00015 /* callback */ 00016 /*-------------------------------------------------------------------*/ 00017 extern "C" { 00018 void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) 00019 { 00020 static DMA_HandleTypeDef hdma_tx; 00021 00022 GPIO_InitTypeDef GPIO_InitStruct; 00023 00024 __HAL_RCC_GPIOA_CLK_ENABLE(); 00025 __HAL_RCC_SPI1_CLK_ENABLE(); 00026 __HAL_RCC_DMA2_CLK_ENABLE(); 00027 00028 GPIO_InitStruct.Pin = GPIO_PIN_5; 00029 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; 00030 GPIO_InitStruct.Pull = GPIO_PULLUP; 00031 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; 00032 GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; 00033 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 00034 00035 GPIO_InitStruct.Pin = GPIO_PIN_6; 00036 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 00037 00038 GPIO_InitStruct.Pin = GPIO_PIN_7; 00039 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 00040 00041 hdma_tx.Instance = DMA2_Stream3; 00042 hdma_tx.Init.Channel = DMA_CHANNEL_3; 00043 hdma_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; 00044 hdma_tx.Init.PeriphInc = DMA_PINC_DISABLE; 00045 hdma_tx.Init.MemInc = DMA_MINC_ENABLE; 00046 hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; 00047 hdma_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; 00048 hdma_tx.Init.Mode = DMA_NORMAL; 00049 hdma_tx.Init.Priority = DMA_PRIORITY_HIGH; 00050 hdma_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; 00051 hdma_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; 00052 hdma_tx.Init.MemBurst = DMA_MBURST_SINGLE; 00053 hdma_tx.Init.PeriphBurst = DMA_PBURST_SINGLE; 00054 00055 HAL_DMA_Init(&hdma_tx); 00056 00057 __HAL_LINKDMA(hspi, hdmatx, hdma_tx); 00058 00059 HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 0, 1); 00060 HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn); 00061 } 00062 00063 void DMA2_Stream3_IRQHandler(void) 00064 { 00065 HAL_DMA_IRQHandler(SpiHandle.hdmatx); 00066 } 00067 00068 } // extern "C" 00069 00070 /*-------------------------------------------------------------------*/ 00071 /* Write a byte data */ 00072 /*-------------------------------------------------------------------*/ 00073 void spi_write(uint8_t data) 00074 { 00075 HAL_SPI_Transmit(&SpiHandle, &data, 1, 100); 00076 } 00077 00078 /*-------------------------------------------------------------------*/ 00079 /* Write a word data */ 00080 /*-------------------------------------------------------------------*/ 00081 void spi_writew(uint16_t data) 00082 { 00083 HAL_SPI_Transmit(&SpiHandle, (uint8_t *)&data, 2, 100); 00084 } 00085 00086 /*-------------------------------------------------------------------*/ 00087 /* Initialize SPI DMA */ 00088 /*-------------------------------------------------------------------*/ 00089 void spi_init() 00090 { 00091 SpiHandle.Instance = SPI1; 00092 SpiHandle.Init.Mode = SPI_MODE_MASTER; 00093 SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; 00094 SpiHandle.Init.Direction = SPI_DIRECTION_2LINES; 00095 SpiHandle.Init.CLKPhase = SPI_PHASE_1EDGE; 00096 SpiHandle.Init.CLKPolarity = SPI_POLARITY_HIGH; 00097 SpiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; 00098 SpiHandle.Init.CRCPolynomial = 7; 00099 SpiHandle.Init.DataSize = SPI_DATASIZE_8BIT; 00100 SpiHandle.Init.FirstBit = SPI_FIRSTBIT_MSB; 00101 SpiHandle.Init.NSS = SPI_NSS_SOFT; 00102 SpiHandle.Init.TIMode = SPI_TIMODE_DISABLE; 00103 00104 if (HAL_SPI_Init(&SpiHandle) != HAL_OK) 00105 while(1); 00106 } 00107
Generated on Tue Jul 12 2022 20:36:59 by 1.7.2