STM32---GPIO

GPIO原理:

肖特基触发器:把模拟信号转为数字信号,即把信号变陡峭

  • I/O端口默认被配置成浮空输入模式
  • 配置为模拟输入模式时:
    • 斯密特TTL被禁止,读取输入数据寄存器时数值恒为0;
    • 弱上拉和下拉电阻被禁止

  • 开漏输出模式下输入寄存器依然有效,实现真正的双向I/O功能
    • 在推挽模式时,读输出数据寄存器时可得到最后一次写的值
    • 开漏模式时,读输入数据寄存器时可得到I/O口状态

  • <参考手册8.1.11 外设的GPIO配置>

GPIO配置指南:

  1. 输入/输出: GPIOx_CRL共32位,每4位可控制一个引脚,如下面4位用来控制pin0

    MODEx决定了输入/输出模式:
    MODEx>0时(三个值分别代表不同速率),为输出;
    MODEx=0时,为输入;
  2. 设置模式:首先由第一步确定了输入/输出模式,再由CNFx决定模式
  3.  写/读 : 

    • 写:GPIOx_ODR,0-15位,分别控制16个引脚的电平,写1高(例:写0x01到GPIOx_ODR则设置引脚0为高)
    • 读:GPIOx_IDR, 0-15位,分别保存16个引脚的电平状态,readOnly(例:读到0x01则引脚0为高)!?模拟输入时,GPIOx_IDR读不到状态

8种模式详解:

推挽输出&开漏输出

开漏输出的优点:

1.利用外部电路的驱动能力,减少IC内部的驱动;

2.可以将多个开漏输出的Pin,连接到一条线上。形成 “与逻辑” 关系。如果是推挽输出显然是不行的,因为假如你把要”与”的I/O口都挂到一条线上,那么在一些高一些低的情况下显然会烧掉场效应管(原因是两个场效应管直接连通了,联想上面的模型去想吧)

3.可以利用改变上拉电源的电压,改变传输电平。比如你想这个I/O口输出3.3V电平,那么只需要把上拉电平设为3.3V就OK了撒!这个5V的51单片机也可以输出3.3V电平了,呵呵!但前提是用P0口哈!

开漏输出的缺点:

1.输出电流低,因为上拉电阻一般取的比较大(为了减少静态功耗),所以驱动力不足,而推挽输出用的是场效应管,当然驱动能力强了.

2. 带来上升沿的延时,因为上升沿是通过外接上拉无源电阻对负载充电的,当电阻选择小时延时就小、但功耗大,反之延时大功耗小。

推挽输出的优点:

1.驱动能力强,因为用的是场效应管,当然驱动能力强了.

2.真正的双向口

推挽输出的缺点:

1.不能把两个都是推挽输出的CMOS门级相连,这样当一高一低时很容易因功耗过大烧管子,推挽输出一般用于驱动.

关于双向口与准双向口

双向口:高电平/低电平/高阻态

准双向口:高电平/低电平

 

输入

模拟输入:用于ADC

上拉输入:弱上拉,默认高电平,不过因为弱,可以被外界拉低或升高

下拉输入:弱下拉,默认低电平,不过因为弱,可以被外界拉低或升高

浮空输入:引脚“悬空”,电平不确定,由外界决定

 位带操作:

0x2000_0000‐0x200F_FFFF(SRAM 区中的
0x4000_0000‐0x400F_FFFF(片上外设区中的最低1MB)

系统把以上两个区域的映射到某一特殊区域的一个32个位,4个字节

如0x2000_0000这一字节中的第0位被映射到了0x22000000这个字(4个字节)

看上去像是:原始区域一位一位地对应到映射区的4个字节4个字节

获得映射后地址的公式

AliasAddr = 0x22000000 + ((A‐0x20000000)*8+n)*4 =0x22000000 + (A‐0x20000000)*32 + n*4 

(例0x20000000的第1位:A=0x20000000,n=1,则计算的AliasAddr=0x22000004)

AliasAddr = 0x42000000 + ((A‐0x40000000)*8+n)*4 = 0x42000000 + (A‐0x40000000)*32 + n*4

获得地址后,

u32 *Px1=(volatile unsigned long  *)AliasAddr

则*Px1代表源区域的某1位,为*Px1赋值时,看该值的末尾是1还是0来决定最终映射值。

使用预编译简化求地址操作:参考<<CM3权威指南>>第五章(87页~92页).

posted @ 2014-03-20 00:24  熄灯就睡  阅读(663)  评论(0编辑  收藏  举报