0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

敏矽微電子Cortex-M0學習筆記04——GPIO詳解及應用實例

jf_pJlTbmA9 ? 來源:敏矽MCU ? 作者:敏矽MCU ? 2023-09-26 17:07 ? 次閱讀

前面我們已經(jīng)對敏矽微電子的基于cortex m0內(nèi)核的ME32F030R8T6的基本功能做了介紹,然后詳細講解了開發(fā)環(huán)境MDK的安裝,pack包的安裝,工程的建立及程序的仿真,緊接著講解了ME32F030R8T6的時鐘系統(tǒng)。

如果說前面都是基礎(chǔ)知識介紹和理論講解,那么從本篇開始,我們不但會有理論介紹,還會結(jié)合敏矽微電子提供的ME32F030R8T6開發(fā)板進行實例驗證,讓大家看到實例運行的結(jié)果。

1、敏矽微電子Cortex-M0學習筆記04-GPIO詳解及實例

首先我們對ME32F030R8T6芯片的I/O端口做一個大致的了解。

1.1. ME32F030R8T6的GPIO 概述

ME32F030R8T6提供多達 57個 GPIO 管腳。主要的特點有:

? 數(shù)字管腳可以用軟件定義為輸入或輸出

? 管腳讀寫可以被屏蔽

? 多個管腳的置位、清零位用一條指令實現(xiàn)

? 管腳的輸出取反

? 每一個管腳可作為外部中斷信號

? 可編程的中斷觸發(fā)條件及中斷優(yōu)先級

? 所有GPIO管腳在復位后被配置成帶上拉電阻的輸入管腳

MCU的端口除了靈活易用的特點之外,其外設(shè)功能也十分強大。管腳功能由IO控制寄存器配置,除電源管腳,其余管腳均可復用。

系統(tǒng)復位后,管腳功能將被設(shè)置成默認值。

GPIO可以復用的功能如下:LED/LCD 驅(qū)動、觸摸按鍵、ADC、定時器6輸出、定時器7輸出、PWM輸出、UART0、UART1、SPI、I2C。

在使用端口復用功能時,通過 I/O 配置寄存器IOCON對端口進行功能設(shè)置,每個引腳對應的復用功能,請參照官方數(shù)據(jù)手冊的詳細說明。

1.2. ME32F030R8T6的GPIO 寄存器詳解

對于使用過單片機開發(fā)產(chǎn)品的人來說,功能繁多、名稱各異的寄存器應該是最重要也是最令人頭疼的地方,但是沒辦法,想要開發(fā)出功能穩(wěn)定、性能可靠的產(chǎn)品,就必須來硬著頭皮查看各個寄存器的功能和配置方法。

當然,對于ME32F030R8T6來說,官方推出了庫函數(shù),利用這些庫函數(shù)可以不必關(guān)心具體的寄存器就能編寫出合適的程序。但是對于想要深入了解的話,還是要看看寄存器的。

1.2.1. GPIO功能配置寄存器

MCU有一系列的GPIO 控制寄存器來實現(xiàn)對I/O口的靈活控制。

首先我們對 I/O 配置寄存器IOCON做一個介紹,因為它決定著I/O端口的功能選擇和電氣特性。所以需要拿出來單獨進行介紹,該寄存器的每一位的功能如下:

wKgaomUD0z-AI9l0AAGnp2M6mnU839.png

1669788327534308.png

①、管腳功能:

IOCON 寄存器中的 FUNC 位可設(shè)為 GPIO (FUNC = 000) 或外設(shè)功能。如果將管腳配置為 GPIO 管腳,則 DIR 寄存器決定管腳是配置為輸入還是輸出。對于任何外設(shè)功能,會根據(jù)管腳的功能自動控制管腳方向。GPIO 的 DIR 寄存器此時對外設(shè)功能無效。

②、管腳模式:

IOCON 寄存器的 MODE 位允許為每個管腳使能或禁止片內(nèi)上拉電阻。默認情況下,所有管腳的上拉電阻都被使能。

③、管腳驅(qū)動

對于每個正常驅(qū)動管腳,可以選擇兩種電流的輸出驅(qū)動,即低電流模式和高電流模式。用戶可以根據(jù)自己的實際需求進行選擇。

④、開漏模式

所有數(shù)字 I/O 管腳都可為開漏模式。但是請注意,該模式并不是真正的開漏模式。輸入上拉至不能超過VDD。

