STM32F10x芯片GPIO/AFIO端口配置總結
1、介紹
STM32F10x芯片的GPIO/AFIO配置主要包括以下幾方面知識:在時鐘控制模塊中配置好相應總線時鐘,并在總線上使能對應的GPIO口(AFIO口,需要的話)時鐘后:根據(jù)需求配置相應GPIO端口為對應的輸入/輸出模式,按需求更改/讀取端口的數(shù)據(jù);端口功能重映射;若用外部中斷,則將中斷線與對應引腳鏈接起來。
本文引用地址:http://m.butianyuan.cn/article/201611/316902.htmSTM32F10x芯片的每個GPIO端口都有7個相關的寄存器:2個32位配置寄存器(GPIOx_CRL,GPIOx_CRH),兩個32位數(shù)據(jù)寄存器(GPIOx_IDR,GPIOx_ODR),一個32位置位/復位寄存器(GPIOx_BSRR),一個16位復位寄存器(GPIOx_BRR)和一個32位鎖定寄存器(GPIOx_LCKR)。每個I/O端口都可以設置成如下模式:
?輸入浮空:GPIO_Mode_IN_FLOATING
?輸入上拉:GPIO_Mode_IPU
?輸入下拉:GPIO_Mode_IPD
?模擬輸入:GPIO_Mode_AIN
?開漏輸出:GPIO_Mode_Out_OD
?推免式輸出:GPIO_Mode_Out_PP
?推免式復用功能:GPIO_Mode_AF_PP
?開漏復用功能:GPIO_Mode_AF_OD
2、GPIO寄存器描述
l端口配置低寄存器(GPIOx_CRL)(x=A…E)
l端口配置高寄存器(GPIOx_CRH)(x=A…E)
l端口輸入數(shù)據(jù)寄存器(GPIOx_IDR)(x=A…E)
l端口輸出數(shù)據(jù)寄存器(GPIOx_ODR)(x=A…E)
l端口位設置/清除寄存器(GPIOx_BSRR)(x=A…E)
l端口位清除寄存器(GPIOx_BRR)(x=A…E)
l端口配置鎖定寄存器(GPIOx_LCKR)(x=A…E)
2、AFIO寄存器描述
l事件控制寄存器(AFIO_EVCR):控制內部時間輸出到相應引腳
l復用重映射和調試I/O配置寄存器(AFIO_MAPR)
l外部中斷配置寄存器(AFIO_EXTICRx)(x=1…4):設置端口為中斷線(將端口與中端線連接)
注意:對寄存器AFIO_EVCR、AFIO_MAPR、AFIO_EXTICRX進行讀寫操作前,應當首先打開AFIO的時鐘。
3、GPIO操作流程
l首先定義GPIO_InitTypeDef類型變量;
l然后調用RCC_APB2PeriphClockCmd()函數(shù)使能相應的GPIOx端口(所有GPIO端口都掛載到APB2總線上的)時鐘。注意使能GPIOx端口時鐘的函數(shù)必須在GPIO端口配置函數(shù)之前調用,否則GPIO端口會初始化不成功:;
l調用GPIO_DeInit()初始化要使用的GPIOx端口對應寄存器為默認值;
l調用GPIO_StructInit()函數(shù)初始化前面定義的GPIO_InitTypeDef類型變量到缺省值;
l按需求初始化GPIO_InitTypeDef類型變量,然后調用GPIO_Init()函數(shù)實現(xiàn)初始化;
l然后就可以對相應的端口進行操作了:讀/寫,或配置為復用功能(相應函數(shù)查看固件庫)。
注意:
1、系統(tǒng)復位和剛復位后,復用功能未開啟,I/O端口被配置成浮空輸入模式(CNFx[1:0]=01b,MODEx[1:0]=00b)。復位后,JTAG引腳被置于輸入上拉或下拉模式:
PA15:JTDI置于上拉模式;
PA14:JTCK置于下拉模式;
PA13:JTMS置于上拉模式;
PB4:JNTRST置于上拉模式;
因此要使用JTAG調試接口作為通用GPIO口使用,則必須屏蔽JTAG復用功能。具體實現(xiàn)為先調用RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE)使能AFIO時鐘,然后調用GPIO_PinRemapConfig(GPIO_Remap_SWJ_XXXX,ENABLE)關閉JTAG的調試復用功能;
2、當把端口配置成復用輸出功能時,則引腳和輸出寄存器斷開,并和片上外設的輸出信號連接;但如果沒有激活對應外設,則其輸出將不確定;
3、當使用外部中斷或事件事,首先按照上面幾步配置GPIO端口(輸入),然后調用函數(shù):GPIO_EXTILineConfig()將引腳與對應的中斷線鏈接起來,然后在配置NVIC使能對應的中斷通道,最后編寫中斷處理函數(shù)。
4、GPIO操作例子
例子1:
u16 Val = 1;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_Configuration();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
GPIO_Write(GPIOB,0xffff);
while(1)
{
GPIO_Write(GPIOB, ~Val);
Delay(0x2FFFFF);
if(Val == 0x8000) Val = 1;
else Val<<=1;
}
評論