中科藍訊SDK開發 GPIO介紹和 IO中斷示例
中科藍訊SDK開發 GPIO介紹和 IO中斷示例
哈嘍,大家好。
相信剛接觸中科藍訊的小伙伴都有這樣的疑惑:初始化 GPIO 要設置哪些寄存器?在哪里調用 GPIO 初始化函數?今天就來給大家介紹一下中科藍訊 GPIO 的使用,在此篇文章中以 GPIOA 為例,方便大家在自定義 GPIO 功能時候可以做一個參考。
接著介紹一個 IO 中斷示例,希望對大家使用到 IO 中斷時有所幫助。
一、GPIO 介紹及示例
1、寄存器介紹
中科藍訊的SOC芯片內置RISC-V 32位CPU, IO引腳控制功能選擇,由對應的SFR(Special Function Register)進行設置,
① GPIOAFEN
設置為 0 表示作為通用 IO(GPIO) 使用;設置為 1 表示做其它功能性IO,如串口 /SPI。
② GPIOADE
設置 0為模擬IO;設置 1 為數字IO。如作為 AUX 輸入的 IO 口就需要設置成模擬 IO, 減少數字 IO 對 AUX 的干擾。
③ GPIOADIR
設置 0為 IO 輸出;設置 1為 IO 輸入。
④ GPIOADRV
設置為 0 時 IO 輸出驅動為 8mA;設置為 1 時 IO 輸出驅動為32mA。注意 IO 方向為輸出且是數字 IO 時此寄存器才有效。
⑤ 控制上拉或下拉的寄存器
GPIOAPU //10K上拉使能
GPIOAPD //10K下拉使能
GPIOAPU200K //200K上拉使能
GPIOAPD200K //200K下拉使能
GPIOAPU300 //300歐上拉使能
GPIOAPD300 //300歐下拉使能
注意,只有當 IO 設置為輸入時, 上下拉才有效。
⑥ GPIOA
IO 方向為輸入時,讀此寄存器的值即得到引腳的高低狀態;IO 為輸出時,設置此寄存器的高低即設置對應引腳的高低輸出。
⑦ GPIOASET/GPIOACLR
作為輸出時,輸出電平的高低可以通過設置 GPIOASET/GPIOACLR 來快速實現。注意,GPIOASET/GPIOACLR 只對寫 1 的位有效,并且不會改變其它位的狀態。
GPIOASET = BIT(0); //PA0 輸出高,等效于 GPIOA |= BIT(0);
GPIOACLR = BIT(0); //PA0 輸出低,等效于 GPIOA &= ~BIT(0);
優化原理:
如程序把IO設置為高, 一般這樣寫GPIOA |= BIT(0);
這里實際上有三個步驟:
1) 先讀出GPIOA.
2) 再把GPIOA | BIT(0);
3) 把或后的結果再寫回GPIOA
而使用GPIOASET等效優化后, 直一條指令GPIOASET = BIT(0);即達到 上面三步才能達到的效果.
NOTE:
具體配置管腳時候,根據需求設置以上13個寄存器,當然,不是所有寄存器都需要設置,一定需要設置的寄存器包括:
數字功能使能寄存器GPIOADE,用于選擇當做數字功能,而不是模擬功能;
輸入輸出功能設置寄存器GPIOADIR,用于設置管腳是輸出還是輸入,如果是輸入還需要設置對應的上下拉功能;
數據寄存器GPIOA,可讀可寫,作為輸出的時候,就寫寄存器,作為輸入的時候就需要讀寄存器。
2、GPIOA 使用示例
① GPIOA 初始化函數

② 代碼示例
int main(void) { printf("Hello AB5300\n"); //示例開始 GPIOAFEN &= ~BIT(0); //PA0作為GPIO使用 GPIOADE |= BIT(0); //PA0設置為數字IO GPIOADIR &= ~BIT(0); //PA0方向設置為輸出 WDT_DIS(); //測試代碼,關看門狗,防止看門狗復位 while(1) { GPIOA |= BIT(0); //PA0輸出高, 等效于GPIOASET = BIT(0); delay_ms(100); GPIOA &= ~BIT(0); //PA0輸出低, 等效于GPIOACLR = BIT(0); delay_ms(100); } }
③ GPIOA 初始化函數調用
GPIOA 初始化函數可以放在 bsp_sys_init() 函數的最后。初始化之后,即可以在其他需要的地方通過 GPIOASET/GPIOACLR 來翻轉 GPIOA0 的狀態。
二、IO 中斷示例
1、寄存器接介紹
① WKUPEDG

7:0,8 組喚醒輸入邊沿設置;0:上升沿出發,1:下降沿觸發。

23:16,8 組喚醒中斷產生標志;0:無中斷;1:中斷產生。
② WKUPCPND:喚醒清除掛起寄存器
③ PORTINTEN:端口中斷使能寄存器
共有 32 個 IO 中斷,使用 IO 中斷需使能相應的中斷使能位。
④ PORTINTEDG:端口中斷邊沿選擇寄存器
⑤ WKUPCON:喚醒控制寄存器
2、IO 中斷處理函數

WKUPEDG & (BIT(6) << 16) 中,BIT(6) 代表第 6 組喚醒中斷,當有 IO 中斷產生時,此為硬件置 1。WKUPCPND 則是清除相應中斷掛起位。
注意,數組 strisr0[]、strisr1[] 是把打印函數中的常量字符串放進 COM 區,com區程序常駐于RAM中, CPU可以迅速響應中斷函數,否則中斷處理函數調用 printf 函數則有可能導致重啟。
3、IO 中斷配置函數(以 GPIOE7 為例)

PORTINTEN |= BIT(20) 中為何與上 BIT(20)?因為 GPIOE7 對應的是 32 個端口中斷的第 20 個;PORTINTEDG 同理;各個 IO 中斷的位號可以按下圖從右往左算:
sys_irq_init() 函數設置中斷優先級,IRQ_PORT_VECTOR 代表設置的是端口中斷。
4、IO 中斷函數調用

注意,端口中斷配置函數必須在 sys_set_tmr_enable() 函數前調用。
GPIO 介紹和 IO 中斷示例就介紹到這里,希望可以在大家自定義 GPIO 功能和使用 IO 中斷時幫助到大家。如有錯誤歡迎大家批評指正。如果大家還有什么其他的問題或者功能想要詢問,亦可以在評論區中提出,可以共同探討,一起進步。
共同關鍵字:中科藍訊 SDK
中科藍訊 SDK 開發——工程淺析
中科藍訊 SDK 開發——耳機充電配置
中科藍訊 SDK TWS 組隊和藍牙配對過程分析
中科藍訊 SDK 開發——TWS 左右聲道分配
中科藍訊AB5607E藍牙5.4 低成本藍牙接近開關定時開關方案
AB137A中科藍訊SOP16封裝帶插卡帶U盤音箱語音識別IC MP3方案開發
中科藍訊AB5607E藍牙5.4 低成本帶插卡帶U盤音箱方案
中科藍訊SDK 開發環境搭建安裝及 Downloader 配置
參考文檔:
1、中科藍訊藍皮書
2、BT892X DataSheet.pdf