⑤、模式功能

I/O 管腳可以配置為模擬功能,作為模擬信號的輸出和輸入管腳,例如復用為AD口的時候,可以作為檢測電壓的模擬信號輸入口。

⑤、電壓轉(zhuǎn)換速率模式

在作用AD轉(zhuǎn)換口的時候,可以設(shè)置端口轉(zhuǎn)換速率為快速模式或慢速模式,默認為快速模式。相對于快速模式,慢速模式轉(zhuǎn)滿時間會變長,隨之電流功耗也增大,但時精度會更加精確,根據(jù)應用場景和自身需求,選擇適合的模式。

1.2.2. GPIO控制寄存器總覽

MCU所有的GPIO被分布到4個端口: PA,、PB、PC、PD。每個端口都擁有自己獨立的控制寄存器去管理 GPIO 的功能。下面的表列出了所有的寄存器以供參考。接下來會對每個寄存器做出詳解。

wKgaomUD03-AU1UiAAHaoXVvdwY518.png

wKgaomUD04CAHdJbAACGl8M5mXE464.png

1.2.3. GPIO屏蔽寄存器

GPIO屏蔽寄存器可屏蔽下列寄存器的讀和寫操作:PIN、OUT、SET、CLR和 NOT,相當于給這些寄存器上了個“鎖”,只有當MASK寄存器相應的BIT位被置 0,被屏蔽的寄存器才能進行讀和寫操作。該寄存器上電后默認為0,即不進行GPIO屏蔽。當配置1啟動屏蔽功能后,對處于輸出功能的端口進行任何寫操作都無效,不會改變其當前的輸出狀態(tài)。對處于輸入功能的端口進行讀操作,無論此時端口處于何種電平,都會返回0.

1.2.4. GPIO管腳值寄存器

對配置為數(shù)字功能的端口,對該寄存器進行讀操作將返回管腳的當前邏輯值,不管該管腳是配置為輸入還是輸出,也不管它是配置為 GPIO 還是任何其它適用的備用數(shù)字功能,都可以直接進行讀取。但也有例外,在以下兩種情況中, PIN 寄存器中讀出的管腳值無效:①、如果選擇了管腳的模擬功能(如適用),則不能讀取管腳狀態(tài),例如將管腳選作 ADC 輸入會斷開管腳的數(shù)字功能。②、該引腳被GPIO屏蔽寄存器MASK給屏蔽了。

1.2.5. GPIO管腳輸出寄存器

在沒有被GPIO屏蔽寄存器MASK屏蔽的情況下,向該寄存器寫0或1將在相應端口管腳產(chǎn)生低電平或高電平。但是對于所有其他配置(輸入、非GPIO功能),OUT 寄存器位的值對管腳輸出電平無效。讀取該寄存器將返回 GPIO 輸出寄存器的內(nèi)容,不管數(shù)字管腳配置和方向如何。

通過SET、CLR和NOT寄存器可以對OUT 寄存器執(zhí)行寫操作,允許按位對單個端口管腳進行置位、清除、取反操作。以此來控制OUT 寄存器的輸出內(nèi)容。

1.2.6. GPIO管腳輸出置位寄存器

在沒有被GPIO屏蔽寄存器MASK屏蔽,端口DIR為輸出方向且端口功能為數(shù)字GPIO功能的情況下,寫1會將相應端口管腳設(shè)為高電平。寫0對GPIO輸出電平無效。另外該寄存器為只寫寄存器,對其進行讀操作是無效的。

1.2.7. GPIO管腳輸出清除寄存器

在沒有被GPIO屏蔽寄存器MASK屏蔽,端口DIR為輸出方向且端口功能為數(shù)字GPIO功能的情況下,寫1會將相應端口管腳設(shè)為低電平。寫0對GPIO輸出電平無效。另外該寄存器為只寫寄存器,對其進行讀操作是無效的。

1.2.8. GPIO管腳輸出取反寄存器

在沒有被GPIO屏蔽寄存器MASK屏蔽,端口DIR為輸出方向且端口功能為數(shù)字GPIO功能的情況下,寫1會將相應端口的輸出狀態(tài)進行反轉(zhuǎn)。寫0對GPIO輸出電平無效。另外該寄存器為只寫寄存器,對其進行讀操作是無效的。

1.2.9. GPIO數(shù)據(jù)方向寄存器

