STM32有四种我们常见的输出模式,说是四种其实总共大类就两种,我们只需要熟练掌握 1.开漏输出和 2.推挽输出这两种模式就可以反推 剩余的两种(说白了就是复用了),而不同的输出模式可以匹配不同的输出场景,比如在需要高电平驱动硬件的前提下 我们需要使用推挽输出,而在需要更配合外部电路(可以理解为外部电路提供电压)的情况下我们多选开漏输出,接下来 我们开始详解这两种输出模式的不同, 逻辑顺序是从硬件电路到软件编程再到现象的浮现。
1.开漏输出
在上述图片的讲解下,我们知道开漏输出是没有高电平驱动能力的,你在设置开漏输出的情况下如果使用 GPIO_SetBits(GPIOx, GPIO_Pin_x)这个函数输出高电平到某个引脚,你会发现引脚是无法输出高电平的,这是开漏输出的弊端,但因此也引出了开漏输出的优点“灵活”,比如现在有一个外部电路提供了我们这个硬件所需要的电压 0~3.3v(这个范围内的一个值),我们就可以使用开漏输出,输出低电平来驱动硬件,你可以粗俗的理解为,在开漏模式下 我们输出低电平,这个低电平提供了“GND”。
2.推挽输出
从上述图片讲解中我们可以知道,推挽输出的好处拥有一定的驱动能力,在配置推挽输出的情况下,我们可以输出高电平来驱动硬件,而缺点就是无法进行线与“操作”。
3.编程
1.开漏输出
在上述代码中 我们初始化了GPIOC的13脚,并使用了开漏输出,把代码烧录进单片机后我们发现了一个奇怪的现象PC13指示灯为什么亮了?我们没有调用任何输出的函数呀?道理来说PC13灯是不会亮的呀? 这就要说到在默认条件下 推挽输出默认输出低电平,而PC13灯正好可以通过低电平驱动(下面的原理图有),这样我们就又学到了一个点 在标准库编程的前提下,我们不使用任何输出函数时,我们的开漏输出默认输出低电平。
我们再来验证第二个点 开漏输出没有驱动能力,即再开漏输出模式下,输出高电平时电路处于高阻态,无法输出3.3v高电平。 前提:我们在初始化A0口,并初始化开漏输出,在主函数中使用函数GPIO_SetBits(GPIOA, GPIO_Pin_0);输出高电平,然后把一个LED灯正极插在A0口,负极插在面包板的负极(不懂面包板原理的自行了解很简单的),而现象就是我们的灯没有亮,按照我们以前的理解LED小灯是会亮的,但没有亮就证明我们的理论是正确的,即再开漏输出模式下输出高电平时电路处于高组态,无法输出3.3v高电平。
2.推挽输出
我们配置推挽输出后发现,我们没有使用任何函数的情况下PC13灯又又又亮了,这就说明推挽输出和开漏输出是一样的,在默认条件下会输出低电平
继续验证我们推挽输出的理论,拥有一定的驱动能力,我们初始化了PA0口并设置为推挽输出,在这个前提下 我们的LED灯负极接面包板的负极,正极接单片机(跟开漏的是一个接法),我们发现LED小灯亮了,这也就证明了我们推挽输出有一定的驱动能力,同时和推挽输出形成了对比,因为推挽输出在相同的情况下是无法驱动灯亮的(即处于高阻态)