【速成1】【GD32F103VET6】模塊一GPIO口的輸出功能-LED燈的閃爍

項(xiàng)目一 GD32的GPIO口的輸出功能-LED0閃爍實(shí)驗(yàn)
硬件: 深圳標(biāo)航科技有限公司 暴風(fēng) 開發(fā)板
處理器:GD32F103VET6
開發(fā)環(huán)境:MDK(keil 5) + STM32CubeMX

1.1 GD32F103VET6的IO引腳圖
??? 由于GD32和STM32是PIN對(duì)PIN的,他們的引腳排列、封裝、大小都完全相同,所以GD32F103VET6的引腳結(jié)構(gòu)與STM32F103VET6完全一樣,由于大家都對(duì)STM32比較熟悉,所以這里直接采用STM32F103VET6的引腳圖當(dāng)做GD32F103VET6的引腳圖,該引腳圖如圖1所示。

??? 由圖可見,GD32F103VET6 (在后續(xù)介紹中,簡(jiǎn)寫為GD32)一共有100個(gè)引腳,其中既可以做輸入,也可以做輸出的引腳(成為IO引腳)一共有80個(gè),這80個(gè)引腳分為PA、PB、PC、PD和PE一共5組,每組包含16個(gè)引腳。在圖1中,這些IO引腳的顏色為灰色。
??? 我們?cè)赟TM32CubeMX的引腳搜索框中輸入某組引腳名,可以看到該組引腳會(huì)閃爍,閃爍時(shí)顏色為灰色和黑色交替變化。例如,我們?cè)谝_搜索框中輸入PE,可以看到變?yōu)楹谏珪r(shí)的效果如圖2所示。

??? 如果輸入的是具體的某一個(gè)引腳,比如PE12,可以看到PE12閃爍,顏色也是灰色和黑色交替變化。將鼠標(biāo)移到PE12的上方用左鍵點(diǎn)擊,會(huì)彈起PE12引腳的功能列表如圖3所示。

??? 可以看到,PE12除了作為輸入(GPIO_Input)和輸出(GPIO_Output)外,還有其他7種功能。處理器的IO引腳除了可以作為輸入輸出引腳外,還能夠作為其他模塊,比如定時(shí)器的輸出、SPI模塊的引腳、串口的功能引腳等功能,具有“通用性”,所以這類引腳我們用通用IO引腳來(lái)描述,叫GPIO引腳,以區(qū)別于功能比較單一的如51單片機(jī)之類的IO引腳。
1.2 GD32的引腳輸出功能應(yīng)用配置
??? 將GD32的GPIO引腳配置為輸出后,可以讓該引腳輸出高電平或者低電平以控制外部電路。
比如,如圖4所示的LED燈電路,LED的陽(yáng)極接3.3V,陰極接PE12,由二極管的單向?qū)щ娦钥芍?,要想讓LED0亮,我們應(yīng)該讓PE12輸出低電平。

??? 又如,如圖5所示的有源蜂鳴器(有源蜂鳴器是有電流流過(guò)蜂鳴器時(shí),蜂鳴器會(huì)發(fā)聲)電路,要想有源蜂鳴器響,則應(yīng)該讓電流流過(guò)蜂鳴器,而要想讓蜂鳴器有電流流過(guò),三極管S8050的CE端必須導(dǎo)通,而要想S8050的CE端導(dǎo)通,則必須讓PB2輸出高電平。所以,此時(shí)要配置PB2輸出高電平,蜂鳴器才會(huì)發(fā)聲。

??? 了解了GPIO口的輸出功能后,下面我們通過(guò)一個(gè)例子來(lái)進(jìn)一步學(xué)習(xí)GPIO引腳輸出功能的使用。
【例1】已知LED0與GD32的連接圖如圖4所示,編寫程序,實(shí)現(xiàn)LED0的閃爍效果。
【實(shí)現(xiàn)過(guò)程】
1.配置芯片時(shí)鐘,分為2步。
①.配置芯片高速時(shí)鐘使用外部晶體/陶瓷晶振和GD32的內(nèi)部時(shí)鐘調(diào)整模組配合產(chǎn)生的時(shí)鐘作為芯片主要時(shí)鐘源,其配置過(guò)程如圖6所示。

②.配置芯片系統(tǒng)時(shí)鐘頻率,其配置過(guò)程如圖7所示。

??? 配置好后,HCLK以及定時(shí)器模塊的內(nèi)部時(shí)鐘頻率都為72MHz,而APB1總線和APB2總線掛接的模塊的頻率則為36Mhz。
2.配置調(diào)試選項(xiàng)。在本教程中,我們使用的調(diào)試工具都為如圖8所示的10PIN的ST-link。

??? 這需要在STM32CubeMX的調(diào)試選擇項(xiàng)中選擇調(diào)試方式為Serial wire(串口線),其選擇過(guò)程如圖9所示。