在使用數(shù)字GPIO前,首先要確定的就是端口的數(shù)據(jù)方向。向該寄存器寫1會將端口設(shè)置為輸出模式,寫0設(shè)置為輸入模式。上電后端口默認為輸入狀態(tài)。

1.2.10. GPIO中斷感應寄存器

在文章開頭的介紹中,我們就說過MCU的每一個管腳是可以作為外部中斷信號。因此會有一系列與之對應的中斷管理寄存器,來對每個端口的中斷進行管理。這就是接下來要介紹的中斷寄存器。在使用端口中斷前,需要明確需要觸發(fā)中斷的條件。向中斷感應寄存器ISENSEx寫入1,端口中斷的觸發(fā)方式為電平中斷。向寄存器寫入0,端口中斷的觸發(fā)方式為沿中斷觸發(fā),具體需要什么樣的沿來觸發(fā),這個還需要下面的中斷配置寄存器來設(shè)置。

1.2.11. GPIO中斷配置寄存器

緊接上文,在明確使用端口觸發(fā)方式為沿中斷觸發(fā)后,我們通過中斷配置寄存器IBEx來選擇沿觸發(fā)條件。向寄存器寫入1,管腳的上升沿和下降沿都觸發(fā)中斷。向寄存器寫入0,管腳只能由上升沿或下降沿中的一種來觸發(fā)中斷,具體由哪種來觸發(fā),需要下面的中斷事件寄存器IEVx來決定。

1.2.12. GPIO中斷事件寄存器

當中斷配置寄存器IBEx值為0時,中斷事件寄存器就決定著中斷觸發(fā)的條件,向寄存器寫1,上升沿觸發(fā)中斷。寫入0,則下降沿產(chǎn)生中斷。

1.2.13. GPIO中斷屏蔽寄存器

在實際的開發(fā)過程中,使用到中斷功能的端口畢竟是少數(shù),因此MCU在上電后就默認屏蔽了端口的中斷功能。如果要開啟端口的中斷功能,向?qū)募拇嫫魑粚?即可。

1.2.14. GPIO原始中斷狀態(tài)寄存器

該寄存器的位讀出為高時反映了對應管腳上的原始(屏蔽之前)中斷狀態(tài),表示在觸發(fā) IE 之前所有的要求都滿足。位讀出為0時表示對應的輸入管腳還未啟動中斷。該寄存器為只讀。

1.2.15. GPIO中斷狀態(tài)寄存器

該寄存器中的位讀為高反映了輸入觸發(fā)中斷的狀態(tài)。讀出為低則表示對應的輸入管腳沒有中斷產(chǎn)生,或者中斷被屏蔽。讀出為高則表示對應的輸入管腳有中斷產(chǎn)生。該寄存器為只讀。

1.2.16. GPIO中斷清除寄存器

在中斷發(fā)生后,程序會進入中斷服務(wù)子程序。在中斷服務(wù)子程序中處理完中斷程序后,需要向中斷清除寄存器CLRx寫1來清除中斷標志。

1.3. ME32F030R8T6的GPIO 庫函數(shù)函數(shù)

為了便于開發(fā)者快速上手,敏矽微電子官方例程中提供了gpio.c文件,其中包含了設(shè)置端口方向、讀取端口狀態(tài)、配置端口中斷等函數(shù),供開發(fā)者直接使用。

1、設(shè)置GPIO為輸入方向

voidGPIO_ConfigPinsAsInput(PA_Type*port,uint16_tpins)

{

port->DIR =~pins;

return;

}

2、設(shè)置GPIO位輸出方向

voidGPIO_ConfigPinsAsOutput(PA_Type*port,uint16_tpins)

{

port->DIR|=pins;

return;

}

3、設(shè)置GPIO輸出高

voidGPIO_SetPin(PA_Type*port,uint16_tpin)

{

port->SET|=pin;

return;

}

4、設(shè)置GPIO輸出低

voidGPIO_ResetPin(PA_Type*port,uint16_tpin)

{

port->CLR|=pin;

return;

}

5、設(shè)置GPIO輸出反轉(zhuǎn)

voidGPIO_InvertOutPin(PA_Type*port,uint16_tpin)

{

port->NOT|=pin;

return;

}

6、讀取GPIO某個引腳的輸入狀態(tài)

