GPIO原理:
肖特基触发器:把模拟信号转为数字信号,即把信号变陡峭
- I/O端口默认被配置成浮空输入模式
- 配置为模拟输入模式时:
- 斯密特TTL被禁止,读取输入数据寄存器时数值恒为0;
-
弱上拉和下拉电阻被禁止
- 开漏输出模式下输入寄存器依然有效,实现真正的双向I/O功能
- 在推挽模式时,读输出数据寄存器时可得到最后一次写的值
-
开漏模式时,读输入数据寄存器时可得到I/O口状态
- <参考手册8.1.11 外设的GPIO配置>
GPIO配置指南:
- 输入/输出: GPIOx_CRL共32位,每4位可控制一个引脚,如下面4位用来控制pin0
MODEx决定了输入/输出模式:
当MODEx>0时(三个值分别代表不同速率),为输出;
当MODEx=0时,为输入; - 设置模式:首先由第一步确定了输入/输出模式,再由CNFx决定模式
-
写/读 :
- 写: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页).