打印
[FAQ]

APM32F103 SPI1重映射失败问题解决

[复制链接]
63|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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.配置代码参考如下
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);


使用特权

评论回复
沙发
呐咯密密| | 2024-12-12 09:22 | 只看该作者
MISO引脚不应该也是AF_PP吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

4

帖子

0

粉丝