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 爲輸入模式。

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