(洛陽(yáng)師范學(xué)院信息技術(shù)學(xué)院 河南·洛陽(yáng) 471934)
輸入/輸出端口是STM32微控制器最基本的片上外設(shè)。I/O端口工作在輸入狀態(tài)時(shí),既可接收數(shù)字信號(hào),亦可接收模擬信號(hào);I/O端口工作在輸出狀態(tài)時(shí),根據(jù)程序的運(yùn)行結(jié)果,輸出驅(qū)動(dòng)外部負(fù)載工作。STM32的常規(guī)輸入/輸出 GPIO 具有浮空輸入、上拉輸入、下拉輸入、模擬輸入、推挽輸出、開(kāi)漏輸出、復(fù)用推挽輸出、復(fù)用開(kāi)漏輸出8種工作模式,根據(jù)用戶需要進(jìn)行編程設(shè)置。
STM32F103ZET6具有7組I/O端口,PA~PG,每組端口16位,共112個(gè)I/O口。這些端口大都具有多重功能,既可作為常規(guī)I/O端口,又可編程為其它功能,如EXTI引腳、ADC通道引腳、SPI引腳、FSMC引腳、USART引腳等。
輸入/輸出端口電路是可編程的,主要由保護(hù)電路、輸入驅(qū)動(dòng)器、輸出驅(qū)動(dòng)器、輸入數(shù)據(jù)寄存器和輸出數(shù)據(jù)寄存器等構(gòu)成,如圖1所示。STM32F103ZET6具有112個(gè)這樣的 I/O端口電路。
保護(hù)電路中的兩個(gè)保護(hù)二極管,防止I/O引腳輸入過(guò)高、過(guò)低的電壓,燒毀芯片。因此I/O端口不能直接外接大功率器件。輸入驅(qū)動(dòng)器(Inputdriver)由TTL施密特觸發(fā)器構(gòu)成,相當(dāng)于一個(gè)開(kāi)關(guān),把I/O端口的電平狀態(tài)通過(guò)觸發(fā)器送入輸入數(shù)據(jù)寄存器。
輸出驅(qū)動(dòng)器(Output driver)由選擇器、輸出控制、含有PMOS管和N-MOS管的推挽結(jié)構(gòu)電路組成,輸出控制的輸出是一對(duì)互補(bǔ)信號(hào),推挽結(jié)構(gòu)電路由互補(bǔ)信號(hào)控制,工作時(shí)兩個(gè)管只有一個(gè)導(dǎo)通,功耗低。輸出數(shù)據(jù)寄存器輸出高電平時(shí),控制輸出亦為高電平,此時(shí)P-MOS管導(dǎo)通、N-MOS管截止,I/O端口輸出高電平;輸出數(shù)據(jù)寄存器輸出低電平時(shí),控制輸出亦為低電平,那么P-MOS管截止、N-MOS管導(dǎo)通,I/O端口輸出低電平。I/0端口輸出的狀態(tài)即是輸出數(shù)據(jù)寄存器的狀態(tài)。
輸入工作模式有浮空輸入、上拉輸入、下拉輸入、模擬輸入4種。浮空輸入時(shí),引腳內(nèi)部什么也不用接,I/O的端口狀態(tài)取決于用于外部信號(hào);上拉輸入時(shí),上拉開(kāi)關(guān)閉合,將不確定的信號(hào)通過(guò)內(nèi)部電阻上拉到高電平,適用于輸入信號(hào)為低電平有效的情況;下拉輸入時(shí),下拉開(kāi)關(guān)閉合,將不確定的信號(hào)通過(guò)內(nèi)部電阻接GND,適用于輸入信號(hào)為高電平有效的情況;模擬輸入時(shí),把連續(xù)的模擬信號(hào)直接引入,常用于AD轉(zhuǎn)換。注意,輸入模式下,輸出驅(qū)動(dòng)器不工作,相當(dāng)于斷開(kāi)。
圖1:可編程I/O端口電路的基本結(jié)構(gòu)
圖2:端口配置低寄存器的設(shè)置位
圖3:重映射和調(diào)試I/O配置寄存器的設(shè)置位
輸出工作模式有推挽輸出、開(kāi)漏輸出、復(fù)用推挽輸出和復(fù)用開(kāi)漏輸出4種。推挽輸出時(shí),可以輸出高/低電平,處理的是數(shù)字信號(hào),輸出高電平時(shí),P-MOS管導(dǎo)通,N-MOS管截止,I/O端口聯(lián)通VDD,輸出低電平時(shí),N-MOS管導(dǎo)通,P-MOS管截止,I/O端口聯(lián)通VSS;開(kāi)漏輸出時(shí),P-MOS管是關(guān)閉狀態(tài),無(wú)法直接輸出高電平,需要外接上拉電阻,輸出電壓由上拉電阻連接的電源決定,輸出低電平時(shí),和推挽輸出一樣,I/O端口聯(lián)通VSS,因此開(kāi)漏輸出模式適用于匹配電平的工況;復(fù)用推挽輸出和復(fù)用開(kāi)漏輸出用于其它片內(nèi)外設(shè)。注意,輸出模式下,輸入驅(qū)動(dòng)器工作,開(kāi)關(guān)閉合,可讀取I/O端口的狀態(tài)。
GPIO是常規(guī)輸入/輸出端口,STM32F103ZET6有7組16位的GPIO,通過(guò)對(duì)GPIO寄存器編程,設(shè)置每個(gè)端口的工作模式。GPIO寄存器包括端口配置低寄存器(GPIOX_CRL)、端口配置高寄存器 (GPIOX_CRH)、輸入數(shù)據(jù)寄存器 (GPIOX_IDR)、輸出數(shù)據(jù)寄存器(GPIOX_ODR)、端口位設(shè)置/清除寄存器(GPIOX_BSRR)、端口位清除寄存器(GPIOX_BRR)、端口配置鎖定寄存器(GPIOX_LCKR),均為32位寄存器(有的帶保留位),所有x的范圍為(A~G),A~G標(biāo)識(shí)的是分組號(hào)。例如,GBIOB_CRL是B組的GPIO端口配置低寄存器,GPIOC_CRL是C組GPIO的端口配置低寄存器。
端口配置低寄存器(GPIOX_CRL)用于設(shè)置各組GPIO低8位端口的工作模式,寄存器的各設(shè)置位如圖2所示,每位均可讀寫(xiě),每4位設(shè)置1位端口,其中低兩位設(shè)置輸入或輸出(00表示輸入模式,也是復(fù)位后的值;01表示輸出模式,最大速度10MHZ;10表示輸出模式,最大速度2MHZ;11表示輸出模式,最大速度50MHZ),高兩位設(shè)置具體工作模式(輸入模式時(shí),00表示模擬輸入,01表示浮空輸入,也是復(fù)位后的值,10表示上拉/下拉輸入,聯(lián)合設(shè)置輸出數(shù)據(jù)寄存器ODR,區(qū)分上拉和下拉,11為保留;輸出模式時(shí),00表示通用推挽輸出,01表示通用開(kāi)漏輸出,10表示復(fù)用推挽輸出,11表示復(fù)用開(kāi)漏輸出)。例如,當(dāng)設(shè)置GPIOA5為通用推挽輸出模式時(shí),GPIOA的端口配置低寄存器的內(nèi)容可以設(shè)置為0x4424 4444。
端口配置高寄存器(GPIOX_CRH)用于設(shè)置各組GPIO高8位端口的工作模式,同GPIOX_CRL設(shè)置一樣,不再贅述。輸入數(shù)據(jù)寄存器(GPIOX_IDR),只讀屬性,高16位保留,16位形式讀出,讀出的值為對(duì)應(yīng)I/O端口的狀態(tài)。輸出數(shù)據(jù)寄存器(GPIOX_ODR),讀/寫(xiě)屬性,高 16 位保留,16 位形式讀/寫(xiě),可以對(duì)各位清零或置1,那么對(duì)應(yīng)的I/O端口便可以輸出高電平或低電平。端口位設(shè)置/清除寄存器、端口位清除寄存器是用于為輸出數(shù)據(jù)寄存器ODR的對(duì)應(yīng)位清零或置1,不再贅述。端口配置鎖定寄存器用來(lái)鎖定端口位的配置,當(dāng)對(duì)應(yīng)的端口位鎖定后,在下次系統(tǒng)復(fù)位之前不能再更改端口位的配置。
具有復(fù)用功能的I/O端口,其復(fù)用功能需要重新配置。例如,配置某個(gè)I/O端口為ADC的通道,這個(gè)I/O端口不能再作為GPIO使用,這個(gè)過(guò)程叫做復(fù)用重映射。復(fù)用重映射的過(guò)程是設(shè)置重映射和調(diào)試I/O配置寄存器(AFIO_MAPR),寄存器的各設(shè)置位如圖3所示。
利用輸入/輸出端口可實(shí)現(xiàn)一些信號(hào)控制,例如,STM32外接了按鍵電路和LED指示燈電路,控制要求如下:當(dāng)按下S1按鍵時(shí),讓LED1和LED3燈閃爍,按下S2按鍵時(shí)LED1和LED3燈關(guān)閉;當(dāng)按下S3按鍵時(shí),讓LED2和LED4燈閃爍,按下S4按鍵時(shí)LED2和LED4燈關(guān)閉。按鍵電路如圖4所示,LED指示燈電路如圖5所示。
圖4 LED指示燈電路
圖5:按鍵電路
圖4中的4個(gè)LED為共陽(yáng)極接法,另一端分別接了I/O端口B組的PB5口、E組的PE5口、A組的PA5和PA6,當(dāng)這些端口輸出低電平時(shí),對(duì)應(yīng)的LED指示燈亮,反之LED指示燈不亮。根據(jù)外接指示燈電路分析,這4個(gè)I/O端口的工作模式應(yīng)設(shè)置為通用推挽輸出。
圖5中的4個(gè)按鍵開(kāi)關(guān)分別接了I/O端口A組的PA0口和 E 組的 PE2、PE3、PE4口,其中 S1、S2、S3 是低電平信號(hào)有效,無(wú)信號(hào)時(shí)為高電平,而S4是高電平信號(hào)有效,無(wú)信號(hào)時(shí)為低電平。根據(jù)外接按鍵電路分析,這4個(gè)I/O端口的工作模式應(yīng)設(shè)置為浮空輸入。
LED指示燈對(duì)應(yīng)I/O端口的設(shè)置(初始化)如下:
4個(gè)按鍵對(duì)應(yīng)I/O端口的設(shè)置(初始化)如下:
以上代碼中RCC、GPIOA、GPIOB、GPIOE被定義為結(jié)構(gòu)體類型指針,對(duì)它們的各寄存器地址進(jìn)行了描述,并且對(duì)相應(yīng)的寄存器進(jìn)行了設(shè)置,按照要求實(shí)現(xiàn)了浮空輸入和通用推挽輸出的設(shè)置。
對(duì)于STM32的輸入/輸出端口設(shè)置,應(yīng)先了解I/O端口的電路結(jié)構(gòu)和工作模式,之后按使用要求對(duì)GPIO和AFIO寄存器進(jìn)行合理配置,通過(guò)I/O端口使用的例子進(jìn)一步掌握輸入/輸出端口的使用。