uint8_tGPIO_GetPinState(PA_Type*port,uint16_tpin)

{

if(port->PIN pin)

return1;

else

return0;

}

7、讀取GPIO整個引腳的輸入狀態(tài)

uint16_tGPIO_GetPortState(PA_Type*port)

{

return(uint16_t)port->PIN;

}

8、屏蔽GPIO引腳

voidGPIO_SetPortMask(PA_Type*port,uint16_tpins)

{

port->MASK|=pins;

return;

}

9、使能GPIO引腳

voidGPIO_SetPortMask(PA_Type*port,uint16_tpins)

{

port->MASK|=pins;

return;

}

10、配置GPIO引腳的中斷功能

voidGPIO_EnableInt(PA_Type*port,uint16_tpin,uint8_ttriggeredge)

{

	port->IS =~pin;


port->IE|=pin;

	switch(triggeredge)

	{

		caseRISE_EDGE:
					port->IBE =~pin;

					port->IEV|=pin;			break;			caseFALL_EDGE:

					port->IBE =~pin;

					port->IEV =~pin;			break;			caseBOTH_EDGE:

					port->IBE|=pin;			break;				default:			break;



		}

		return;

}

11、清除GPIO引腳的中斷標志

voidGPIO_ClrInt(PA_Type*port,uint16_tpins)

{

	port->IC=pins;

	return;
}

1.4. ME32F030R8T6的GPIO 開發(fā)實例

介紹完GPIO的原理和函數(shù),接下來就用最經(jīng)典的LED小燈試驗來進行示例。

本例使用敏矽微電子專門為ME32F030R8T6提供的庫函數(shù)編寫程序。

實例程序的代碼如下:

