有如下一段配置F030的SPI的GPIO的程序,其中PB13为SCK,PB14为MISO,PB15为MOSI。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Medium_Speed;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOB, &GPIO_InitStructure);
显然SCK输出,MISO为输入。那么问题来了,为啥像SPI的MISO或者USART的RX总是一起配置为推挽输出模式呢?
在这里我们应当知道两点:
- 当GPIO设置成推挽输出时,硬件处是IO跟输入模式断开的,所以在此时设置软件上拉下拉是没有意义的。
- 另外值得注意的是如果配置为复用功能,输入/输出状态,完全由外设掌握,这时设置软件输入/输出状态也是没有意义的。
上面的程序中,我们知道PB13、PB14、PB15都被配置复用(SPI)功能,这时已经确定了PB13、PB15为输出,PB14为输入。那么答案就有了,推挽输出对PB13、PB15有效,对PB14无效,上拉配置对PB14有效,对PB13、PB15无效。