ARM基础相关寄存器的讲解-LPC21XX

一:通用输入/输出端口 GPIO

1:特性
(1 )可以独立控制每个 GPIO 口的方向(输入/输出模式);
(2 )可以独立设置每个 GPIO 口的输出状态(高/低电平);
(3 )所有 GPIO 口在复位后默认为输入状态。
2:LPC2114 / 2124 系列 GPIO 描述
在这里插入图片描述


二: 引脚功能选择寄存器PINSELn(n=0 ,1,2)

1:引脚连接模块寄存器映射
在这里插入图片描述
2: 引脚功能选择寄存器 0 ( PINSEL0 )
在这里插入图片描述
3: 引脚功能选择寄存器 1 ( PINSEL1 )
在这里插入图片描述
4: 引脚功能选择寄存器 2 ( PINSEL2 )
在这里插入图片描述
在这里插入图片描述
5:总结
在这里插入图片描述

PINSELx 寄存器中,每 2 位控制了一个引脚的功能选择,每个引脚的四个功能选择分别对应于这两位的 00 、01 、 10 、
11 四个值,而当设置为 00 时,这个引脚总是 GPIO 功能。

例子补充:
在这里插入图片描述
分析:
1:P0.8,P0.9是属于PINSEL0寄存器
2:P0.8,P0.9对应[16,19]位
3:TxD1,RxD1对应01 01
在这里插入图片描述
整个思考过程:
1:通过二进制进行表示
①:P0.8,P0.9对应[16,19]位

0000 0000 0000 **0000**  0000 0000 0000 0000  

②:TxD1,RxD1对应01 01

0000 0000 0000 **0101**  0000 0000 0000 0000 

2:通过十六进制进行表示

PINSEL0=0x05<<16// (0101对应16进制0x05;0x05左移16位就可以得到这个数)

3:改进
在这里插入图片描述
①:(PINSEL0&FFF0FFFF)

这个的意思就是不管PINSEL0的结果如何,在[16,19]位上的值必为0(这也是为什么使用与逻辑的原因:只要有一个为0即整个结果为0),PINSEL0初始值上的其他位也不会受到任何影响,开发者只关心对应位即可。

②:(PINSEL0&FFF0FFFF)|(0x05<<16)

这个意思就是把自己应该关心的位上的二进制数进行或运算,为什么进行或运算,其实很容易理解吧,在上面已经讲解了左面相关位上的值是为0的,现在我只需看右面的值,只有右面有一位为1,即该位为1,上面我们已经计算出右面的值为[16,19]对应为01,01,进行或运算后还是01,01。


三:GPIO原理图

在这里插入图片描述
在这里插入图片描述


四:GPIO 相关寄存器的详细说明

1:使用前提
(使用前提:当PINSELx为00时使用GPIO功能)
在这里插入图片描述
2:GPIO 相关寄存器
在这里插入图片描述
3:IOnPIN引脚值寄存器
在这里插入图片描述
4:IOxDIR 方向寄存器
在这里插入图片描述
5: IOxSET 输出置位寄存器
(使用前提当IOxDIR为输出方向时)
在这里插入图片描述
6: IOxCLR 输出清零寄存器
(使用前提当IOxDIR为输出方向时)
在这里插入图片描述
在这里插入图片描述

备注:当PINSELx为00时使用GPIO功能,这里是P0.0就是右第一位16进制表示为1100(1100=8+4=C)时,P0.0采用GPIO功能;当IO0DIR为1时为输出模式,当为0时无效,当IO0SET输出为1时为高电平,输出为0时无效。

在这里插入图片描述

备注:IONCLR当输出为1时输出低电平;而IO0SET恰恰相反,当输出为1时输出高电平,所以bak&0x000000F0这里采用与逻辑,P0.3 ~ P0.0本应该在右边第一位,为什么在第二位呢?,是因为获取bak的值是第P0.7 ~ P0.4 位上的值,所以这里采用右边第二位,进行运算后,再进行右移位,这样就做到采集P0.7 ~ P0.4上的值,然后赋值给P0.3~P0.0上进行输出操作。

在这里插入图片描述
在这里插入图片描述

总结:

通过下面的方式来操作一下设置相应寄存器
怎么给指定引脚输出高电平?

在LPC21XX中引脚在GPIO功能中对引脚进行操作,要先配置相应参数,比如第一步要设置GPIO功能,这个由PINSELN寄存器决定(设置00),然后规定该引脚是输入还是输出这个由IONDIR寄存器决定(1:输出,0:输入),如果是输出,输出是高电平还是低点平这个由IONSET(1:高;0:无效)和IONCLR(1:低;0:无效)决定。

栗子:给P0_19引脚输出高电平;
①:P0_19设为GPIO功能(通过查上面的表可知:P0_19在PINSEL1寄存器中)
在这里插入图片描述

指定位设为00(其实一般其他位没有设置除了GPIO功能外的功能,常常全设为0)

//【1】P0_19设为GPIO功能
PINSEL1=0x00000000;

②:由于是输出,设置IO0DIR寄存器相应位设为1(IO0DIR:P0_0~P0_31)
在这里插入图片描述
P0_19就是19位
//二进制

0000  0000   0000     1000  0000  0000   0000     0000 

//变为16进制

I0DIR=0x00080000;

//每次都像这样的话是不是有点复杂了呢(使用移步)
其实容易发现1000可以通过左移16位(0x08)得到
0x08<<16

I0DIR=0x08<<16;

但是这里没有任何限制,所以直接就把I0DIR设为全1状态

//【2】设置P0_19为输出功能
I0DIR=0xFFFFFFFF;

③:输出高电平(IONSET寄存器上相应位设为1)
在这里插入图片描述
和上面一样(但是这里最好指定好对应位)
//二进制

0000  0000   0000     1000  0000  0000   0000     0000 

16进制
//变为16进制

IO0SET=0x00080000;

0x08<<16

IO0SET=0x08<<16;
3】将P0_19设为输出高电平
IO0SET=0x01<<19;

使用 GPIO 注意要点:

(1 )引脚设置为输出方式时,输出状态由 IOxSET 和 IOxCLR 中最后操作的寄存器决定。
(2 )大部分 GPIO输出为推挽方式(个别引脚为开漏输出),正常拉出/灌入电流均为 4mA (短时间极限值 40mA )。
(3 )复位后默认所有 GPIO 为输入模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章