STM32學習筆記(三) STM32的GPIO的深入學習


 STM32的開發學習主要涉及軟硬件兩個部分的實現,包含眾多外設和總線的理解配置。STM32的整個學習曲線並不陡峭,但入門卻相當困難,因此在學習之初,多動手實驗和測試相當重要,GPIO作為整個STM32與外部連接的端口,難度不高,卻十分重要。從深入解析GPIO外設開始,一步步熟悉掌握STM32各個模塊,就是STM32的整個學習流程。

GPIO模塊回顧

    在嵌入式軟件開發中,幾乎所有功能的實現都需要GPIO端口輸出才能發揮作用。GPIO端口的操作包括時鍾使能,寄存器配置,端口信息修改。這些基礎的東西上一章已經講過,我這里就不在細說,我這里主要講GPIO涉及到的其它庫函數。

1. 讀取GPIO端口數據函數

    GPIO_ReadInputDataBit(GPIOx,GPIO_Pin_y);//讀取單個輸入端口的數據

    GPIO_ReadInputData(GPIOx);//讀取整個輸入端口的數據

    GPIO_ReadOutputDataBit(GPIOx, GPIO_Pin_y);//讀取單個輸出端口的數據

    GPIO_ReadOutputData (GPIOx);//讀取整個輸入出端口的位數據

    這4個庫函數是用來直接讀取端口數據的,其中x:A-G y: 0~15

    上面的函數實現的是讀取當前GPIO口或位的輸入輸出數據,庫函數沒有什么可說的。

    但這幾個函數涉及到下面兩個寄存器:

    端口數據輸入寄存器(GPIOA_IDR~GPIOG_IDR);

    端口數據輸出寄存器(GPIOA_ODR~GPIOG_ODR);

    這兩個寄存器都是16位的,高16位保留,讀取值為0,低16位代表着對應GPIO端口位[15:0]的狀態,偏移值位0cH,具體地址可參考寄存器表。上面的庫函數讀取Data就是讀取這兩個寄存器中選定那個的低16位,讀取DataBit就是讀取選定寄存器16位中的任意選定位。

 2 . 寫入GPIO端口數據函數

   GPIO_WriteBit(GPIOx, GPIO_Pin_y,BIT_SET/BIT_RESET);//置位或者復位單個輸出端口的數據

   GPIO_Write(GPIOx, 0x1111);//置位或者復位整個輸出端口的數據

   其中x:A-G y: 0~15

   這兩個函數是對GPIO_SetBits和GPIO_ResetBits的補充,可以滿足對多個端口同時設置狀態的特性。

   端口復位置位寄存器(GPIOA_BSRR~GPIOG_BSRR) ,32bit復位置位寄存器,w(只寫,下同),

   [31~16]寫0無效,寫1對應GPIOx_ODR位置0

   [15~0]寫0無效,寫1對應GPIOx_ODR位置1

   端口復位寄存器(GPIOA_BRR~GPIOG_BRR),32bit復位寄存器w

  高16位保留,低16位

   [15~0]寫0無效,寫1對應GPIOx_ODR位置0 若GPIOx_BRR和GPIOx_BSRR同時設置,以GPIOx_BSRR為准。

 3. GPIO功能鎖存函數

   GPIO_PinLockConfig(GPIOx, GPIO_Pin_y);//鎖存選擇端口配置寄存器的對應位

  端口鎖存寄存器(GPIOA_LCKR~GPIOG_LCKR),32bit寄存器,高16位保留,低16可隨時讀出,1代表對應配置位被激活鎖存,0代表可以被激活,激活是有固定的寫入順序的。鎖存是不能亂用的,如果鎖存了一個端口的功能寄存器,那么在下次系統復位前,端口的功能就不可更改,這在某些情況下是有利的,特別是在程序中如果重新定義某些GPIO口的功能時,在確定其中某一GPIO端口在整個系統運行中狀態保持不變,鎖存就避免誤修改,但是如果鎖存的GPIO在后續的代碼段中有不同的功能,就會無法修改,產生錯誤。因此鎖存和GPIO_StructInit, GPIO_DeInit,GPIO_AFIODeInit這些初始化函數一樣,使用前要考慮清楚。

4.GPIO特殊功能函數

  函數GPIO_EventOutputConfig(GPIO_PortSourceGPIOx,GPIO_PinSourcey);事件輸出。

  函數GPIO_EXTILineConfig(GPIO_PortSourceGPIOx, GPIO_PinSourcey); 外設端口作為中斷線號輸入

  這兩個函數我就不多說了,在EXTI-NVIC中會有詳細解釋。

  函數GPIO_PinRemapConfig(u32GPIO_Remap, FunctionalState NewState);改變指定管腳的映射,很多復用功能的引出腳可以通過重映射,從不同的I/O管腳引出,即復用功能的引出腳位是可通過程序改變的。就是上面庫函數。

函數GPIO_AFIODeInit(); 取消所有的復用功能。

相關代碼參考:按鍵控制LED燈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM