stm32 gpio使用超强总结-皇冠最新app版本

×
单片机 > 单片机程序设计 > 详情

stm32 gpio使用超强总结

发布时间:2024-08-26 发布时间:
|

stm32 gpio使用超强总结
stm32gpio使用
操作步骤:

1. 使能gpio对应的外设时钟
例如://使能gpioa、gpiob、gpioc对应的外设时钟
rcc_apb2periphclockcmd(rcc_apb2periph_gpioa |rcc_apb2periph_gpiob | rcc_apb2periph_gpioc , enable);
2. 声明一个gpio_initstructure结构体 
例如:
gpio_inittypedef gpio_initstructure;
3. 选择待设置的gpio管脚
例如://选择待设置的gpio第7、8、9管脚位 ,中间加“|”符号
gpio_initstructure.gpio_pin = gpio_pin_7 |gpio_pin_8 | gpio_pin_9;
4. 设置选中gpio管脚的速率
例如://设置选中gpio管脚的速率为最高速率2mhz
gpio_initstructure.gpio_speed = gpio_speed_2mhz;//最高速率2mhz
5. 设置选中gpio管脚的模式
例如://设置选中gpio管脚的模式为开漏输出模式gpio_initstructure.gpio_mode= gpio_mode_out_od; //开漏输出模式


6. 根据gpio_initstructure中指定的参数初始化外设gpiox


例如: gpio_init(gpioc, &gpio_initstructure);


7.其他应用


例: 将端口gpioa的第10、15脚置1(高电平) 


gpio_setbits(gpioa,gpio_pin_10 | gpio_pin_15);


例:将端口gpioa的第10、15脚置0(低电平) 


gpio_resetbits(gpioa,gpio_pin_10 | gpio_pin_15);


gpio寄存器:


寄存器   描述


crl        端口配置低寄存器  


crh        端口配置高寄存器  


idr         端口输入数据寄存器  


odr       端口输出数据寄存器 


bsrr      端口位设置/复位寄存器 


brr        端口位复位寄存器 


lckr      端口配置锁定寄存器  


evcr      事件控制寄存器  


mapr     复用重映射和调试 


i/o          配置寄存器


exticr   外部中断线路0-15配置寄存器


gpio库函数:


函数名                                           描述  


gpio_deinit                      将外设gpiox寄存器重设为缺省值


gpio_afiodeinit               将复用功能(重映射事件控制和exti设置)重设为缺省值 


gpio_init                          根据gpio_initstruct中指定的参数初始化外设gpiox寄存器


gpio_structinit                  把gpio_initstruct中的每一个参数按缺省值填入 


gpio_readinputdatabit    读取指定端口管脚的输入  


gpio_readinputdata         读取指定的gpio端口输入  


gpio_readoutputdatabit 读取指定端口管脚的输出  


gpio_readoutputdata      读取指定的gpio端口输出  


gpio_setbits                      设置指定的数据端口位  


gpio_resetbits                  清除指定的数据端口位  


gpio_writebit                    设置或者清除指定的数据端口位  


gpio_write                       向指定gpio数据端口写入数据  


gpio_pinlockconfig          锁定gpio管脚设置寄存器  


gpio_eventoutputconfig   选择gpio管脚用作事件输出  


gpio_eventoutputcmd      使能或者失能事件输出  


gpio_pinremapconfig       改变指定管脚的映射  


gpio_extilineconfig          选择gpio管脚用作外部中断线路


库函数: 函数gpio_deinit


功能描述:将外设gpiox寄存器重设为缺省值 例:


gpio_deinit(gpioa);


函数gpio_afiodeinit


功能描述:将复用功能(重映射事件控制和exti设置)重设为缺省值 例:


gpio_afiodeinit();


函数gpio_init


功能描述:根据gpio_initstruct中指定的参数初始化外设gpiox寄存器 例:


gpio_inittypedefgpio_initstructure; 


 gpio_initstructure.gpio_pin= gpio_pin_all;  


gpio_initstructure.gpio_speed= gpio_speed_10mhz;  


gpio_initstructure.gpio_mode= gpio_mode_in_floating;  


gpio_init(gpioa,&gpio_initstructure);


 


 


gpio_inittypedefstructure


gpio_inittypedef定义于文件“stm32f10x_gpio.h”: 


typedefstruct  {


u16gpio_pin;


gpiospeed_typedefgpio_speed;  


gpiomode_typedefgpio_mode;  


}


gpio_inittypedef;


gpio_pin


该参数选择待设置的gpio管脚,使用操作符“|”可以一次选中多个管脚。可以使用下表中的任意组合。 


gpio_pin_none:   无管脚被选中  


gpio_pin_x:          选中管脚x(0--15)


gpio_pin_all:        选中全部管脚


gpio_speed 


gpio_speed:


用以设置选中管脚的速率。 


gpio_speed_10mhz: 最高输出速率10mhz 


 gpio_speed_2mhz:  最高输出速率2mhz


gpio_speed_50mhz: 最高输出速率50mhz


gpio_mode


gpio_mode:


用以设置选中管脚的工作状态。 


gpio_mode_ain:                 模拟输入


gpio_mode_in_floating: 浮空输入  


gpio_mode_ipd:                 下拉输入


gpio_mode_ipu:                 上 拉输入  


gpio_mode_out_od:           开漏输出  


gpio_mode_out_pp:             推挽输出  


gpio_mode_af_od:            复用开漏输出  


gpio_mode_af_pp:             复用推挽输出


函数gpio_structinit


功能描述:把gpio_initstruct中的每一个参数按缺省值填入 例:


gpio_inittypedefgpio_initstructure;  


gpio_structinit(&gpio_initstructure); 


gpio_initstruct:


gpio_pin:gpio_pin_all  


gpio_speed:gpio_speed_2mhz 


 gpio_mode:gpio_mode_in_floating


函数gpio_readinputdatabit


功能描述:读取指定端口管脚的输入 


例:


u8readvalue;


readvalue= gpio_readinputdatabit(gpiob, gpio_pin_7);


函数gpio_readinputdata


功能描述:读取指定的gpio端口输入


例:


u16readvalue;


readvalue= gpio_readinputdata(gpioc);


函数gpio_readoutputdatabit 


功能描述:读取指定端口管脚的输出 


例:


u8readvalue;


readvalue= gpio_readoutputdatabit(gpiob, gpio_pin_7);


函数gpio_readoutputdata


功能描述:读取指定的gpio端口输出 


例:


u16readvalue;


readvalue= gpio_readoutputdata(gpioc);


函数gpio_setbits


功能描述:置位指定的数据端口位


例: 将端口gpioa的第10、15脚置1(高电平) 


gpio_setbits(gpioa,gpio_pin_10 | gpio_pin_15);


函数gpio_resetbits


功能描述:清除指定的数据端口位


例:将端口gpioa的第10、15脚置0(低电平)


gpio_resetbits(gpioa,gpio_pin_10 | gpio_pin_15);


函数gpio_writebit


功能描述:设置或者清除指定的数据端口位 


例:


gpio_writebit(gpioa,gpio_pin_15, bit_set);


函数gpio_write


功能描述:向指定gpio数据端口写入数据 


例:


gpio_write(gpioa,0x1101);


函数gpio_pinlockconfig


功能描述:锁定gpio管脚设置寄存器 


例:


gpio_pinlockconfig(gpioa,gpio_pin_0|gpio_pin_1);


函数gpio_eventoutputconfig


功能描述:选择gpio管脚用作事件输出 例:


gpio_eventoutputconfig(gpio_portsourcegpioe,gpio_pinsource5);


gpio_portsource


gpio_portsource用以选择用作事件输出的gpio端口。


函数gpio_eventoutputcmd


功能描述:使能或者失能事件输出 例:


gpio_eventoutputconfig(gpio_portsourcegpioc,gpio_pinsource6);  


gpio_eventoutputcmd(enable);


函数gpio_pinremapconfig


功能描述:改变指定管脚的映射例:


gpio_pinremapconfig(gpio_remap_i2c1,enable);


一.gpio概述


1、共有8种模式,可以通过编程选择:


1. 浮空输入       2. 带上拉输入      3. 带下拉输入      4. 模拟输入


5. 开漏输出——(此模式可实现hotpower说的真双向io)       6. 推挽输出


7. 复用功能的推挽输出    8. 复用功能的开漏输出


模式7和模式8需根据具体的复用功能决定。      


2、专门的寄存器(gpiox_bsrr和gpiox_brr)实现对gpio口的原子操作,即回避了设置或清除i/o端口时的“读-修改-写”操作,使得设置或清除i/o端口的操作不会被中断处理打断而造成误动作。


