GPIO簡介
I/O 也稱為 General Purpose Input Output (通用輸入/輸出)簡稱為 GPIO、 I/O,是單片機通用輸入輸出介面的總稱,通常情況下單片機的計算單元通過向 I/O 控制暫存器寫入資料可以控制 I/O 口輸入輸出模式,實作對某些設備的控制或信號采集的功能,若將通用 I/O 進行組合配置可以實作較為復雜的總線控制介面和串行通信介面,
CC2530 的 I/O 用作通用 I/O 時,引腳可以組成 3 個 8 位埠,埠 0、埠 1 和埠 2,表示為P0、 P1 和 P2,其中, P0 和 P1 是完全的 8 位埠,而 P2 僅有 5 位可用,所有的埠均可以通過 SFR暫存器 P0、 P1 和 P2 位尋址和位元組尋址,每個埠引腳都可以單獨設定為通用 I/O 或外部設備 I/O,
暫存器介紹
CC2530的通用I/O埠相關的常用暫存器有下面4個:
(x表示埠)
PxSEL:埠功能選擇,設定埠是通用I/O還是外設功能,

PxDIR:作為通用I/O時,用來設定資料的傳輸方向,

PxINP:作為通用輸入埠時,選擇輸入模式是上拉、下拉還是三態,

Px:資料埠,用來控制埠的輸出或獲取埠的輸入,
C語言對暫存器位操作
1.某些位清0而不影響其他位
使用“&=”將暫存器指定位清0,同時不影響其他位的值,
例如:暫存器P0SEL的當前值是0x00,現需要將該暫存器的第1位、第3 位和第5位設定為0,同時不能影響該暫存器其他位的值,那么,在C語言中應該怎么撰寫代碼呢?
首先將位元組 0000 0000 中要操作的位設定為1,即0010 1010,在將該數值取反,即1101 0101,也就是~0x2A,再將該值與暫存器P1SEL“相與”,那么有0的位,即1、3、5位將被清0,其余的位會保持原來的值不變,
正確寫法:P0SEL &= ~0x2A;
對于暫存器的第n位的清0操作也可以寫成:暫存器 &= ~(0x01<<(n));其道理是一樣的,
2.某些位置1而不影響其他位
使用“|=”將暫存器指定位置1,同時不影響其他位的值
例如:暫存器P1SEL的當前值是0x6c,現需要將該暫存器的第1位、第4位和第5位設定為1,同時不能影響該暫存器其他位的值,那么,在C語言中應該怎么撰寫代碼呢?
首先將位元組 0000 0000 中要操作的位設定為1,即0011 0010,也就是0x32, 再將該值與暫存器P1SEL“相或”,那個有1的位,即1、4、5位將被設定為1,其余的位會保持原來的值不變,
正確寫法:P1SEL |= 0x32;
對于暫存器的第n位的清0操作也可以寫成:暫存器 |= (0x01<<(n));
通用I/O埠暫存器配置的基本思路
(LED燈接在P1_0、P1_1)
設定P0SEL暫存器,將P1_0、P1_1設定為通用I/O埠,
設定P0DIR暫存器,將P1_0和P1_1設定為輸出,
設定I/O輸出高電平或者低電平(0點亮/1熄滅)
代碼實作
void LED_init(void)
{
P1SEL&= ~(0x03<<0); //設定P1_0,P1_1為通用I/O
P1DIR |= (0x03<<0); //設定P1.0 P1.1為輸出
P1_0=0; //P1_0點亮
P1_1=1; //P1_1熄滅
}
主函式呼叫LED_init()函式就可以實作點亮燈,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289689.html
標籤:其他
上一篇:[iOS開發]-自定義cell
