GPIO的簡介:
GPIO它的學名叫通用輸入輸出端口,其實它就是單片機的I/O口,他承擔著將芯片與外部設備連接實現與外部通訊,控制和數據采集的功能。
GPIO的結構:
STM32的GPIO的硬件結構圖如圖所示
嗯,我們能夠看到的值有最右邊①部分的I/O口引腳,剩下的都在芯片里面,如果想要系統的了解STM32的GPIO,讀懂這個結構圖還是非常有必要的,嘿嘿,一點一點來看吧。
①保護部分:
引腳上的兩個保護二極管是用來保護I/O口引腳的,兩個二極管的作用分兩種情況
情況1當輸入的電壓過高時:上面的保護二極管導通。
情況2當輸入的電壓過低時:下面的保護二極管導通。
都是為了防止不正常的電壓進入芯片然后燒毀芯片。
②輸出驅動部分:
兩個MOS管一個P-MOS管一個N-MOS管使得這部分可以進行有推挽輸出和開漏輸出,簡單table about一下推挽輸出和開漏輸出,推挽輸出你可以簡單理解為兩個MOS管都工作,輸入高電平(3.3V)時P-MOS管導通I/O口輸出高電平,輸入低電平時N-MOS管導通I/O口輸出低電平(0V),而開漏輸出就只有N-MOS管工作,所以在這個模式下當輸入輸入低電平時N-MOS管導通I/O口輸出低電平(0V),輸入高電平時,I/O口輸出狀態為高阻態(就時那種不穩定的電平)。
應用場合:
推挽輸出主要用在比如說經典之光流水燈,有源蜂鳴器等需要快速切換狀態的場合。
開漏輸出主要用在一些比如IIC等這些通訊場合。
③輸出數據寄存器
我們上面一直說“當輸入XX電平”,大家是不是會有疑問這個電平從哪里來呢,別急這就來說。這個電平就來自前面的這個輸出數據寄存器,它是由ODR這個寄存器來進行控制,也就是我們可以通過控制這個寄存器來改變輸出端口的電平。ODR這個寄存器具體控制操作去瞅瞅官方工作手冊,這里就不再展開了。
④復用輸出
我們在學習51單片機的時候,就知道經典的STC89C51 P3端口具有第二功能,比如P3.0 P3.1端口既可以作為普通的I/O口又可以進行串口通訊,我們32單片機I/O口同樣具有第二功能,我們把它稍微的美化了一下叫端口復用。
⑤輸入數據寄存器
單片機的I/O口通過上面的兩個電阻可以被配置為上拉和下拉輸入,經過施密特觸發器轉化為0,1信號存儲在輸入數據寄存器中,通過IDR寄存器就可以知道該引腳電平的狀態。
⑥復用輸入
和復用輸出類似,把輸入的信號傳給其他的寄存器,共其他外設讀取。
⑦模擬輸入
當I/O口用來采集模擬信號的時候,就必須啊將端口設置為模擬輸入模式,信號就不再經過施密特觸發器,直接進入響應的片上外設。
好了到這里STM32的GPIO的結構就說完了,這是我個人在學習后的理解,里面可能有說的不深入的地方(悄悄說一聲我是有硬件基礎),這個得自己去補充硬件基礎了!
下面我列舉一下關于GPIO的工作模式,這些工作模式最好我們還是去記住他,如果英文好,根本不需要記,就可以直接的翻譯出來
最后附上常用的操作GPIO的函數(HAL庫)
1 HAL_GPIO_Writepin函數
HAL_GPIO_Writepin(GPIOX ,GPIO_PIN_X, GPIO_PIN_SET/RESET);
向X引腳寫入高電平/低電平
2 HAL_GPIO_Readpin函數
HAL_GPIO_Readpin(GPIOX ,GPIO_PIN_X);
讀取X引腳電平狀態
3 HAL_GPIO_Togglepin(GPIOX ,GPIO_PIN_X);
使X引腳狀態反轉