?? 注意:如果不選擇該選項(xiàng),則使用ST-LINK下載程序時(shí),就需要按復(fù)位鍵,然后再在MDK中點(diǎn)擊下載按鈕下載程序。
??? 在圖9中將調(diào)試模式設(shè)置為Serail Wire后,可以看到PA13和PA14這兩個(gè)默認(rèn)的串口下載數(shù)據(jù)和時(shí)鐘引腳會(huì)變?yōu)榫G色,如圖10所示。

3.配置IO引腳。整個(gè)配置過(guò)程步驟為:
(1)找到PE12,將其功能設(shè)置為GPIO_Output(輸出),如圖11所示,設(shè)置好后可以看到PE12變?yōu)榫G色。

(2)配置PE12的輸出功能的其他選項(xiàng),這些選項(xiàng)的配置過(guò)程和含義如圖12所示。

??? 下面我們對(duì)這些選項(xiàng)進(jìn)行逐一介紹。
??? ①GPIO output level。該選項(xiàng)用于初始化IO引腳的電平,有高電平High和低電平Low兩個(gè)選項(xiàng),如果選擇High,則初始化后,LED0將不會(huì)亮;如果選擇Low,則初始化完成后LED0將會(huì)亮。這里我們采用默認(rèn)的Low,當(dāng)STM32CubeMX生成代碼后,編譯并將生成的hex文件下載到開發(fā)板中,可以看到LED亮。
??? ②GPIO mode。該選項(xiàng)為IO引腳做輸出時(shí)其內(nèi)部電路的驅(qū)動(dòng)選項(xiàng),有兩個(gè)選擇,分別為:
??? ●Output Push Pull。該選項(xiàng)為推挽輸出選項(xiàng)。
??? ●Output Drain Open。該選項(xiàng)為開漏輸出選項(xiàng)。
??? 配置為推挽輸出,則IO引腳內(nèi)部的電路為推挽電路,這種電路可以輸出0也可以輸出1。配置為開漏輸出,則IO引腳內(nèi)部的電路為開漏電路,這種電路只能輸出0不能輸出1,要想輸出1則必須在引腳的外面引出一個(gè)上拉電阻或者使能IO引腳內(nèi)部的上拉電阻。開漏輸出一般用于大電流場(chǎng)合,在本教程的例子中,這些IO引腳控制電路都是小電流場(chǎng)合,所以這里我們采用默認(rèn),配置為推挽輸出。
??? ●GPIO Pull-up Pull-down。該選項(xiàng)為上下拉電阻使能選項(xiàng)。GD32/STM32的每個(gè)IO引腳的內(nèi)部都有一對(duì)受控的上拉電阻和下拉電阻,該選項(xiàng)就用于配置是否使能里面的上拉或者下拉電阻,它里面有3個(gè)選擇:
??? ·No Pull-up and No Pull-down。既不使能上拉電阻也不使能下拉電阻。
??? ·Pull-up使能上拉電阻。
??? ·Pull-down使能下拉電阻。
??? 由于內(nèi)部電路的驅(qū)動(dòng)方式使用了推挽方式,所以這里不需要使能上拉電阻也不需要使能下拉電阻,所以我們采用默認(rèn)的選項(xiàng)--GPIO Pull-up Pull-down既不使能上拉也不使能下拉。
??? ●Maximum output speed。該選項(xiàng)用于配置IO引腳的響應(yīng)速度,對(duì)于本教程的低頻場(chǎng)合對(duì)這個(gè)響應(yīng)速度不做要求,所以里面的3個(gè)選項(xiàng)任意選擇一個(gè)即可,這里我們采用默認(rèn)。
??? ●USER Label。該選項(xiàng)為程序員為方便記憶,為引腳取一個(gè)別名的選項(xiàng)。比如本例子中,可以為PE12取名為L(zhǎng)ED0,以方便記憶。不過(guò),這里我們不打算這樣做,而是仍然采用默認(rèn)。
4.配置工程管理
??? 配置工程管理有三個(gè)選項(xiàng),分別是工程Project、代碼生成Code Generator和高級(jí)設(shè)置Advanced Settings三個(gè)選項(xiàng)。下面分別介紹這三個(gè)選項(xiàng)的配置。
??? ①Project。工程選項(xiàng)主要是填寫工程的名字、工程的存放路徑、使用的IDE工具和版本、堆棧設(shè)置等,他們的設(shè)置如圖13所示。

??? ②Code generator。代碼生成選項(xiàng)的配置如圖14所示。

??? ③Advanced Setting。高級(jí)設(shè)置這里使用默認(rèn)設(shè)置即可。
5.點(diǎn)擊Stm32CubeMX右上角的Generate code按鈕,生成代碼,該按鈕如圖15所示。

6.代碼生成后,會(huì)彈出如圖16所示的對(duì)話框。

