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功能框圖

初始化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è)寄存器。
typedefstruct{寫(xiě)法DIR_f;//輸入輸出方向寄存器OPENDRAIN_f;//輸出模式寄存器PDR_f;//下拉電阻寄存器PUR_f;//上拉電阻寄存器AFRH_f;//復(fù)用功能寄存器高段AFRL_f;//復(fù)用功能寄存器低段ANALOG_f;//模擬數(shù)字配置寄存器RISEIE_f;//上升沿中斷使能寄存器FALLIE_f;//下降沿中斷使能寄存器HIGHIE_f;//高電平中斷使能寄存器LOWIE_f;//低電平中斷使能寄存器ISR_f;//中斷標(biāo)志寄存器ICR_f;//中斷標(biāo)志清除寄存器LCKR_f;//配置鎖定寄存器FILTER_f;//中斷數(shù)字濾波器配置寄存器IDR_f;//輸入數(shù)據(jù)寄存器ODR_f;//輸出數(shù)據(jù)寄存器BRR_f;//位清零寄存器BSRR_f;//位置位清零寄存器TOG_f;//位翻轉(zhuǎn)寄存器}GPIO_TypeDef;
第二個(gè)參數(shù)GPIO_InitTypeDef也是一個(gè)結(jié)構(gòu)體,在cw32l083_gpio.h中可查看其定義。
typedefstruct{uint32_tPins;uint32_tMode;uint32_tIT;}GPIO_InitTypeDef;
下面舉一個(gè)簡(jiǎn)單的例子配置一個(gè)IO口翻轉(zhuǎn),可實(shí)現(xiàn)閃燈實(shí)驗(yàn)。
int32_t main(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_HSI_Enable(RCC_HSIOSC_DIV6);
__RCC_GPIOC_CLK_ENABLE(); //打開(kāi)GPIOC的時(shí)鐘
GPIO_InitStruct.IT = GPIO_IT_NONE;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pins = GPIO_PIN_2|GPIO_PIN_3;
GPIO_Init(CW_GPIOC, GPIO_InitStruct);
while (1)
{
GPIO_TogglePin(CW_GPIOC,GPIO_PIN_2|GPIO_PIN_3);
Delay(0xFFFF); //延遲函數(shù)
}
}
void Delay(__IO uint16_t nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
例程中使用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端口地址映射。
#define CW_GPIOC ((GPIO_TypeDef*) GPIOC_BASE)
#define GPIOC_BASE 0x48000800UL
#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */
#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */
#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */
#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */
#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */
#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */
#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */
#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */
#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */
#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */
#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */
#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */
#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */
#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */
#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */
#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */
#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */
#define GPIO_MODE_ANALOG (0X00)
#define GPIO_MODE_INPUT (0x10)
#define GPIO_MODE_INPUT_PULLUP (0x11)
#define GPIO_MODE_INPUT_PULLDOWN (0x12)
#define GPIO_MODE_OUTPUT_PP (0x20)
#define GPIO_MODE_OUTPUT_OD (0x21)
上面的例子是使用庫(kù)函數(shù)配置的,也可以用寄存器操作,具體步驟如下。
//開(kāi)啟HSI并6分頻,Sysclk=HCLK=PCLK=8MHz
CW_SYSCTRL->HSI=(5<
CW_SYSCTRL->CR1|=SYSCTRL_BYPASS|SYSCTRL_CR1_HSIEN_Msk; //Enable HSI
while ((CW_SYSCTRL->HSI SYSCTRL_HSI_STABLE_Msk) != SYSCTRL_HSI_STABLE_Msk) //Wait stable
{
;
}
//開(kāi)啟GPIOC的時(shí)鐘
REGBITS_SET(CW_SYSCTRL->AHBEN, RCC_AHB_PERIPH_GPIOC);
//配置PC02和PC03為數(shù)字功能推挽輸出
CW_GPIOC->ANALOG_f.PIN2 = 0; //將PC02設(shè)置為數(shù)字功能
CW_GPIOC->DIR_f.PIN2 = 0; //將PC02設(shè)置成輸出模式
CW_GPIOC->OPENDRAIN_f.PIN2 = 0; //將PC02設(shè)置成推挽模式
CW_GPIOC->ANALOG_f.PIN3 = 0; //將PC03設(shè)置為數(shù)字功能
CW_GPIOC->DIR_f.PIN3 = 0; //將PC03設(shè)置為輸出模式
CW_GPIOC->OPENDRAIN_f.PIN3 = 0; //將PC03設(shè)置為推挽模式
while (1)
{
CW_GPIOC->TOG=bv2; //PC02翻轉(zhuǎn)
Delay(0xFFFF);
CW_GPIOC->TOG=bv3; //PC03翻轉(zhuǎn)
Delay(0xFFFF);
}
下面以CW32L083為例通過(guò)配置GPIO引腳來(lái)驅(qū)動(dòng)SPI2外設(shè),查閱CW32L083的用戶(hù)手冊(cè)可以得知, SPI2可以通過(guò)PA00,PA01,PA02,PA03復(fù)用實(shí)現(xiàn),這個(gè)就是上文提到的GPIO口的復(fù)用功能。
PA00_AFx_SPI2MISO() //將PA00復(fù)用成SPI2的MISO線(xiàn)
PA01_AFx_SPI2MOSI() //將PA01復(fù)用成SPI2的MOSI線(xiàn)
PA02_AFx_SPI2SCK() //將PA02復(fù)用成SPI2的時(shí)鐘線(xiàn)
PA03_AFx_SPI2CS() //將PA03復(fù)用成SPI2的片選線(xiàn),如需操作片選線(xiàn),有特定函數(shù)
GPIO_InitTypeDef GPIO_InitStructure = {0};
GPIO_InitStructure.Pins =GPIO_PIN_1|GPIO_PIN_2 |GPIO_PIN_3;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.IT= GPIO_IT_NONE;
GPIO_Init(CW_GPIOA, GPIO_InitStructure);
GPIO_InitStructure.Pins =GPIO_PIN_0;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
GPIO_Init(CW_GPIOA, GPIO_InitStructure);
另外我們的GPIO支持外部中斷,具體的配置如下,如果有不清楚的小伙伴可以查看下節(jié)CW32中斷控制器,會(huì)有詳細(xì)講解。
GPIO_InitTypeDef GPIO_InitStruct = {0};
__RCC_GPIOA_CLK_ENABLE();//開(kāi)啟GPIOA的時(shí)鐘
GPIO_InitStruct.IT = GPIO_IT_RISING | GPIO_IT_FALLING; //上升沿或者下降沿觸發(fā)
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pins =GPIO_PIN_1;
GPIO_Init(CW_GPIOA, GPIO_InitStruct);
//清除PA01中斷標(biāo)志并使能NVIC
GPIOA_INTFLAG_CLR(bv1);
NVIC_EnableIRQ(GPIOA_IRQn);
上面的例程即可實(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通用輸入輸出端口的介紹。
來(lái)源:武漢芯源半導(dǎo)體
審核編輯:湯梓紅
-
寄存器
+關(guān)注
關(guān)注
31文章
5608瀏覽量
129957 -
端口
+關(guān)注
關(guān)注
4文章
1104瀏覽量
33962 -
GPIO
+關(guān)注
關(guān)注
16文章
1328瀏覽量
56215
發(fā)布評(píng)論請(qǐng)先 登錄
通用輸入輸出端口GPIO配置說(shuō)明
CW32 通用輸入輸出端口
更高的帶寬! 說(shuō)說(shuō)筆記本的輸入輸出端口
F2產(chǎn)品技術(shù)培訓(xùn)_8.通用輸入輸出端口(GPIO)
MSP430教程Chapt6-通用輸入輸出
MCU通用輸入輸出端口(GPIO)輸出模式
04、STM8通用輸入輸出口(GPIO)
2、【STM32F0系列學(xué)習(xí)】之—通用輸入輸出端口(GPIO)
GPIO通用輸入輸出
CW32通用輸入輸出端口詳解
評(píng)論