在PLC的编程调试中,首先是要对系统的输入/输出(IO)进行配置,也就是通常说的硬件组态。有了正确的IO分配,才能在编程的时候正确的读取信号的输入及控制信号的输出。因此,IO配置是PLC调试最基础也是最重要的工作。从这个方面来说,单片机的调试与PLC的调试有着异曲同工之妙。
对于单片机而言,GPIO引脚的配置是很基础也是很重要的。错误的引脚配置非但不能实现想要的功能,而且出错时往往不容易查找,耽误调试的时间。这就需要编程调试人员对GPIO引脚的配置有很好的理解。今天这篇文章,我们就来谈谈STM32Fxx系列单片机引脚的复用功能(Alternate Function)。
STM32Fxx系列单片机的GPIO引脚可以配置为浮空输入(Input Floating)、上拉输入(Input Pull-up)、下拉输入(Input Pull-down)、模拟量(Analog)、开漏输出(Output Open-drain)、推挽输出(Output Push-pull)、复用开漏(Alternate function open-drain)输出和复用推挽(Alternate function push-pull)输出等八种模式。
先来介绍下开漏输出和推挽输出的区别:
STM32Fxx系列单片机的输出电路有两个MOS管:P-MOS和N-MOS。
在开漏输出模式下,P-MOS管不工作,只有N-MOS管起作用。若输出数据寄存器的值为0,则N-MOS导通,IO口输出低电平;若输出数据寄存器的值为1,则N-MOS截止;由于P-MOS不工作,此时IO口既不是高电平,也不是低电平,这种状态被称为高阻态。
在推挽输出模式下,若输出数据寄存器的值为0,则N-MOS导通,P-MOS截止,IO口输出低电平;若输出数据寄存器的值为1,则N-MOS截止,P-MOS导通,IO口输出高电平;
我们知道STM32Fxx单片机还有复用开漏输出和复用推挽输出,它们和上面讲到的(普通)开漏输出和(普通)推挽输出有什么区别呢?
这就涉及到针脚的复用功能。
我们知道,STM32Fxx内部集成了很多的外设控制器,比如USART、SPI、bxCAN等等,这些外设控制器,也需要通过引脚与外设连接。复用功能是相对于单片机的引脚而言的。所谓“复用功能”,是指单片机的引脚既可以做普通GPIO使用,也可以作为内部外设控制器的引脚来使用。
比如我们来看看STM32F103xx单片机的PA5引脚,如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/aa6554bf80b6d146fc75c093c1fa84e0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/344d7cf7d4ba089ea02d084cf53f271d.png)
首先,PA5可以做为普通GPIO来使用;其次,如果作为外设的引脚,它可以作为SPI1的时钟(SPI1_SCK)、DAC的输出通道1(DAC_OUT1)或者ADC的输入通道5(ADC12_IN5)。
PA5支持的三种外设(SPI1、DAC、ADC)在同一时刻只能选择一种,选择的方法是开启相应外设的时钟,并使其它外设的时钟保持关闭状态。如果PA5被配置为复用功能,但是没有开启它支持的任何外设的时钟,它的输出是不确定的。
复用推挽输出和(普通)推挽输出在输出的时候均使用两个MOS管(P-MOS和-MOS),其输出电路是相同的。区别在于控制输出的信号来源:(普通)推挽输出控制MOS管的信号来自输出数据寄存器,而复用推挽输出的控制信号来自单片机的内置外设控制器(比如SPI1)。
复用开漏输出和(普通)开漏输出的道理是一样的。
下面这张图,是普通GPIO输出的引脚配置图,可以看到其输出信号来自输出数据寄存器(Output data register):
![](https://i-blog.csdnimg.cn/blog_migrate/cae05225f0e876dc613abcfd71360366.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e8617c7f034aca722716dd9dddc0e7d8.png)
下面这张图,是选择复用功能后的引脚配置图,可以看到其输出信号来自芯片内置的外设控制器:
![](https://i-blog.csdnimg.cn/blog_migrate/a05e1bebd4a2ddee16b0a2f855f852cd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a92b3ed1deb979746374060e9f083ae3.png)
注:虽然复用模式的控制信号来自内置外设控制器,但是单片机(CPU)依然可以读取相应的数据。在复用推挽输出模式下,单片机可以通过读取输出数据寄存器(Output Data Register)的数据来获取上次输出的值;在复用开漏输出的模式下,单片机可以通过读取输入数据寄存器(Input Data Register)的值来获取引脚的状态。
好了,关于STM32Fxx系列单片机引脚的复用功能就先聊到这里。关于引脚的配置还有一个重定位(Remap)的功能,我们以后再聊。