??? 其中,
??? ①打開文件夾選項(xiàng)。如果點(diǎn)擊該按鈕,將會(huì)打開生成的MDK工程所在的文件夾;
??? ②打開工程選項(xiàng)。如果點(diǎn)擊該選項(xiàng),將會(huì)打開工程。
??? ③關(guān)閉選項(xiàng)。點(diǎn)擊它,將會(huì)關(guān)閉該對(duì)話框。
??? 我們點(diǎn)擊打開工程選項(xiàng),打開工程,然后編譯工程,并將編譯結(jié)果下載到開發(fā)板上,可以看到LED0處于點(diǎn)亮的狀態(tài)。
7.在工程中添加代碼。經(jīng)過(guò)步驟6后,LED0是點(diǎn)亮了,但是例子的目標(biāo)還沒(méi)有實(shí)現(xiàn)。要想實(shí)現(xiàn)例1的目標(biāo),可以在主函數(shù)中采用如下的結(jié)構(gòu):
int main(void)
{
?????????? 系統(tǒng)初始化;
?????????? while(1)
?????????? {
????????????? LED0亮;
????????????? 延時(shí)以便能觀察到燈亮;
????????????? LED0滅;
????????????? 延時(shí)以便能觀察到燈滅;
}
}
??? 注意,如果燈亮或滅的持續(xù)時(shí)間太短,則人眼可能捕捉不到,大家可以試一下。
對(duì)于系統(tǒng)初始化,在使用STM32CubeMX輸出工程時(shí)CubeMX已經(jīng)調(diào)用HAL庫(kù)的函數(shù)/組件進(jìn)行了初始化,我們不用管。那目前的問(wèn)題就是如何使得LED0亮/暗和延時(shí),下面分別介紹。
??? (1)LED0的亮/暗
??? ①亮。使用如下語(yǔ)句來(lái)實(shí)現(xiàn)
??? HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, GPIO_PIN_RESET);
??? ②滅。使用如何語(yǔ)句實(shí)現(xiàn)。
??? HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, GPIO_PIN_SET);
??? 可以看到,設(shè)置IO引腳輸出高低電平可以通過(guò)調(diào)用HAL庫(kù)中的GPIO寫函數(shù)HAL_GPIO_WritePin來(lái)實(shí)現(xiàn),該函數(shù)的最后一個(gè)參數(shù)為IO引腳的狀態(tài),設(shè)置為GPIO_PIN_RESET,則引腳輸出低電平,設(shè)置為GPIO_PIN_SET,則引腳輸出高電平。
??? (2)延時(shí)。
??? HAL庫(kù)提供了一個(gè)基于Systick的延時(shí)函數(shù)—HAL_Delay()。該函數(shù)只有一個(gè)整型參數(shù),它延時(shí)時(shí)以ms為單位,比如如果我們想延時(shí)1S,則參數(shù)應(yīng)該設(shè)置為1000,也即延時(shí)語(yǔ)句應(yīng)該為
?????? HAL_Delay(1000);
??? 最終,main函數(shù)的內(nèi)容如圖17所示。

8.對(duì)工程進(jìn)行編譯,并將結(jié)果下載到開發(fā)板上,可以看到開發(fā)板上的LED0閃爍,每次亮暗持續(xù)時(shí)間各位1S,例1目標(biāo)完成。
1.3 結(jié)論及注意事項(xiàng)
?? 1.對(duì)于GD32的GPIO引腳,每一個(gè)引腳都可以配置為多個(gè)功能,作為輸出時(shí)要配置為GPIO_Output功能。
?? 2.配置為輸出功能時(shí),要配置以下兩個(gè)關(guān)聯(lián)項(xiàng)
?? ①引腳內(nèi)部電路的驅(qū)動(dòng)方式。IO引腳內(nèi)部的驅(qū)動(dòng)方式有兩種,一種是推挽,一種是開漏。非大電流、灌電流的情況下,使用推挽方式,這種方式下引腳可以輸出1也可以輸出0,所以不需要配置上拉電阻/下拉電阻的使能。
?? ②輸出響應(yīng)速度,通常使用默認(rèn)即可。
?? 3.一定要注意在STM32CubeMX中設(shè)置調(diào)試方式,否則使用ST-LINK下載的時(shí)候,你只能按下復(fù)位鍵并同時(shí)按下載,才能下載程序。
?? 4.對(duì)于GD32/stm32的每一個(gè)模塊電路,使用的時(shí)候都要先使能該模塊的時(shí)鐘,不過(guò),在配置STM32CubeMX輸出工程時(shí)沒(méi)有體會(huì)到這一點(diǎn),但是大家一定要警惕。
?? 5.STM32CubeMX在生成代碼時(shí),默認(rèn)調(diào)用的是HAL庫(kù)的函數(shù),HAL庫(kù)的函數(shù)的取名方式為
?? HAL+模塊名稱+模塊動(dòng)作(函數(shù)參數(shù))
?? 比如本項(xiàng)目中學(xué)到的GPIO引腳輸出高低電平的函數(shù)HAL_GPIO_WritePin。
?? 6.HAL庫(kù)的延時(shí)函數(shù)HAL_Delay()的延時(shí)以ms為單位。