intmain(void

{
	WDT->MOD=0;//關(guān)閉看門狗

	PB_9_INIT(PB_9_GPIO);//PB9(LED)設(shè)置為GPIO功能

	GPIO_ConfigPinsAsOutput(PB,IO_PIN9);//PB9(LED)設(shè)置為輸出方向

	while(1)

	{

		GPIO_InvertOutPin(PB,IO_PIN9);//PB9(LED)端口輸出反轉(zhuǎn)

		SYS_DelaymS(500);//延時500ms

	}

}

程序下載成功后,先在端口反轉(zhuǎn)這句話處打上一個斷點,然后全速運行程序(快捷鍵F5)。隨后程序會停在斷點處,

wKgZomUD04KADF-dAABryoVmiCg306.png

此時先暫停觀察下LED小燈的狀態(tài),發(fā)現(xiàn)紅圈標注的小燈并沒有被點亮。

wKgZomUD04SAD4jNAAQAn-Q-FzM209.png

運行結(jié)果1

接下來單步運行程序,觀察執(zhí)行完端口反轉(zhuǎn)這段程序后的狀態(tài)。這時我們發(fā)現(xiàn)小燈已經(jīng)被點亮了。

wKgaomUD04WACkkSAAL37TamJEQ851.png

繼續(xù)單步運行,當再次執(zhí)行端口反轉(zhuǎn)這段程序后,端口輸出就會反轉(zhuǎn),接下來小燈就會熄滅。最后取消程序中的所有斷點,讓程序全速運行起來,小燈便開始周期性的閃爍。

來源:敏矽MCU

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5343

    瀏覽量

    120363
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5050

    瀏覽量

    97471
  • Cortex-M0
    +關(guān)注

    關(guān)注

    4

    文章

    124

    瀏覽量

    38693
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1204

    瀏覽量

    52098
收藏 人收藏

    評論

    相關(guān)推薦

    cortex-m0學習資料

    本帖最后由 jheng 于 2015-4-9 21:54 編輯 cortex-m0學習
    發(fā)表于 04-09 21:48

    深入淺出Cortex-M0學習資料

    深入淺出Cortex-M0學習資料
    發(fā)表于 06-18 10:50 ?0次下載
    深入淺出<b class='flag-5'>Cortex-M0</b><b class='flag-5'>學習</b>資料

    Cortex-M0的指令集

    Cortex-M0的指令集,有需要的下來看看。
    發(fā)表于 01-13 17:17 ?29次下載

    cortex-m0加密

    cortex-m0加密
    發(fā)表于 10-13 15:08 ?5次下載
    <b class='flag-5'>cortex-m0</b>加密

    MCU學習筆記_ARM Cortex M0_簡介

    MCU學習筆記ARM Cortex M01. RM的CPU core 的基本概念2. ARM Cortex
    發(fā)表于 10-28 11:21 ?15次下載
    MCU<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>_ARM <b class='flag-5'>Cortex</b> <b class='flag-5'>M0</b>_簡介

    基于ARM Cortex-M0核的MCU設(shè)計及應用

    知網(wǎng)鏈接:基于ARM Cortex-M0核的MCU設(shè)計及應用
    發(fā)表于 11-05 15:35 ?18次下載
    基于ARM <b class='flag-5'>Cortex-M0</b>核的MCU設(shè)計及應用

    全球最強性能Cortex-M0 MCU誕生!

    Arm傳統(tǒng)的、為MCU打造的Cortex-M系列CPU主要有:Cortex-M0, Cortex-M3, Cortex-M4。其中Cortex-M0
    的頭像 發(fā)表于 12-20 11:15 ?1280次閱讀

    IDT ARM Cortex-M0 用戶指南

    IDT ARM Cortex-M0 用戶指南
    發(fā)表于 03-23 20:12 ?3次下載
    IDT ARM <b class='flag-5'>Cortex-M0</b> 用戶指南

    微電子Cortex-M0學習筆記08——基本定時器詳解

    微電子Cortex-M0學習筆記08——基本定時器詳解
    的頭像 發(fā)表于 09-26 17:13 ?884次閱讀
    <b class='flag-5'>敏</b><b class='flag-5'>矽</b><b class='flag-5'>微電子</b><b class='flag-5'>Cortex-M0</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>08——基本定時器<b class='flag-5'>詳解</b>

    微電子Cortex-M0學習筆記07——串口通信詳解

    微電子Cortex-M0學習筆記07——串口通信詳解
    的頭像 發(fā)表于 09-26 17:11 ?1127次閱讀
    <b class='flag-5'>敏</b><b class='flag-5'>矽</b><b class='flag-5'>微電子</b><b class='flag-5'>Cortex-M0</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>07——串口通信<b class='flag-5'>詳解</b>

    微電子Cortex-M0學習筆記06——段式LCD液晶實例

    微電子Cortex-M0學習筆記06——段式LCD液晶
    的頭像 發(fā)表于 09-26 17:10 ?732次閱讀
    <b class='flag-5'>敏</b><b class='flag-5'>矽</b><b class='flag-5'>微電子</b><b class='flag-5'>Cortex-M0</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>06——段式LCD液晶<b class='flag-5'>實例</b>

    微電子Cortex-M0學習筆記05——端口外部中斷實例

    微電子Cortex-M0學習筆記05——端口外部中斷實例
    的頭像 發(fā)表于 09-26 17:10 ?782次閱讀
    <b class='flag-5'>敏</b><b class='flag-5'>矽</b><b class='flag-5'>微電子</b><b class='flag-5'>Cortex-M0</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>05——端口外部中斷<b class='flag-5'>實例</b>

    微電子Cortex-M0學習筆記03——時鐘系統(tǒng)設(shè)計例程

    微電子Cortex-M0學習筆記03——時鐘系統(tǒng)設(shè)計例程
    的頭像 發(fā)表于 09-26 17:06 ?965次閱讀
    <b class='flag-5'>敏</b><b class='flag-5'>矽</b><b class='flag-5'>微電子</b><b class='flag-5'>Cortex-M0</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>03——時鐘系統(tǒng)設(shè)計例程

    微電子Cortex-M0學習筆記02——Cortex-M0開發(fā)環(huán)境的建立及調(diào)試

    微電子Cortex-M0學習筆記02——Cortex-M
    的頭像 發(fā)表于 09-26 17:05 ?1588次閱讀
    <b class='flag-5'>敏</b><b class='flag-5'>矽</b><b class='flag-5'>微電子</b><b class='flag-5'>Cortex-M0</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>02——<b class='flag-5'>Cortex-M0</b>開發(fā)環(huán)境的建立及調(diào)試

    微電子Cortex-M0學習筆記01——芯片簡介

    微電子Cortex-M0學習筆記01——芯片簡介
    的頭像 發(fā)表于 09-26 17:03 ?901次閱讀
    <b class='flag-5'>敏</b><b class='flag-5'>矽</b><b class='flag-5'>微電子</b><b class='flag-5'>Cortex-M0</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>01——芯片簡介