本帖最后由 lc115647 于 2024-12-11 23:14 编辑
#申请原创# 1.SPI默认管脚如下所示
2.重映射管脚如下所示
3.配置流程
- 首先打开外设时钟(GPIOB、SPI1)
- 开启复用时钟(AFIO),同时调用 API :GPIO_ConfigPinRemap(GPIO_REMAP_SPI1);重映射SPI管脚。
- 默认情况下PB3、PB4会被JTAG调试占用,因此需要配置调试模式为只开SWD;
- 配置GPIO口模式:CLK和MOSI需要配置为复用推挽输出,MISO配置为浮空输入模式,可以参考手册:
- 特别需要注意配置GPIO口为输出模式时,必须要配置speed,否则会有概率出现,管脚配置失败无法输出波形(踩过坑)
手册GPIO寄存器如下,复位后默认MODEy[1:0]的值为00,如果只配置CFGy[1:0]时,正常设置复用推挽模式时写入的值为10,但是结合MODEy寄存器的值,此时GPIO实际配置的模式为输入上下拉模式;
与SPI1正常的GPIO复用推挽模式不符合,导致SPI无法正常输出波形。
4.配置代码参考如下
uint8_t SPI1_Config(uint32_t prescale, uint32_t clock_polarity_phase)
{
SPI_Config_T spi_init_struct;
GPIO_Config_T gpioConfig;
/* deinitialize SPI and the parameters */
SPI_Disable(SPI1);
SPI_I2S_Reset(SPI1);
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB);
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SPI1);
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_AFIO);
GPIO_ConfigPinRemap(GPIO_REMAP_SPI1);
GPIO_ConfigPinRemap(GPIO_REMAP_SWJ_JTAGDISABLE);
//PB4-MISO
gpioConfig.pin = GPIO_PIN_4;
gpioConfig.mode = GPIO_MODE_IN_FLOATING;
gpioConfig.speed = GPIO_SPEED_50MHz;
GPIO_Config(GPIOB, &gpioConfig);
//PB3-CLK PB5-MOSI
gpioConfig.pin = GPIO_PIN_3|GPIO_PIN_5;
gpioConfig.mode = GPIO_MODE_AF_PP;
gpioConfig.speed = GPIO_SPEED_50MHz;
GPIO_Config(GPIOB, &gpioConfig);
|