CW32 通用輸入輸出端口

GPIO的意思是通用輸入輸出端口,可通過(guò)軟件配置成輸入或者輸出端。即可以通過(guò)GPIO口輸出高低電平或者通過(guò)GPIO口讀入引腳狀態(tài)是高電平還是低電平。大部分引腳除了當(dāng)GPIO使用外,還可以復(fù)用為外設(shè)功能引腳。如UART外設(shè)與其他硬件進(jìn)行數(shù)據(jù)交互。
CW32L083的每組GPIO都有20個(gè)寄存器,除了基礎(chǔ)的配置寄存器、數(shù)據(jù)寄存器、位置位/清零寄存器、位清零寄存器、鎖定寄存器、復(fù)用功能寄存器外,還配置了位翻轉(zhuǎn)寄存器,中斷數(shù)字濾波寄存器等,讓操作更加快捷。同時(shí)提供完善的固件庫(kù)函數(shù),方便工程師快速開(kāi)發(fā)測(cè)試,增強(qiáng)可移植性。
GPIO端口可配置成8種工作模式
4種輸入模式
1.浮空輸入
2.輸入上拉
3.輸入下拉
4.模擬輸入
4種輸出模式
1.開(kāi)漏輸出
2.推挽式輸出
3.開(kāi)漏復(fù)用功能
4.推挽式復(fù)用功能

初始化GPIO可使用void GPIO_Init(GPIO_TypeDef ?*GPIOx, GPIO_InitTypeDef *GPIO_Init)函數(shù),此函數(shù)在cw32l083_gpio.c中有詳細(xì)的配置,其中的第一個(gè)參數(shù)GPIO_TypeDef是一個(gè)結(jié)構(gòu)體類(lèi)型,在cw32l083.h中有詳細(xì)定義,包含著每組GPIO的20個(gè)寄存器。
第二個(gè)參數(shù)GPIO_InitTypeDef也是一個(gè)結(jié)構(gòu)體,在cw32l083_gpio.h中可查看其定義。
下面舉一個(gè)簡(jiǎn)單的例子配置一個(gè)IO口翻轉(zhuǎn),可實(shí)現(xiàn)閃燈實(shí)驗(yàn)。
例程中使用PC02和PC03引腳進(jìn)行IO口翻轉(zhuǎn)實(shí)驗(yàn),官方CW32L083VCT6的評(píng)估板上這兩個(gè)引腳外接LED燈,可以看到LED周期閃爍的效果。
其中CW_GPIOC,GPIO_PIN_0以及GPIO_MODE_OUTPUT_PP都是定義在頭文件中的宏定義,如下面第一行為CW_GPIOC端口地址映射。
上面的例子是使用庫(kù)函數(shù)配置的,也可以用寄存器操作,具體步驟如下。
下面以CW32L083為例通過(guò)配置GPIO引腳來(lái)驅(qū)動(dòng)SPI2外設(shè),查閱CW32L083的用戶手冊(cè)可以得知, SPI2可以通過(guò)PA00,PA01,PA02,PA03復(fù)用實(shí)現(xiàn),這個(gè)就是上文提到的GPIO口的復(fù)用功能。
另外我們的GPIO支持外部中斷,具體的配置如下,如果有不清楚的小伙伴可以查看下節(jié)CW32中斷控制器,會(huì)有詳細(xì)講解。
上面的例程即可實(shí)現(xiàn)外部輸入中斷,PA01在接收到上升沿或者下降沿的信號(hào)的時(shí)候會(huì)進(jìn)入到中斷函數(shù)中去執(zhí)行相關(guān)的程序,具體的例程可以參考官方CW32L083的gpio_int_filter例子。
下面介紹的是CW32L083的GPIO所相關(guān)的函數(shù)及其功能。
1.void GPIO_SWD2GPIO(void);
將PA13/PA14 SWD設(shè)置成GPIO
2.void GPIO_GPIO2SWD(void);
將PA13/PA14設(shè)置成SWD
3.void GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins);
鎖定指定引腳配置項(xiàng),可同時(shí)設(shè)置多個(gè)引腳
4.void GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pins);
GPIO去初始化,可同時(shí)設(shè)置多個(gè)引腳或單個(gè)引腳
5.void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
GPIO 初始化,可同時(shí)設(shè)置多個(gè)引腳或單個(gè)引腳
6.void GPIO_ConfigFilter(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins, uint32_t FltClk);
配置端口濾波
7.void GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins, GPIO_PinState PinState);
設(shè)置指定引腳電平,可同時(shí)設(shè)置多個(gè)引腳
8.void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t Value);
設(shè)置指定引腳端口的輸出值
9.void GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins);
翻轉(zhuǎn)指定引腳電平,可同時(shí)設(shè)置多個(gè)引腳
10.GPIO_PinState GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
獲取一個(gè)引腳的電平
以上是CW32通用輸入輸出端口的介紹。