4、PIC32系列 GPIO介绍
PIC32系列 GPIO介紹
1、PIC32參考資源
2、GPIO寄存器介紹
3、使用寄存器配置IO口輸出LED閃爍
4、庫函數封裝定義
5、庫函數
6、實驗驗證
1、PIC32參考資源
PIC32系列參考手冊 中文版? 鏈接地址:PIC系列參考手冊-中文版 第12章IO端口.pdf
2、GPIO寄存器介紹
1、TRIS(三態)寄存器
TRIS寄存器用于配置通過IO端口引腳的數據方向。TRIS寄存器決定PORT I/O引腳是輸入還是輸出。
? TRIS 位設為 1 時,相應的 I/O 端口引腳配置為輸入。
? TRIS 位設為 0 時,相應的 I/O 端口引腳配置為輸出。
? 讀 TRIS 寄存器時,將會讀取最后寫入 TRIS 寄存器的值。
? 上電復位之后,所有 I/O 端口引腳都定義為輸入。
2、PORT 寄存器
PORT 寄存器用于訪問 (讀取) I/O 引腳。
? 寫 PORT 寄存器時,數據將會寫入相應的 LAT 寄存器 (PORT 數據鎖存器)。那些配置為輸出的 I/O 端口引腳會被更新。
? 寫 PORT 寄存器實際上等同于寫 LAT 寄存器。
? 讀 PORT 寄存器時,將會讀取施加到端口 I/O 引腳的同步信號。
3、LAT 寄存器
LAT 寄存器 (PORT 數據鎖存器)用于保存寫入端口 I/O 引腳的數據。
? 寫 LAT 寄存器時,會將數據鎖存到相應的端口 I/O 引腳。那些配置為輸出的 I/O 端口引腳會被更新。
? 讀 LAT 寄存器時,將會讀取 PORT 數據鎖存器中保存的數據,而不是從端口 I/O 引腳讀取數據。
4、SET、CLR 和 和 INV I/O 端口寄存器
除 TRIS、PORT 和 LAT 基址寄存器外,每個端口模塊還有關聯的 SET(置 1)、CLR(清零)和 INV (取反)寄存器,用于提供原子級位操作并允許更快速的 I/O 引腳操作。正如寄存器名稱所示,向 SET、 CLR 或 INV 寄存器寫入值會有效地執行其名稱所示的操作,但只會修改相應的基址寄存器中指定為 1 的位。不會修改指定為 0 的位。
? 向 TRISASET 寄存器寫入 0x0001,只會將基址寄存器 TRISA 中的 bit 0 置 1
? 向 PORTDCLR 寄存器寫入 0x0020,只會將基址寄存器 PORTD 中的 bit 5 清零
? 向 LATCINV 寄存器寫入 0x9000,只會將基址寄存器 LATC 中的 bit 15 和 bit 12 取反
讀取 SET、CLR 和 INV 寄存器會返回未定義的值。要查看對 SET、CLR 或 INV 寄存器執行寫操作后的效果,必須讀取基址寄存器。
SET、CLR 和 INV 寄存器不限于 TRIS、PORT 和 LAT 寄存器。其他 I/O 端口模塊寄存器 ODC、CNEN 和 CNPUE 也具有這些位操作寄存器。
5、簡而言之
TRS寄存器:設置數字引腳輸入還是輸出,置1配為輸入(默認),清0配置為輸出;
LAT寄存器:寫端口值
POR寄存器:讀端口值
CLR寄存器:清零
SET寄存器:置1
INV寄存器:翻轉
端口組合
LATCSET |= (1<<0); //PORTC端口寄存器bit0置1
LATCCLR |= (1<<0); //PORTC端口寄存器bit0清0
LATCINV |= (1<<0); //PORTC端口寄存器bit0翻轉
3、使用寄存器配置IO口輸出LED閃爍
LED引腳端口RB0
TRISBCLR |= (1<<0); //設置RB0為輸出口; LATBCLR |= (1<<0); //輸出0;LED翻轉程序
int main(void) {TRISBCLR |= (1<<0); //設置RB0為輸出口;LATBCLR |= (1<<0); //輸出0;while(1){LATBINV |= (1<<0); //端口電平翻轉delay(1000); //延時1000ms} }4、庫函數封裝定義
1、端口定義
typedef enum {GPIO_PORT_A = 0,GPIO_PORT_B = 1,GPIO_PORT_C = 2,GPIO_PORT_D = 3,GPIO_PORT_E = 4,GPIO_PORT_F = 5,GPIO_PORT_G = 6, } GPIO_PORT;2、引腳定義
typedef enum {GPIO_PIN_RA0 = 0,GPIO_PIN_RA1 = 1,GPIO_PIN_RA2 = 2,GPIO_PIN_RA3 = 3,GPIO_PIN_RA4 = 4,GPIO_PIN_RA5 = 5,GPIO_PIN_RA6 = 6,GPIO_PIN_RA7 = 7,GPIO_PIN_RA9 = 9,GPIO_PIN_RA10 = 10,GPIO_PIN_RA14 = 14,GPIO_PIN_RA15 = 15,GPIO_PIN_RB0 = 16,GPIO_PIN_RB1 = 17,GPIO_PIN_RB2 = 18,GPIO_PIN_RB3 = 19,GPIO_PIN_RB4 = 20,GPIO_PIN_RB5 = 21,GPIO_PIN_RB6 = 22,GPIO_PIN_RB7 = 23,GPIO_PIN_RB8 = 24,GPIO_PIN_RB9 = 25,GPIO_PIN_RB10 = 26,GPIO_PIN_RB11 = 27,GPIO_PIN_RB12 = 28,GPIO_PIN_RB13 = 29,GPIO_PIN_RB14 = 30,GPIO_PIN_RB15 = 31,GPIO_PIN_RC1 = 33,GPIO_PIN_RC2 = 34,GPIO_PIN_RC3 = 35,GPIO_PIN_RC4 = 36,GPIO_PIN_RC12 = 44,GPIO_PIN_RC13 = 45,GPIO_PIN_RC14 = 46,GPIO_PIN_RC15 = 47,GPIO_PIN_RD0 = 48,GPIO_PIN_RD1 = 49,GPIO_PIN_RD2 = 50,GPIO_PIN_RD3 = 51,GPIO_PIN_RD4 = 52,GPIO_PIN_RD5 = 53,GPIO_PIN_RD6 = 54,GPIO_PIN_RD7 = 55,GPIO_PIN_RD8 = 56,GPIO_PIN_RD9 = 57,GPIO_PIN_RD10 = 58,GPIO_PIN_RD11 = 59,GPIO_PIN_RD12 = 60,GPIO_PIN_RD13 = 61,GPIO_PIN_RD14 = 62,GPIO_PIN_RD15 = 63,GPIO_PIN_RE0 = 64,GPIO_PIN_RE1 = 65,GPIO_PIN_RE2 = 66,GPIO_PIN_RE3 = 67,GPIO_PIN_RE4 = 68,GPIO_PIN_RE5 = 69,GPIO_PIN_RE6 = 70,GPIO_PIN_RE7 = 71,GPIO_PIN_RE8 = 72,GPIO_PIN_RE9 = 73,GPIO_PIN_RF0 = 80,GPIO_PIN_RF1 = 81,GPIO_PIN_RF2 = 82,GPIO_PIN_RF3 = 83,GPIO_PIN_RF4 = 84,GPIO_PIN_RF5 = 85,GPIO_PIN_RF8 = 88,GPIO_PIN_RF12 = 92,GPIO_PIN_RF13 = 93,GPIO_PIN_RG0 = 96,GPIO_PIN_RG1 = 97,GPIO_PIN_RG2 = 98,GPIO_PIN_RG3 = 99,GPIO_PIN_RG6 = 102,GPIO_PIN_RG7 = 103,GPIO_PIN_RG8 = 104,GPIO_PIN_RG9 = 105,GPIO_PIN_RG12 = 108,GPIO_PIN_RG13 = 109,GPIO_PIN_RG14 = 110,GPIO_PIN_RG15 = 111,GPIO_PIN_NONE = -1} GPIO_PIN;3、引腳序號
typedef enum {CN0_PIN = 1 << 0,CN1_PIN = 1 << 1,CN2_PIN = 1 << 2,CN3_PIN = 1 << 3,CN4_PIN = 1 << 4,CN5_PIN = 1 << 5,CN6_PIN = 1 << 6,CN7_PIN = 1 << 7,CN8_PIN = 1 << 8,CN9_PIN = 1 << 9,CN10_PIN = 1 << 10,CN11_PIN = 1 << 11,CN12_PIN = 1 << 12,CN13_PIN = 1 << 13,CN14_PIN = 1 << 14,CN15_PIN = 1 << 15,CN16_PIN = 1 << 16,CN17_PIN = 1 << 17,CN18_PIN = 1 << 18,CN19_PIN = 1 << 19,CN20_PIN = 1 << 20,CN21_PIN = 1 << 21, }CN_PIN;5、庫函數
1、端口操作,可同時對多個IO口設置
//讀取端口電平狀態 uint32_t GPIO_PortRead(GPIO_PORT port) {return (*(volatile uint32_t *)(&PORTA + (port * 0x10))); }//寫端口電平 void GPIO_PortWrite(GPIO_PORT port, uint32_t mask, uint32_t value) {*(volatile uint32_t *)(&LATA + (port * 0x10)) = (*(volatile uint32_t *)(&LATA + (port * 0x10)) & (~mask)) | (mask & value); }//讀取端口鎖存器值 uint32_t GPIO_PortLatchRead(GPIO_PORT port) {return (*(volatile uint32_t *)(&LATA + (port * 0x10))); }//設置端口 void GPIO_PortSet(GPIO_PORT port, uint32_t mask) {*(volatile uint32_t *)(&LATASET + (port * 0x10)) = mask; }//清除端口 void GPIO_PortClear(GPIO_PORT port, uint32_t mask) {*(volatile uint32_t *)(&LATACLR + (port * 0x10)) = mask; }//端口電平翻轉 void GPIO_PortToggle(GPIO_PORT port, uint32_t mask) {*(volatile uint32_t *)(&LATAINV + (port * 0x10))= mask; }//端口輸入使能 void GPIO_PortInputEnable(GPIO_PORT port, uint32_t mask) {*(volatile uint32_t *)(&TRISASET + (port * 0x10)) = mask; }//端口輸出使能 void GPIO_PortOutputEnable(GPIO_PORT port, uint32_t mask) {*(volatile uint32_t *)(&TRISACLR + (port * 0x10)) = mask; }2、對單個IO口操作
//寫引腳電平 static inline void GPIO_PinWrite(GPIO_PIN pin, bool value) {GPIO_PortWrite((GPIO_PORT)(pin>>4), (uint32_t)(0x1) << (pin & 0xF), (uint32_t)(value) << (pin & 0xF)); }//讀取引腳電平 static inline bool GPIO_PinRead(GPIO_PIN pin) {return (bool)(((GPIO_PortRead((GPIO_PORT)(pin>>4))) >> (pin & 0xF)) & 0x1); }//讀引腳寄存器值 static inline bool GPIO_PinLatchRead(GPIO_PIN pin) {return (bool)((GPIO_PortLatchRead((GPIO_PORT)(pin>>4)) >> (pin & 0xF)) & 0x1); }//引腳電平翻轉 static inline void GPIO_PinToggle(GPIO_PIN pin) {GPIO_PortToggle((GPIO_PORT)(pin>>4), 0x1 << (pin & 0xF)); }//設置引腳 static inline void GPIO_PinSet(GPIO_PIN pin) {GPIO_PortSet((GPIO_PORT)(pin>>4), 0x1 << (pin & 0xF)); }//清除引腳 static inline void GPIO_PinClear(GPIO_PIN pin) {GPIO_PortClear((GPIO_PORT)(pin>>4), 0x1 << (pin & 0xF)); }//引腳輸入使能 static inline void GPIO_PinInputEnable(GPIO_PIN pin) {GPIO_PortInputEnable((GPIO_PORT)(pin>>4), 0x1 << (pin & 0xF)); }//引腳輸出使能 static inline void GPIO_PinOutputEnable(GPIO_PIN pin) {GPIO_PortOutputEnable((GPIO_PORT)(pin>>4), 0x1 << (pin & 0xF)); }LED翻轉程序
int main(void) {GPIO_PortOutputEnable(GPIO_PORT_B,CN0_PIN); //RB0設置為輸出while(1){GPIO_PortToggle(GPIO_PORT_B,CN0_PIN);delay(1000);} }6、實驗驗證
程序編譯后 燒錄到開發板中,LED燈閃爍顯示。
時間:2021.07.15
總結
以上是生活随笔為你收集整理的4、PIC32系列 GPIO介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 复利计算3
- 下一篇: windows 8 新登陆方式(图片