每個GPIO端口有兩個32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分別控制每個端口的高八位和低八位,如果IO口是0-7號的話,則寫CRL寄存器,如果IO口是8-15號的話,則寫CRH寄存器,兩個32位數(shù)據(jù)寄存器(GPIOx_IDR,GPIOx_ODR)一個是只讀作輸入數(shù)據(jù)寄存器,一個是只寫作輸出寄存器,一個32位置位/復(fù)位寄存器(GPIOx_BSRR),一個16位復(fù)位寄存器(GPIOx_BRR)和一個32位鎖定寄存器(GPIOx_LCKR)。常用的IO端口寄存器只有四個:CRH,CRL,IDR,ODR。
數(shù)據(jù)手冊中列出的每個I/O端口的特定硬件特征, GPIO端口的每個位可以由軟件分別配置成多種模式。每個I/O端口位可以自由編程,然而I/0端口寄存器必須按32位字被訪問(不允許半字或字節(jié)訪問)。
另外,STM32的每個端口使用前都要將其時鐘使能,STM32的GPIO的時鐘統(tǒng)一掛接在APB2上,具體的使能寄存器為RCC_APB2ENR,該寄存器的第2位到第8位分別控制GPIOx(x=A,B,C,D,E,F,G)端口的時鐘使能,當(dāng)外設(shè)時鐘沒有啟用時,程序不能讀出外設(shè)寄存器的數(shù)值,如打開PORTA時鐘:
RCC->APB2ENR|=1<<2; //使能PORTA時鐘
使能外設(shè)時鐘后,GPIOA的十六位就可以按照設(shè)定的狀態(tài)工作了,之后就是具體設(shè)置哪一位了以第八位為例即高位的首位,在GPIOx_CRH寄存器中進行設(shè)置,GPIOA的每一位都有該寄存器的四位來設(shè)定相應(yīng)的參數(shù),這四位中的高兩位(CNF0,CNF1)設(shè)置GPIO的輸入輸出模式,低兩位(MODE0,MODE1)是設(shè)置GPIO的輸出頻率,具體可以參考STM32參考手冊。
GPIOA->CRH&=0XFFFFFFF0;//清掉PA8原來的設(shè)置,同時屏蔽其它端口,不影響其它端口的設(shè)置
GPIOA->CRH|=0X00000003;//PA8 推挽輸出
十六進制中的3 換成二進制 00 11 前兩位00表示推挽輸出,11代表輸出頻率50Mhz,若CRH|=0x4,表示模擬輸入模式(ADC用),0x3表示推挽輸出模式(作輸出口用,50M速率),0x8表示上/下拉輸入模式(做輸入口用),0xB表示復(fù)用輸出(使用IO口的第二功能,50M速率)。
這是對一位的操作,當(dāng)然也可以多位操作,因為STM32對GPIO操作必須是32位全字操作,設(shè)置完成后GPIOA的第8位就可以使用了 之后給GPIOA->ODR=0x xxxx xxxx送數(shù)據(jù)就行了