3、每个gpio口都可以作为外部中断的输入,便于系统灵活设计。


4、i/o口的输出模式下,有3种输出速度可选(2mhz、10mhz和50mhz),这有利于噪声控制。这个速度是指i/o口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在i/o口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的emi性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。  


   4.1各种接口的措施:     


      4.1.1对于串口,假如最大波特率只需115.2k,那么用2m的gpio的引脚速度就够了,既省电也噪声小。


     4.1.2对于i2c接口,假如使用400k波特率,若想把余量留大些,那么用2m的gpio的引脚速度或许不够,这时可以选用10m的gpio引脚速度。


     4.1.3对于spi接口,假如使用18m或9m波特率,用10m的gpio的引脚速度显然不够了,需要选用50m的gpio的引脚速度。


   4.2 gpio口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。   


   4.3 在复位期间和刚复位后,复用功能未开启,i/o端口被配置成浮空输入模式。  


   4.4 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。  


   4.5 gpio口的配置具有上锁功能,当配置好gpio口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。


5、所有i/o口兼容cmos和ttl,多数i/o口兼容5v电平。


6、大电流驱动能力:gpio口在高低电平分别为0.4v和vdd-0.4v时,可以提供或吸收8ma电流;如果把输入输出电平分别放宽到1.3v和vdd-1.3v时,可以提供或吸收20ma电流。


7、具有独立的唤醒i/o口。


8、很多i/o口的复用功能可以重新映射。


9、gpio口的配置具有上锁功能,当配置好gpio口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。此功能非常有利于在程序跑飞的情况下保护系统中其他的设备,不会因为某些i/o口的配置被改变而损坏——如一个输入口变成输出口并输出电流。


二.推挽结构


一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.要实现线与需要用oc(opencollector)门电路 .如果输出级的有两个三极管,始终处于一个导通、一个截止的状态,也就是两个三级管推挽相连,这样的电路结构称为推拉式电路或图腾柱(totem- pole)输出电路(可惜,图无法贴上)。当输出低电平时,也就是下级负载门输入低电平时,输出端的电流将是下级门灌入t4;当输出高电平时,也就是下级负载门输入高电平时,输出端的电流将是下级门从本级电源经 t3、d1 拉出。这样一来,输出高低电平时,t3 一路和 t4 一路将交替工作,从而减低了功耗,提高了每个管的承受能力。又由于不论走哪一路,管子导通电阻都很小,使rc常数很小,转变速度很快。因此,推拉式输出级既提高电路的负载能力,又提高开关速度。供你参考。


推挽电路是两个参数相同的三极管或mosfet,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小效率高。


输出既可以向负载灌电流,也可以从负载抽取电流


三.开漏电路


在电路设计时我们常常遇到开漏(open drain)和开集(open collector)的概念。所谓开漏电路概念中提到的“漏”就是指mosfet的漏极。同理,开集电路中的“集”就是指三极管的集电极。开漏电路就是指以mosfet的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。


组成开漏形式的电路有以下几个特点:


1. 利用 外部电路的驱动能力,减少ic内部的驱动。当ic内部mosfet导通时,驱动电流是从外部的vcc流经r pull-up,mosfet到gnd。ic内部仅需很下的栅极驱动电流。如图1。


2. 可以将多个开漏输出的pin,连接到一条线上。形成 “与逻辑” 关系。如图1,当pin_a、pin_b、pin_c任意一个变低后,开漏线上的逻辑就为0了。这也是i2c,smbus等总线判断总线占用状态的原理。


3. 可以利用改变上拉电源的电压,改变传输电平。如图2, ic的逻辑电平由电源vcc1决定,而输出高电平则由vcc2决定。这样我们就可以用低电平逻辑控制输出高电平逻辑了。     


4. 开漏pin不连接外部的上拉电阻,则只能输出低电平(因此对于经典的51单片机的p0口而言,要想做输入输出功能必须加外部上拉电阻,否则无法输出高电平逻辑)。     


5. 标准的开漏脚一般只有输出的能力。添加其它的判断电路,才能具备双向输入、输出的能力。


应用中需注意:


