1、引脚定义
#define FLASH_SPI SPI1
#define SPIx_RCC_CLK RCC_APB2PERIPH_SPI1
#define SPIx_GPIO_RCC_CLK RCC_APB2PERIPH_GPIOB
#define SPIx_PIN_NSS GPIO_Pins_7
#define SPIx_PORT_NSS GPIOB
#define SPIx_PIN_SCK GPIO_Pins_3
#define SPIx_PORT_SCK GPIOB
#define SPIx_PIN_MISO GPIO_Pins_4
#define SPIx_PORT_MISO GPIOB
#define SPIx_PIN_MOSI GPIO_Pins_5
#define SPIx_PORT_MOSI GPIOB
2、使用SPI1引脚重映射
使能SPI1和GPIOB时钟
RCC_APB2PeriphClockCmd(SPIx_RCC_CLK | SPIx_GPIO_RCC_CLK, ENABLE);
使能APB2线AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_AFIO, ENABLE);
禁用JTAG引脚时钟复用
GPIO_PinsRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
使能SPI引脚重映射
GPIO_PinsRemapConfig(GPIO_Remap01_SPI1, ENABLE);
3、初始化引脚配置和SPI配置
/* Configure SPI_FLASH pins*/
GPIO_InitStructure.GPIO_Pins = SPIx_PIN_MOSI;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(SPIx_PORT_MOSI, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = SPIx_PIN_MISO;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(SPIx_PORT_MISO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = SPIx_PIN_NSS;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
GPIO_Init(SPIx_PORT_NSS, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = SPIx_PIN_SCK;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(SPIx_PORT_SCK, &GPIO_InitStructure);
FLASH_CS_HIGH();
/* SPI_FLASH configuration ------------------------------------------------------*/
SPI_InitStructure.SPI_TransMode = SPI_TRANSMODE_FULLDUPLEX;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2EDGE;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_HIGH;
SPI_InitStructure.SPI_CPOLY = 0;
SPI_InitStructure.SPI_FirstBit = SPI_FIRSTBIT_MSB;
SPI_InitStructure.SPI_FrameSize = SPI_FRAMESIZE_8BIT;
SPI_InitStructure.SPI_MCLKP = SPI_MCLKP_8;
SPI_InitStructure.SPI_NSSSEL = SPI_NSSSEL_SOFT;
SPI_InitStructure.SPI_Mode = SPI_MODE_MASTER;
SPI_Init(FLASH_SPI, &SPI_InitStructure);
/* Enable SPI module */
SPI_Enable(FLASH_SPI, ENABLE);