stm32的引脚有两种用处:GPIO(general purpose io)和AFIO(alternate funcTIon io)
关于一些引脚(视芯片而定),这两种用处都没有,如在64脚产品中,OSC_IN/OSC_OUT与作为GPIO端口的PD0/PD1共用相同的引脚,而在100、144引脚产品中,这四个功用各有引脚与之对应,不互相抵触,所以OSC_IN/OSC_OUT既不作GPIO也不作AFIO,当然,这样的引脚不是评论要点。
1、引脚的装备
不论是作GPIO仍是做AFIO,都要对引脚进行装备。在固件库函数中,用GPIO_Init()函数对引脚进行装备,并不是说这个函数带了“GPIO”字样便是要作为GPIO来用,而是把它归入GPIO的领域来评论。
所谓装备,便是引脚上的片上资源衔接方法,如上拉电阻、密特触发等等。理解了装备,也就能理解装备与形式的差异。
特别得,鄙人文中将会专门评论一下输出装备中的推挽与开漏。
2、复用功用
复用功用有两种:没有重映像、重映像(包含部分重映像、彻底重映像),运用引脚用作AFIO功用,相同需求对其进行装备。
这三句话来自参考手册,但我对榜首句和留意有疑问,第三节讲。假如把端口装备成复用输出功用,则引脚和输出寄存器断开,并和片上外设的输出信号衔接。输入装备则与GPIO没有差异。
为什么输出形式有专门的复用形式而输入则没有呢。由于输出是由芯片内部电路驱动的,有必要挑选这个驱动来自哪一个外设,是GPIO仍是复用此管脚的其他外设,也便是挑选该管脚在内部是与哪个外设相连的,不阐明这个就会产生信号的紊乱。而输入则不同了,输入信号是由芯片外的信号驱动的,尽管该信号进入芯片内部后或许有不同的去向,但不需求对此进行装备,由于不会产生信号的抵触,最坏的状况便是多驱动了个寄存器罢了。事实上,当将引脚作为GPIO输入时,相应的AFIO外设是处在封闭的状况,并不会耗电;当引脚作为AFIO的输入时,或许GPIO是读不进来的,这是我猜的,没有验证,能不能读进来无所谓的,不必纠结于此。
若挑选了复用,则默许是没有重映像的,能够直接运用外设,不需求再软件做设置。
但若要重映射,则需求简略设置一下,
先要装备重映射后对应的管脚,可参看参考手册或数据手册引脚界说章节,开AFIO时钟,使能重映射。例如重映射USART1,悉数代码如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
/*对寄存器AFIO_EVCR,AFIO_MAPR和AFIO_EXTICRX进行读写操作前,即重映射和挑选外部中断线前,应当首要翻开AFIO的时钟*/
/* Configure USART1 Tx (PA.09) as alternate funcTIon push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure USART1 Rx (PA.10) as input floaTIng */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
这就完成了IO口的装备和重映射,下边再装备相关的外设(USART1)就能够运用了。
外部中断线也是能够映射的,而且需求开AFIO时钟,不必GPIO_PinRemap函数,用GPIO_EXTILineConfig重映射引脚到中断线。其实与其说是映射,不如说是挑选,挑选引脚衔接到外部中断线。
重映射不是恣意的,只能重映射到指定的管脚。
3、关于第二节讲到那个疑问,为甚么不能装备成模仿输入?模仿输入与浮空什么差异?
答案是能够装备成模仿输入,官方3.5版固件库比如和alientek例程都是将ADC输入引脚装备成GPIO_Mode_AIN
那么装备成浮空行么,还能ADC么?
//例程
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//修正
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
试验证明,这两种装备都能完成ADC。那么USART的Tx应装备成GPIO_Mode_IN_FLOATING,假如装备成GPIO_Mode_AIN,还能承受数据么?金牛板试验结果是不能,ST不我欺也。总归:
能够将引脚装备成模仿输入,运用相应的复用功用;
浮空与模仿这两种装备是不同的。
关于第二节里那个“留意“,我也不知道是什么意思。我猜想是这样的:翻开某外设,这个外设将某引脚作为输入,咱们偏偏把这个引脚装备为GPIO输出,这样能够操作GPIO来”诈骗“这个外设,这种用法应该是很奇妙的。
4、推挽与开漏
不仅仅stm32有这种装备,实际上,这两种现已广泛应用在许多场合。
推挽,又叫做推拉,是个很形象的姓名,一般是指两个三极管(MOS管)分别受两互补信号(或许一个信号,可是用互补对管)的操控,总是在一个三极管导通的时分另一个截止,这样的电路被称为推挽式(互补式):
这种电路在放大中通常被用作输出级,在STM32中,推挽装备便是这种,如图:
在相应方位1时,P-MOS导,通N-MOS截止,输出电压为VDD;在相应方位0时,N-MOS导通,P-MOS截止,输出电压为VSS,这便是所谓的推挽。是比较简略的。
而所谓的开漏(对三极管而言是开集,相同的原理),则要奇妙一些。所谓开漏电路概念中说到的“漏”便是指MOS FET的漏极。同理,开集电路中的“集”便是指三极管的集电极。开漏电路便是指以MOS FET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完好的开漏电路应该由开漏器材和开漏上拉电阻组成。
关于stm32,开漏便是失能了P-MOS,这样,当相应方位1时,引脚实际上是处在了浮空的状况,而经过外接的上拉电阻,将其拉高。
这么做有如下的优点:
1、能够将多个开漏输出的引脚,衔接到一条线上。构成“与逻辑”联系。当多个引脚恣意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判别总线占用状况的原理。在我的文章“stm32模仿iic——引脚装备、代码”中,还会说到这个问题。
2、 能够使用改动上拉电源的电压,改动传输电平。这样咱们就能够用低电平逻辑操控输出高电平逻辑了。想想最初以为stm32输出3.3v电压带不动IRF540,就直接断定要从头选型,是过错的主意,只要将推挽输出变为开漏,再加上上拉到5v的电阻,就能处理这个问题。
趁便一提,上拉电阻的阻值决议了逻辑电平转化的沿的速度。阻值越大,速度越低功耗越小。反之亦然。