




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
GPIO8.1GPIO概述8.2利用寄存器直接控制GPIO的應(yīng)用實例8.3利用庫函數(shù)控制GPIO的應(yīng)用實例8.1GPIO概述8.1.1GPIO的概念 1.GPIO是什么 2.STM32引腳分類 3.如何查找GPIO功能
1.GPIO是什么GPIO(generalpurposeintputoutput)是通用輸入輸出端口的簡稱,可以通過軟件來控制其輸入和輸出。STM32芯片的GPIO引腳與外部設(shè)備連接起來,從而實現(xiàn)與外部通訊、控制以及數(shù)據(jù)采集的功能。2.STM32引腳分類電源管腳晶振管腳復(fù)位管腳下載管腳BOOT管腳GPIO管腳3.如何查找GPIO功能通過STM32F103ZET6芯片數(shù)據(jù)手冊即可查找本講主要內(nèi)容8.1.2GPIO的結(jié)構(gòu)框圖
西安文理學(xué)院自動化教研室圖中最右端I/O端口就是STM32芯片的引腳,其它部分都在STM32芯片內(nèi)部。上圖中我們將每部分都用紅線圈起來標(biāo)號了,按照順序我們逐一講解。1.GPIO基本結(jié)構(gòu)
(1)保護二極管引腳內(nèi)部加上這兩個保護二級管可以防止引腳外部過高或過低的電壓輸入,
當(dāng)引腳電壓高于VDD_FT或VDD時,上方的二極管導(dǎo)通吸收這個高電壓,當(dāng)引腳電壓低于VSS時,下方的二極管導(dǎo)通,防止不正常電壓引入芯片導(dǎo)致芯片燒毀。(2)上下拉電阻
從圖中可以看到,上拉和下拉電阻上都有一個開關(guān),通過配置上下拉電阻開
關(guān),可以控制引腳的默認狀態(tài)電平。當(dāng)開啟上拉時引腳默認電壓為高電平,開啟下拉時,引腳默認電壓為低電平,這樣就可以消除引腳不定狀態(tài)的影響。當(dāng)然也可以將上拉和下拉的開關(guān)都關(guān)斷,這種狀態(tài)我們稱為浮空模式,一旦配置成這個模式,引腳的電壓是不確定的,如果用萬用表測量此模式下管腳電壓時會發(fā)現(xiàn)只有1點幾伏,而且還不時改變,所以一般情況下我們都會給引腳設(shè)置成上拉或者下拉模式,使它有一個默認狀態(tài)。
1.GPIO基本結(jié)構(gòu)
(3)P-MOS和N-MOS管
GPIO引腳經(jīng)過兩個保護二極管后就分成兩路,上面一路是“輸入模式”,
下面一路是“輸出模式”。我們先講輸出模式,線路經(jīng)過一個由P-MOS和N-MOS管組成的單元電路,這讓GPIO引腳具有了推挽和開漏兩種輸出模式。
所謂推挽輸出模式,是根據(jù)P-MOS和N-MOS管的工作方式命名的。在該結(jié)構(gòu)單元輸入一個高電平時,P-MOS管導(dǎo)通,N-MOS管截止,對外輸出高電平(3.3V)。
在該單元輸入一個低電平時,P-MOS管截止,N-MOS管導(dǎo)通,對外輸出低電平(0V)。
如果當(dāng)切換輸入高低電平時,兩個MOS管將輪流導(dǎo)通,一個負責(zé)灌電流(電流輸出到負載),一個負責(zé)拉電流(負載電流流向芯片),使其負載能力和開關(guān)速度都比普通的方式有很大的提高。右圖為推挽輸出模式的等效電路。
1.GPIO基本結(jié)構(gòu)
在開漏輸出模式時,不論輸入是高電平還是低電平,P-MOS管總處于關(guān)閉狀態(tài)。當(dāng)給這個單元電路輸入低電平時,N-MOS管導(dǎo)通,輸出即為低電平。當(dāng)輸入高電平時,N-MOS管截止,這個時候引腳狀態(tài)既不是高電平,又不是低電平,我們稱之為高阻態(tài)。如果想讓引腳輸出高電平,那么引腳必須外接一個上拉電阻,由上拉電阻提供高電平。開漏輸出模式等效電路圖如右圖所示。
在開漏輸出模式中還有一個特點,引腳具有“線與”關(guān)系。就是說如果有很多個開漏輸出模式的引腳接在一起,只要有一個引腳為低電平,其他所有管腳都為低,即把所有引腳連接在一起的這條總線拉低了。只有當(dāng)所有引腳輸出高阻態(tài)時這條總線的電平才由上拉電阻的VDD決定。如果VDD連接的是3.3V,那么引腳輸出的就是3.3V,如果VDD連接的是5V,那么引腳輸出的就是5V。因此如果想要讓STM32管腳輸出5V,可以選擇開漏輸出模式,然后在外接上拉電阻的電源VDD選擇5V即可,前提是這個STM32引腳是容忍5V的。開漏輸出模式一般應(yīng)用在I2C、SMBUS通訊等需要“線與”功能的總線電路中。還可以用在電平不匹配的場合中,就如上面說的輸出5V一樣。
1.GPIO基本結(jié)構(gòu)
(4)輸出數(shù)據(jù)寄存器
前面提到的雙MOS管結(jié)構(gòu)電路的輸入信號,是由GPIO“輸出數(shù)據(jù)寄存器
GPIOx_ODR”提供的,因此我們通過修改輸出數(shù)據(jù)寄存器的值就可以修改GPIO引腳的輸出電平。而“置位/復(fù)位寄存器GPIOx_BSRR”可以通過修改輸出數(shù)據(jù)寄存器的值從而影響電路的輸出。(5)復(fù)用功能輸出
由于STM32的GPIO引腳具有第二功能,因此當(dāng)使用復(fù)用功能的時候,也就是通過其他外設(shè)復(fù)用功能輸出信號與GPIO數(shù)據(jù)寄存器一起連接到雙MOS管電路的輸入,其中梯形結(jié)構(gòu)是用來選擇使用復(fù)用功能還是普通IO口功能。例如使用USART串口通訊時,需要用到某個GPIO引腳作為通訊發(fā)送引腳,這個時候就可以把該GPIO引腳配置成USART串口復(fù)用功能,由串口外設(shè)控制該引腳,發(fā)送數(shù)據(jù)。
(6)輸入數(shù)據(jù)寄存器
輸入數(shù)據(jù)寄存器是由IO口經(jīng)過上下拉電阻、施密特觸發(fā)器引入。當(dāng)信號經(jīng)
過觸發(fā)器,模擬信號將變?yōu)閿?shù)字信號0或1,然后存儲在輸入數(shù)據(jù)寄存器中,通過讀取輸入數(shù)據(jù)寄存器GPIOx_IDR就可以知道IO口的電平狀態(tài)。
1.GPIO基本結(jié)構(gòu)
(7)復(fù)用功能輸入
此模式與前面講解的復(fù)用功能輸出類似。在復(fù)用功能輸入模式時,GPIO引
腳的信號傳輸?shù)絊TM32其他片上外設(shè),由該外設(shè)讀取引腳的狀態(tài)。同樣,如我們使用USART串口通訊時,需要用到某個GPIO引腳作為通訊接收引腳,這個時候就可以把該GPIO引腳配置成USART串口復(fù)用功能,使USART可以通過該通訊引腳的接收遠端數(shù)據(jù)。(8)模擬輸入輸出
當(dāng)GPIO引腳用于ADC采集電壓的輸入通道時,用作“模擬輸入”功能,
此時信號是不經(jīng)過施密特觸發(fā)器的,因為經(jīng)過施密特觸發(fā)器后信號只有0、1兩種狀態(tài),ADC外設(shè)要采集到原始的模擬信號,信號源輸入必須在施密特觸發(fā)器之前。類似地,當(dāng)GPIO引腳用于DAC作為模擬電壓輸出通道時,此時作為“模擬輸出”功能,DAC的模擬信號輸出就不經(jīng)過雙MOS管結(jié)構(gòu)了,模擬信號直接通過管腳輸出。
1、輸入模式(輸入浮空、輸入上拉、輸入下拉
模擬輸入)
2、輸出模式(開漏輸出、開漏復(fù)用功能、推挽式輸出、推挽式復(fù)用功能)
8.1.3GPIO的工作模式輸入浮空模式輸入上拉模式輸入下拉模式模擬輸入模式開漏輸出模式開漏復(fù)用輸出模式推挽輸出模式推挽復(fù)用輸出模式總結(jié):(1)推挽輸出a.可以輸出高低電平,用于連接數(shù)字器件,高電平由VDD決定,低電平由VSS決定。b.推挽結(jié)構(gòu)指兩個三極管受兩路互補的信號控制,總是在一個導(dǎo)通的時候另外一個截止,優(yōu)點開關(guān)效率效率高,電流大,驅(qū)動能力強。c.輸出高電平時,電流輸出到負載,叫灌電流,可以理解成推,輸出低電平時,負載電流流向芯片,叫拉電流,即挽。(2)開漏輸出a.只能輸出低電平,不能輸出高電平。如果要輸出高電平,則需要外接上拉。b.開漏輸出具有“線與”功能,一個為低,全部為低,多用于I2C和SMBUS總線。8.2利用寄存器直接控制GPIO的應(yīng)用實例實例:使用寄存器點亮一個LED本講主要內(nèi)容 1.LED模塊電路 2.STM32啟動文件 3.編寫點亮一個LED程序
1.LED模塊電路本節(jié)要實現(xiàn)的功能是點亮DS0發(fā)光二極管,即讓STM32的PB5管腳輸出一個低電平。
2.STM32啟動文件
啟動文件里邊是使用匯編語言寫好了基本程序,當(dāng)STM32芯片上電啟動的時候,首先會執(zhí)行這里的匯編程序,從而建立起C語言的運行環(huán)境,所以把這個文件稱為啟動文件。對于啟動文件這部分我們主要總結(jié)它的功能,不詳細講解里面的代碼,其功能如下:初始化堆棧指針SP;
初始化程序計數(shù)器指針PC;
設(shè)置堆棧的大小;設(shè)置中斷向量表的入口地址;配置外部SRAM作為數(shù)據(jù)存儲器;調(diào)用SystemInit()函數(shù)配置STM32的系統(tǒng)時鐘。設(shè)置C庫的分支入口“__main”(最終用來調(diào)用main()
函數(shù));實驗程序
下面就開始使用寄存器來操作STM32使PB5輸出一個低電平。要操作STM32寄存器,就需要使用C語言對其封裝,這部分程序都放在stm32f10x.h中。具體代碼如下:#definePERIPH_BASE((unsignedint)0x40000000)#defineAPB2PERIPH_BASE(PERIPH_BASE+0x00010000)#defineGPIOB_BASE(APB2PERIPH_BASE+0x0C00)#defineGPIOB_CRL *(unsignedint*)(GPIOB_BASE+0x00)#defineGPIOB_CRH *(unsignedint*)(GPIOB_BASE+0x04)#defineGPIOB_IDR *(unsignedint*)(GPIOB_BASE+0x08)#defineGPIOB_ODR *(unsignedint*)(GPIOB_BASE+0x0C)#defineGPIOB_BSRR *(unsignedint*)(GPIOB_BASE+0x10)#defineGPIOB_BRR *(unsignedint*)(GPIOB_BASE+0x14)#defineGPIOB_LCKR *(unsignedint*)(GPIOB_BASE+0x18)#defineAHBPERIPH_BASE(PERIPH_BASE+0x20000)#defineRCC_BASE (AHBPERIPH_BASE+0x1000)#defineRCC_APB2ENR *(unsignedint*)(RCC_BASE+0x18)要控制PB5輸出低電平,需知道GPIO這個外設(shè)它是掛接在哪個總線上的,
通過Block2外設(shè)基地址及APB2總線的偏移地址就可以得到APB2外設(shè)的基地址。GPIO就是掛接在APB2總線上的,根據(jù)GPIOB的偏移地址就可以得到GPIOB外設(shè)的基地址,GPIOB外設(shè)內(nèi)部含有很多個寄存器,比如GPIOB_CRL、GPIOB_CRH端口配置寄存器、GPIOB_BSRR置位復(fù)位寄存器等,通過他們各自的偏移地址就可以獲取對應(yīng)的寄存器地址,然后要操作地址里面的內(nèi)容就需要使用到指針,將其強制轉(zhuǎn)換為unsignedint*指針類型,然后在通過一個*指針來操作該地址里面的內(nèi)容。在STM32中凡是使用到外設(shè)功能,都要使能對應(yīng)的外設(shè)時鐘,否則即使配置好端口初始化也無法正常使用。因此還需要知道時鐘RCC外設(shè)的基地址,通過《STM32F103ZET6數(shù)據(jù)手冊》“4Memorymapping”的“存儲器映射”章節(jié)可以知道RCC時鐘外設(shè)是掛接在AHB總線上,根據(jù)其偏移值可以得到RCC時鐘外設(shè)的基地址,然后可通過《STM32F1xx中文參考手冊》的“6小容量、中容量和大容量產(chǎn)品的復(fù)位和時鐘控制(RCC)”的“6.3.7APB2外設(shè)時鐘使能寄存器(RCC_APB2ENR)”可找到對應(yīng)的端口RCC使能寄存器,只要將GPIOC端口時鐘使能即可。
使用C語言封裝好寄存器后,就開始編寫main函數(shù),打開main.c文件,程序代碼如下:
#include"stm32f10x.h"
voidSystemInit(void){}
intmain(){RCC_APB2ENR|=1<<3;
GPIOB_CRL&=~(0x0F<<(4*5));
GPIOB_CRL|=(3<<4*5);
GPIOB_BSRR=(1<<(16+5));
while(1)
{}}
(1)包含stm32f10x.h頭文件,在這個頭文件中我們定義的都是寄存器,
因此如果要在其他文件中使用這些寄存器就需要把這個頭文件包含進來,否則編譯就會報錯。
(2)SystemInit函數(shù),在前面講解啟動文件時已經(jīng)說明,程序運行的時候
先進入這個函數(shù)進行STM32的初始化,如果不寫這個函數(shù)編譯器就會報錯。這里我們編寫這個函數(shù),里面并不對其操作。
(3)開啟GPIOB時鐘。要使PB5正常工作輸出一個低電平,必須要打開它的時鐘。RCC_APB2ENR寄存器是在stm32f10x.h頭文件中定義好的,只要查下《STM32F1xx中文參考手冊》RCC時鐘使能寄存器內(nèi)容就可以知道此寄存器的第3位是控制GPIOB外設(shè)的時鐘使能位,只有該位為1時才使能,如果為0即關(guān)閉GPIOB時鐘。所以要讓1左移3位。
(4)配置GPIOB為通用推挽輸出模式。STM32的GPIO模式有很多,可根據(jù)CRx寄存器設(shè)置,CRL對應(yīng)GPIO的低8位,CRH對應(yīng)GPIO的高8位。如果不是特殊需求,一般輸出采用推完輸出模式。要讓PB5管腳輸出一個低電平,故使用推挽輸出模式。只要查下《STM32F1xx中文參考手冊》GPIO配置寄存器內(nèi)容就可以知道此寄存器內(nèi)每4位控制一個管腳。
(5)使PB5輸出低電平。GPIOB_BSRR為置位復(fù)位寄存器,只要查下
GPIO置位復(fù)位寄存器內(nèi)容就可以知道,其高16位用于復(fù)位,如果當(dāng)高16位某位為1,表示那一位管腳輸出低電平,為0不影響其輸出電平。如果當(dāng)?shù)?6位的某位為1,表示那一位管腳輸出高電平,為0不影響其輸出電平。所以要讓1左移16+5位。
8.3利用庫函數(shù)控制GPIO的應(yīng)用實例實例:使用庫函數(shù)點亮一個LED本講主要內(nèi)容 1.LED模塊硬件電路 2.GPIO庫函數(shù)介紹 3.GPIO初始化步驟 4.使用庫函數(shù)編寫點亮LED程序
1.LED模塊硬件電路本節(jié)我們所要實現(xiàn)的功能是點亮DS0發(fā)光二極管,即讓STM32的PB5管腳輸出一個低電平。
2.GPIO庫函數(shù)介紹(1)GPIO外設(shè)的庫文件: stm32f10x_gpio.c、
stm32f10x_gpio.h(2)GPIO常用庫函數(shù)<1>初始化函數(shù)voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct)功能:初始化一個或多個IO口(同一組端口)的工作模式、輸出速度即GPIO的2個配置寄存器。打開庫函數(shù)工程模板進行講解。初始化范例: GPIO_InitTypeDefGPIO_InitStructure;//定義結(jié)構(gòu)體變量
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//選擇你要設(shè)置的IO口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//設(shè)置推挽輸出模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //設(shè)置傳輸速率 GPIO_Init(GPIOC,&GPIO_InitStructure);/*初始化GPIO*/
可以一次對多個管腳進行初始化,前提必須是它們的配置模式需一樣。比如:
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;<2>設(shè)置管腳輸出電平函數(shù)voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);功能:設(shè)置某個IO口為高電平(可同時設(shè)置同一端口的多個IO)。底層是通過配置BSRR寄存器。voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);功能:設(shè)置某個IO口為低電平(可同時設(shè)置同一端口的多個IO)。底層是通過配置BSRR寄存器。voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitActionBitVal);voidGPIO_Write(GPIO_TypeDef*GPIOx,uint16_tPortVal);功能:設(shè)置端口管腳輸出電平。<3>讀取管腳輸入電平函數(shù)uint8_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);功能:讀取端口中的某個管腳輸入電平。底層是通過讀取IDR寄存器。uint16_tGPIO_ReadInputData(GPIO_TypeDef*GPIOx);功能:讀取某組端口的輸入電平。底層是通過讀取IDR寄存器。<4>讀取管腳輸出電平函數(shù)uint8_tGPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);功能:讀取端口中的某個管腳輸出電平。底層是通過讀取ODR寄存器。uint16_tGPIO_ReadOutputData(GPIO_TypeDef*GPIOx);功能:讀取某組端口的輸出電平。底層是通過讀取ODR寄存器(3)使能GPIO時鐘函數(shù)voidRCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph,FunctionalStateNewState);不同的外設(shè)調(diào)用的時鐘使能函數(shù)可能不一樣例如使能GPIOC端口時鐘如下:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);3.GPIO初始化步驟(1)使能對應(yīng)的GPIO端口時鐘(2)初始化GPIO4.使用庫函數(shù)編寫點亮LED程序本章所要實現(xiàn)的功能是:點亮D1指示燈。程序框架如下:
(1)初始化系統(tǒng)時鐘,默認配置為72MHz;
(2)初始化DS0對應(yīng)的GPIO相關(guān)參數(shù),并使能GPIOB時鐘;
(3)點亮DS0。
(1)系統(tǒng)時鐘初始
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 遼陽古建施工方案審批
- 2024年三季度報湖南地區(qū)A股銷售凈利率排名前十大上市公司
- 快船新球館施工方案
- (教研室)福建省寧德市2024-2025學(xué)年高二上學(xué)期期末考試語文試題
- 揚塵施工方案
- 預(yù)制濾板施工方案
- 2025年柳工營銷面試題及答案
- 6年級上冊20課青山不老課堂筆記
- 教育教學(xué)評價表
- 低空經(jīng)濟產(chǎn)業(yè)專項引導(dǎo)基金
- 《鐵路軌道維護》課件-道岔改道作業(yè)
- 2024解析:第十四章內(nèi)能的利用-基礎(chǔ)練(解析版)
- 《制造業(yè)信息化》課件
- 湘教版地理八年級下冊 期末綜合測試卷(二)(含答案)
- 2024年度股權(quán)激勵代持協(xié)議
- 北師大版(2024新版)七年級上冊數(shù)學(xué)全冊教案
- 2024年上海市安全員B證(項目負責(zé)人)考試試題題庫
- 食品安全、消防安全、交通安全
- 建筑施工企業(yè)新員工三級安全教育培訓(xùn)
- 變頻器實訓(xùn)報告
- 無人機團體培訓(xùn)課件
評論
0/150
提交評論