[FAQ] APM32F103 SPI1重映射失败问题解决

[复制链接]
1386|2
 楼主| lc115647 发表于 2024-12-11 22:15 | 显示全部楼层 |阅读模式
GPIO, IO, MCU, gp, pi
本帖最后由 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.配置代码参考如下
  1. uint8_t SPI1_Config(uint32_t prescale, uint32_t clock_polarity_phase)
  2. {
  3.     SPI_Config_T spi_init_struct;
  4.     GPIO_Config_T gpioConfig;
  5.     /* deinitialize SPI and the parameters */
  6.     SPI_Disable(SPI1);
  7.     SPI_I2S_Reset(SPI1);
  8.        
  9.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
  10.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB);
  11.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SPI1);       
  12.        
  13.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_AFIO);
  14.     GPIO_ConfigPinRemap(GPIO_REMAP_SPI1);
  15.     GPIO_ConfigPinRemap(GPIO_REMAP_SWJ_JTAGDISABLE);
  16.                
  17.     //PB4-MISO
  18.     gpioConfig.pin =  GPIO_PIN_4;
  19.     gpioConfig.mode = GPIO_MODE_IN_FLOATING;
  20.     gpioConfig.speed =  GPIO_SPEED_50MHz;
  21.     GPIO_Config(GPIOB, &gpioConfig);
  22.        
  23.     //PB3-CLK PB5-MOSI
  24.     gpioConfig.pin =  GPIO_PIN_3|GPIO_PIN_5;
  25.     gpioConfig.mode = GPIO_MODE_AF_PP;
  26.     gpioConfig.speed =  GPIO_SPEED_50MHz;
  27.     GPIO_Config(GPIOB, &gpioConfig);


呐咯密密 发表于 2024-12-12 09:22 | 显示全部楼层
MISO引脚不应该也是AF_PP吗
 楼主| lc115647 发表于 2024-12-15 17:50 | 显示全部楼层
呐咯密密 发表于 2024-12-12 09:22
MISO引脚不应该也是AF_PP吗

不是的,在SPI主模式下,MISO代表主输入,从输出,因此要配置为浮空输入,手册有明确说明
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

29

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部