2.1.2 GPIO

2.1.2 GPIO

 

一、配置

1.1 方向配置(FIOxDIR

方向配置只有在管腳被配置成GPIO功能時有效,當管腳被配置成其他功能時,方向配置不被接受

P0.29P0.30管腳共享USB數據線,必須被配置成相同方向!

1.2 輸出置位(FIOxSET

只有在GPIO功能,方向輸出時有效。寫1將對應管腳輸出爲1,寫0無效。

1.3 輸出 清零(FIOxCLR

只有在GPIO功能,方向輸出時有效,寫1將對應管腳輸出爲0,寫0無效。

1.4 管腳值(FIOxPIN

該寄存器無論管腳配置成任何功能(模擬功能除外)或任何方向時均可被讀寫。

1.5 端口掩碼(FIOxMASK

與上述其他寄存器配合,對端口特定管腳操作。寫0允許操作,寫1無效。

 

二、GPIO中斷

只有P0口和P2口的管腳能生成GPIO中斷,GPIO中斷與外部中斷3共享同一個中斷源。

GPIO中斷可以被配置成下降沿觸發、上升沿觸發或雙沿觸發,不允許電平觸發。

當使用GPIO中斷時,相應管腳要配置成GPIO功能,方向輸入。

2.1 初始化配置

1. 配置GPIO功能,方向輸入

2. 配置同時使能觸發方式(上升沿、下降沿還是雙沿觸發)

3. 使能NVIC的外部中斷3

代碼如下:

 

void Board_Key_Init(void)
{
	// GPIO中斷需要配置GPIO管腳方向爲輸入
	Chip_GPIO_SetPinDIRInput(LPC_GPIO, KEY_PORT_NUM, KEY1_BIT_NUM);
	Chip_GPIO_SetPinDIRInput(LPC_GPIO, KEY_PORT_NUM, KEY2_BIT_NUM);

	// 配置下降沿中斷
	Chip_GPIOINT_SetIntFalling(LPC_GPIOINT, KEY_INT_PORT, (1 << KEY1_BIT_NUM)|(1 << KEY2_BIT_NUM));	
	// 清除中斷標誌位
	Chip_GPIOINT_ClearIntStatus(LPC_GPIOINT,KEY_INT_PORT, (1 << KEY1_BIT_NUM)|(1 << KEY2_BIT_NUM));
	
	// 配置中斷優先級

	// 清除中斷掛起標誌位
	NVIC_ClearPendingIRQ(EINT3_IRQn);
	// 使能中斷
	NVIC_EnableIRQ(EINT3_IRQn);
}

 

2.2 使用

中斷服務程序使用外部中斷3的服務程序。可以先讀取IOIntStatus判斷哪個端口有中斷到來,然後讀取IOxIntStatR判斷哪個管腳觸發了中斷。然後執行相應的中斷服務程序。最後清除GPIO中斷標誌位。

代碼如下:

 

void EINT3_IRQHandler(void)
{
	uint32_t status = 0;
	
	// TODO: 按鍵消抖
	
	// 判斷中斷端口
	//if(Chip_GPIOINT_IsIntPending(LPC_GPIOINT,KEY_INT_PORT))
	{
		// 讀取下降沿中斷狀態
		status = Chip_GPIOINT_GetStatusFalling(LPC_GPIOINT, KEY_INT_PORT);
		
		if(status & (1 << KEY1_BIT_NUM))
		{
			// 清除中斷標誌位
			Chip_GPIOINT_ClearIntStatus(LPC_GPIOINT, KEY_INT_PORT, 1 << KEY1_BIT_NUM);
			
			if(pKEY1_ISR != 0)		pKEY1_ISR();
		}
		else if(status & (1 << KEY2_BIT_NUM))
		{		
			// 清除中斷標誌位
			Chip_GPIOINT_ClearIntStatus(LPC_GPIOINT, KEY_INT_PORT, 1 << KEY2_BIT_NUM);
			
			if(pKEY2_ISR != 0)		pKEY2_ISR();
		}
	}
}

發佈了38 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章