stm32的引脚PB6/PB7默认是什么,我想让他作为普通的i/o口,怎样配置寄存器

 我来答
清风小优
推荐于2017-12-16 · TA获得超过146个赞
知道答主
回答量:63
采纳率:100%
帮助的人:49.8万
展开全部
PB6/PB7是I2C1 的SCL和SDA端,如果作为普通的I/O口,就一般的配置就可以。GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //设置速率
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置你要的模式
GPIO_Init(GPIOB, &GPIO_InitStructure);
追问
PB6和PB7分别是模拟SPI接口的si和SO信号,SI作为输出,SO作为输入,输入配置为上拉输入,正常来说,不管怎样配置PB7,都不会改变它引脚的电平,但是我经过示波器查看得知,我配置的高低电平均生效,这个是错误的,因为既然是输入信号,肯定是有输入源决定的,我配置其他的引脚向PD6,PD7都可以的,它们不是管脚复用的,我怀疑是管脚复用的问题,但是也一直不得解,求大侠帮忙,最好是有代码配置的。
追悔七年
推荐于2016-09-13 · TA获得超过587个赞
知道小有建树答主
回答量:251
采纳率:66%
帮助的人:266万
展开全部

  我不得不给你看看GPIO的结构图,如下:

  看到没有,如果你把IO配置为输入的话,输出回路的那个开关就断开了,输出寄存器的值不会影响到输入状态的。注意看,输入回路有上拉开关和下拉开关,而这个上下拉开关就是由输出寄存器来控制的。你说你配置的高低电平能生效,如果你的硬件电路没问题,而你又是配置的输入的话,只有一种情况,那就是你把IO配置为上下拉输入了。比如像下面的代码:

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

  或者:

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

  在GPIO_Init这个函数中,会判断你配置的GPIO_Mode,如果是GPIO_Mode_IPU
或GPIO_Mode_IPD的话,它会有下面的代码来设置输出寄存器为高或为低:

        /* Reset the corresponding ODR bit */
        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
        {
          GPIOx->BRR = (((uint32_t)0x01) << pinpos);
        }
        else
        {
          /* Set the corresponding ODR bit */
          if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
          {
            GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
          }
        }

  所以,你配置为浮空输入就好了,像下面这样:

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
   GPIO_Init(GPIOB, &GPIO_InitStructure);

  

更多追问追答
追问
你说的我也都理解的,就是这样的,我配置为上拉或下拉就都生效,输入模式是浮空时就不能配置成功。但是我配置PD6为上拉输入就不会配置生效的,所以我怀疑是PB6/PB7是复用管教的问题,求解,我用gpio模拟SPI总线来做的,一直访问不了spi总线,访问的vs1063a,大侠求解。
追答
  1. 首先确定你没有使能复用功能,PB6/PB7的复用有I2C和UART1。

  2. 确定你的MISO配置为浮空输入,MOSI、CLK、CS都配置为推挽输出。

  3. 确定你的SPI模拟时序没问题,如果你的板子上有SPI FLASH,尝试用你的SPI模拟程序去读FLASH试试。

  4. 确定你的SPI时钟频率小于vs1063a的最大频率。

  5. 如果你觉得是IO问题,你把SPI的CLK,MISO,MOSI移到其他IO上再试试。

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式