STM32 GPIO寄存器



STM32 GPIO 相關寄存器


每個GPIO端口有兩個32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分別控制每個端口的高八位和低八位,如果IO口是0-7號的話,則寫CRL寄存器,如果IO口是8-15號的話,則寫CRH寄存器,兩個32位數據寄存器(GPIOx_IDR,GPIOx_ODR)一個是隻讀作輸入數據寄存器,一個是隻寫作輸出寄存器,一個32位置位/復位寄存器(GPIOx_BSRR),一個16位復位寄存器(GPIOx_BRR)和一個32位鎖定寄存器(GPIOx_LCKR)。常用的IO端口寄存器只有四個:CRH,CRL,IDR,ODR。 

 
數據手冊中列出的每個I/O端口的特定硬件特徵, GPIO端口的每個位可以由軟件分別配置成多種模式。每個I/O端口位可以自由編程,然而I/0端口寄存器必須按32位字被訪問(不允許半字或字節訪問)。


另外,STM32的每個端口使用前都要將其時鐘使能,STM32的GPIO的時鐘統一掛接在APB2上,具體的使能寄存器爲RCC_APB2ENR,該寄存器的第2位到第8位分別控制GPIOx(x=A,B,C,D,E,F,G)端口的時鐘使能,當外設時鐘沒有啓用時,程序不能讀出外設寄存器的數值,如打開PORTA時鐘:  RCC->APB2ENR|=1<<2;    //使能PORTA時鐘使能外設時鐘後,GPIOA的十六位就可以按照設定的狀態工作了,之後就是具體設置哪一位了以第八位爲例即高位的首位,在GPIOx_CRH寄存器中進行設置,GPIOA的每一位都有該寄存器的四位來設定相應的參數,這四位中的高兩位(CNF0,CNF1)設置GPIO的輸入輸出模式,低兩位(MODE0,MODE1)是設置GPIO的輸出頻率,具體可以參考STM32參考手冊。


GPIOA->CRH&=0XFFFFFFF0; //清掉PA8原來的設置,同時屏蔽其它端口,不影響其它端口的設置GPIOA->CRH|=0X00000003;//PA8 推輓輸出


十六進制中的3 換成二進制 00 11 前兩位00表示推輓輸出,11代表輸出頻率50Mhz,若CRH|=0x4,表示模擬輸入模式(ADC用),0x3表示推輓輸出模式(作輸出口用,50M速率),0x8表示上/下拉輸入模式(做輸入口用),0xB表示複用輸出(使用IO口的第二功能,50M速率)。


這是對一位的操作,當然也可以多位操作,因爲STM32對GPIO操作必須是32位全字操作,設置完成後GPIOA的第8位就可以使用了 之後給GPIOA->ODR=0x xxxx xxxx送數據就行了 STM32 GPIO 相關寄存器


每個GPIO端口有兩個32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分別控制每個端口的高八位和低八位,如果IO口是0-7號的話,則寫CRL寄存器,如果IO口是8-15號的話,則寫CRH寄存器,兩個32位數據寄存器(GPIOx_IDR,GPIOx_ODR)一個是隻讀作輸入數據寄存器,一個是隻寫作輸出寄存器,一個32位置位/復位寄存器(GPIOx_BSRR),一個16位復位寄存器(GPIOx_BRR)和一個32位鎖定寄存器(GPIOx_LCKR)。常用的IO端口寄存器只有四個:CRH,CRL,IDR,ODR。 

 
數據手冊中列出的每個I/O端口的特定硬件特徵, GPIO端口的每個位可以由軟件分別配置成多種模式。每個I/O端口位可以自由編程,然而I/0端口寄存器必須按32位字被訪問(不允許半字或字節訪問)。


另外,STM32的每個端口使用前都要將其時鐘使能,STM32的GPIO的時鐘統一掛接在APB2上,具體的使能寄存器爲RCC_APB2ENR,該寄存器的第2位到第8位分別控制GPIOx(x=A,B,C,D,E,F,G)端口的時鐘使能,當外設時鐘沒有啓用時,程序不能讀出外設寄存器的數值,如打開PORTA時鐘: RCC->APB2ENR|=1<<2; //使能PORTA時鐘
使能外設時鐘後,GPIOA的十六位就可以按照設定的狀態工作了,之後就是具體設置哪一位了以第八位爲例即高位的首位,在GPIOx_CRH寄存器中進行設置,GPIOA的每一位都有該寄存器的四位來設定相應的參數,這四位中的高兩位(CNF0,CNF1)設置GPIO的輸入輸出模式,低兩位(MODE0,MODE1)是設置GPIO的輸出頻率,具體可以參考STM32參考手冊。 

 
GPIOA->CRH&=0XFFFFFFF0; //清掉PA8原來的設置,同時屏蔽其它端口,不影響其它端口的設置  GPIOA->CRH|=0X00000003;//PA8 推輓輸出

十六進制中的3 換成二進制 00 11 前兩位00表示推輓輸出,11代表輸出頻率50Mhz,若CRH|=0x4,表示模擬輸入模式(ADC用),0x3表示推輓輸出模式(作輸出口用,50M速率),0x8表示上/下拉輸入模式(做輸入口用),0xB表示複用輸出(使用IO口的第二功能,50M速率)。


這是對一位的操作,當然也可以多位操作,因爲STM32對GPIO操作必須是32位全字操作,設置完成後GPIOA的第8位就可以使用了 之後給GPIOA->ODR=0x xxxx xxxx送數據就行了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章