1.  开漏和开集的原理类似,在许多应用中我们利用开集电路代替开漏电路。例如,某输入pin要求由开漏电路驱动。则我们常见的驱动方式是利用一个三极管组成开集电路来驱动它,即方便又节省成本。如图3。


2. 上拉电阻r pull-up的 阻值 决定了 逻辑电平转换的沿的速度 。阻值越大,速度越低功耗越小。反之亦然。


push-pull输出就是一般所说的推挽输出,在cmos电路里面应该较cmos输出更合适,应为在cmos里面的push-pull输出能力不可能做得双极那么大。输出能力看ic内部输出极n管p管的面积。和开漏输出相比,push-pull的高低电平由ic的电源低定,不能简单的做逻辑操作等。 push-pull是现在cmos电路里面用得最多的输出级设计方式。  at91rm9200 gpio 模拟i2c接口时注意!!


四.oc、od


集电极开路门(集电极开路 oc 或源极开路od)


open-drain是漏极开路输出的意思,相当于集电极开路(open-collector)输出,即ttl中的集电极开路(oc)输出。一般用于线或、线与,也有的用于电流驱动。


open-drain是对mos管而言,open-collector是对双极型管而言,在用法上没啥区别。


开漏形式的电路有以下几个特点:


1.利用外部电路的驱动能力,减少ic内部的驱动。 或驱动比芯片电源电压高的负载.     2. 可以将多个开漏输出的pin,连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是i2c,smbus等总线判断总线占用状态的原理。如果作为图腾输出必须接上拉电阻。接容性负载时,下降延是芯片内的晶体管,是有源驱动,速度较快;上升延是无源的外接电阻,速度慢。如果要求速度高电阻选择要小,功耗会大。所以负载电阻的选择要兼顾功耗和速度。


3.可以利用改变上拉电源的电压,改变传输电平。例如加上上拉电阻就可以提供ttl/cmos电平输出等。


4.开漏pin不连接外部的上拉电阻,则只能输出低电平。一般来说,开漏是用来连接不同电平的器件,匹配电平用的。


5.正常的cmos输出级是上、下两个管子,把上面的管子去掉就是open-drain了。这种输出的主要目的有两个:电平转换和线与。      6.由于漏级开路,所以后级电路必须接一上拉电阻,上拉电阻的电源电压就可以决定输出电平。这样你就可以进行任意电平的转换了。


7.线与功能主要用于有多个电路对同一信号进行拉低操作的场合,如果本电路不想拉低,就输出高电平,因为open-drain上面的管子被拿掉,高电平是靠外接的上拉电阻实现的。(而正常的cmos输出级,如果出现一个输出为高另外一个为低时,等于电源短路。)


8.open-drain提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。


五.线或逻辑与线与逻辑
在一个结点(线)上, 连接一个上拉电阻到电源 vcc 或 vdd 和 n 个 npn 或 nmos 晶体管的集电极 c 或漏极 d, 这些晶体管的发射极 e 或源极 s 都接到地线上, 只要有一个晶体管饱和, 这个结点(线)就被拉到地线电平上.


因为这些晶体管的基极注入电流(npn)或栅极加上高电平(nmos),晶体管就会饱和, 所以这些基极或栅极对这个结点(线)的关系是或非 nor 逻辑. 如果这个结点后面加一个反相器, 就是或 or 逻辑.


注:个人理解:线与,接上拉电阻至电源。(~a)&(~b)=~(a b),由公式较容易理解线与此概念的由来 ;


如果用下拉电阻和 pnp 或 pmos 管就可以构成与非 nand 逻辑, 或用负逻辑关系转换与/或逻辑.


注:线或,接下拉电阻至地。(~a) (~b)=~(ab);


这些晶体管常常是一些逻辑电路的集电极开路 oc 或源极开路 od 输出端. 这种逻辑通常称为线与/线或逻辑, 当你看到一些芯片的 oc或 od 输出端连在一起, 而有一个上拉电阻时, 这就是线或/线与了, 但有时上拉电阻做在芯片的输入端内.


顺便提示如果不是 oc 或 od 芯片的输出端是不可以连在一起的, 总线 bus 上的双向输出端连在一起是有管理的, 同时只能有一个作输出, 而其他是高阻态只能输入



『本文转载自网络,皇冠最新app版本的版权归原作者所有,如有侵权请联系删除』

热门文章 更多
stm32问题记录:这回keil编译器背锅
网站地图