




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第五章通用和復(fù)用功能IO口第一頁,共91頁。
一、引腳介紹STM32單片機(jī)最多有7個(gè)16位的并行I/O端口:PA、PB、PC、PD、PE、PF、PG。STM32F103單片機(jī)只有5個(gè)16位的并行I/O端口:PA、PB、PC、PD、PE。(實(shí)驗(yàn)板型號(hào):TM32F103VET6)通用IO口,又稱為GPIO(General-PurposeIOports)CPU的一個(gè)接口模塊,為一些協(xié)議比較簡單的外部設(shè)備/電路提供了一種控制手段。
5.1GPIO的工作原理第二頁,共91頁。每個(gè)GPIO管腳都可以由軟件配置成輸出(推拉或開路)、輸入(帶或不帶上拉或下拉)或其它的外設(shè)功能口。多數(shù)GPIO管腳都與數(shù)字或模擬的外設(shè)共用。所有的GPIO管腳都有大電流通過能力。在需要的情況下,I/O管腳的外設(shè)功能可以通過一個(gè)特定的操作鎖定,以避免意外的寫入I/O寄存器。在APB2上的I/O腳提供高達(dá)18MHz的翻轉(zhuǎn)速度。
一、引腳介紹第三頁,共91頁。PA口16腳PB口16腳PC口16腳STM32F103包含5個(gè)端口:
PA口
、PB口、PC口、
PD口、
PE口。一、引腳介紹:以STM32F103x為例PD口16腳PE口16腳
5.1GPIO的工作原理第四頁,共91頁。一、引腳介紹:以STM32F103VET6為例
5.1GPIO的工作原理第五頁,共91頁。補(bǔ)充舉例說明,分析流水燈例程—了解庫開發(fā)流程1)選擇GPIO端口2)選擇GPIO端口功能3)設(shè)置GPIO輸出高低電平控制LED燈的亮滅第六頁,共91頁。舉例說明,分析流水燈例程—了解庫開發(fā)流程要實(shí)現(xiàn)功能選定與LED硬件相連的引腳選定GPIO的特定功能控制LED亮滅相應(yīng)狀態(tài)PD6\PD3輸出功能設(shè)置GPIO引腳電平的高低對應(yīng)的寄存器配置引腳在D上,選擇x=d配置寄存器GPIOx-CRL設(shè)置數(shù)據(jù)寄存器第七頁,共91頁。寄存器操作intmain(void){ GPIOB->CRL=0x3<<20;//配置PB5為推挽輸出,50MHZ while(1) { GPIOB->ODR=0x0; Delay(0xAFFFF); GPIOB->ODR=0x20; Delay(0xAFFFF); }}第八頁,共91頁。舉例說明,分析流水燈例程—了解庫開發(fā)流程1地址映射stm32f10x.h#defineGPIOD_BASE(APB2PERIPH_BASE+0x1400)#defineAPB2PERIPH_BASE(PERIPH_BASE+0x10000)#definePERIPH_BASE((uint32_t)0x40000000)#defineGPIOA_BASE(APB2PERIPH_BASE+0x0800)#defineGPIOB_BASE(APB2PERIPH_BASE+0x0C00)#defineGPIOC_BASE(APB2PERIPH_BASE+0x1000)#defineGPIOD_BASE(APB2PERIPH_BASE+0x1400)#definePERIPH_BASE((uint32_t)0x40000000)第九頁,共91頁。舉例說明,分析流水燈例程—了解庫開發(fā)流程1地址映射STM32固件庫對寄存器的封裝#defineGPIOA((GPIO_TypeDef*)GPIOA_BASE)#defineGPIOB((GPIO_TypeDef*)GPIOB_BASE)#defineGPIOC((GPIO_TypeDef*)GPIOC_BASE)#defineGPIOD((GPIO_TypeDef*)GPIOD_BASE)#defineGPIOE((GPIO_TypeDef*)GPIOE_BASE)typedefstruct{__IOuint32_tCRL;-----0x00__IOuint32_tCRH;-----0x04__IOuint32_tIDR;------0x08__IOuint32_tODR;__IOuint32_tBSRR;__IOuint32_tBRR;__IOuint32_tLCKR;}GPIO_TypeDef;第十頁,共91頁。舉例說明,分析流水燈例程—了解庫開發(fā)流程2、STM32時(shí)鐘設(shè)置在startup_stm32f10x_hd.s中運(yùn)行systemInit(),這個(gè)函數(shù)定義在system_stm32f10x.c,他的作用是設(shè)置系統(tǒng)時(shí)鐘,之后調(diào)用SetSysClock()設(shè)置具體的系統(tǒng)時(shí)鐘第十一頁,共91頁。舉例說明,分析流水燈例程—了解庫開發(fā)流程3、編寫用戶文件配置gpio口的相關(guān)操作:初始化結(jié)構(gòu)體庫函數(shù)GPIO_InitTypeDefGPIO_InitStructure;typedefstruct庫文件利用關(guān)鍵字typedef定義的新類型{uint16_tGPIO_Pin;GPIOSpeed_TypeDefGPIO_Speed;GPIOMode_TypeDefGPIO_Mode;}GPIO_InitTypeDef;第十二頁,共91頁。舉例說明,分析流水燈例程—了解庫開發(fā)流程3、編寫用戶文件(1)初始化庫函數(shù) GPIO_Init在這個(gè)函數(shù)內(nèi)部,把輸入的這些參數(shù)按照一定的規(guī)則轉(zhuǎn)化,進(jìn)而寫入寄存器,實(shí)現(xiàn)了配置GPIO端口的功能第十三頁,共91頁。舉例說明,分析流水燈例程—了解庫開發(fā)流程3、編寫用戶文件(2)控制I/O口高低電平GPIO_SetBits置1,led亮GPIO_ResetBits第十四頁,共91頁。舉例說明,分析流水燈例程—了解庫開發(fā)流程3、編寫用戶文件(3)led.h頭文件(4)main文件分析第十五頁,共91頁。舉例說明,分析流水燈例程—了解庫開發(fā)流程4、總結(jié)1)為了控制led,要使用GPIO外設(shè)2)了解GPIO外設(shè)的功能,如何使用3)知道GPIO的地址映射,掛載在APB24)了解ST官方庫對寄存器的封裝5)了解時(shí)鐘樹,查看GPIOC時(shí)鐘來源,PCLK26)在stm32f10x_conf.h文件中用到的頭文件stm32f10x_gpio.h和stm32f10x_rcc.h7)添加用戶文件led.c文件8)編寫驅(qū)動(dòng)初始化函數(shù)LED_GPIO_Config(void)第十六頁,共91頁。舉例說明,分析流水燈例程—了解庫開發(fā)流程4、總結(jié)9)開外設(shè)時(shí)鐘10)根據(jù)要求填寫GPIO_InitStructure11)調(diào)用初始化函數(shù)GPIO_Init12)編寫相應(yīng)的led.h文件13)編寫主函數(shù)main14)調(diào)試第十七頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)1、IO口的基本結(jié)構(gòu)圖廣第十八頁,共91頁。每個(gè)I/O可以自由編程,單I/O口寄存器必須按32位字被訪問。STM32的很多I/O口都是5V兼容的,具體哪些I/O口是5V兼容的可以從芯片手冊引腳描述章節(jié)查到,I/OLevel標(biāo)FT的就是5V電平兼容的。保護(hù)二極管:避免過高或過低的電壓從外部進(jìn)來時(shí)對電路內(nèi)部的損害;鉗制I/O的電壓在-0.7V~4.0V之間二、IO口的基本結(jié)構(gòu)
5.1GPIO的工作原理第十九頁,共91頁。第二十頁,共91頁。-輸入浮空
-輸入下拉-輸入上拉
-模擬輸入
-開漏輸出
-推挽式輸出
-推挽式復(fù)用功能
-開漏復(fù)用功能
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式第二十一頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式⑴浮空輸入
圖中施密特觸發(fā)器是開啟的,IO口的狀態(tài)可以直接送到輸入寄存器中,CPU可以直接讀取輸入寄存器第二十二頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式⑴浮空輸入
在上圖上,藍(lán)色以外的部分處于不工作狀態(tài),尤其是下半部分的輸出電路,實(shí)際上是與端口處于隔離狀態(tài)。藍(lán)色的高亮部分顯示了數(shù)據(jù)傳輸通道,外部的電平信號(hào)通過左邊編號(hào)1的I/O端口進(jìn)入STM32,經(jīng)過編號(hào)2的施密特觸發(fā)器的整形,送入編號(hào)3的“輸入數(shù)據(jù)寄存器”,在“輸入數(shù)據(jù)寄存器”的另一端(編號(hào)4),CPU可以隨時(shí)讀出I/O端口的電平狀態(tài)。第二十三頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)
2、
GPIO的8種設(shè)置模式⑵上拉輸入第二十四頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)
2、
GPIO的8種設(shè)置模式⑵上拉輸入上圖是STM32的GPIO帶上拉輸入模式的配置。與前面的浮空輸入模式相比,僅僅是數(shù)據(jù)通道上部,接入了一個(gè)上拉電阻,根據(jù)STM32的數(shù)據(jù)手冊,這個(gè)上拉電阻阻值介于30K~50K歐姆。同樣,CPU可以隨時(shí)在“輸入數(shù)據(jù)寄存器”的4端,讀出I/O端口的電平狀態(tài)第二十五頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式⑶下拉輸入第二十六頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式配置輸入模式的總結(jié):(對應(yīng)課本5.1.7)(1)輸出緩沖器被禁止(2)施密特觸發(fā)輸入被激活(3)根據(jù)輸入配置(上拉、下拉或浮動(dòng))的不同,弱上拉和下拉電阻被連接。(4)出現(xiàn)在I/O口上的數(shù)據(jù)在每個(gè)APB2時(shí)鐘被采樣到輸入數(shù)據(jù)寄存器(5)對輸入寄存器的讀訪問可得到I/O狀態(tài)第二十七頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式⑷模擬輸入模式施密特觸發(fā)器是關(guān)閉的,信號(hào)直接到ADC輸入第二十八頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式⑷模擬輸入模式
STM32的模擬輸入通道的配置則更加簡單,信號(hào)從左邊編號(hào)1的端口進(jìn)入,從右邊編號(hào)2的一端直接進(jìn)入ADC模塊。上拉、下拉電阻和施密特觸發(fā)器,均處于斷開狀態(tài),因此“輸入數(shù)據(jù)寄存器”將不能反映端口上的電平狀態(tài),也就是說,模擬輸入配置下,CPU不能在“輸入數(shù)據(jù)寄存器”上讀到有效的數(shù)據(jù)。輸出緩沖器被禁止(對應(yīng)5.1.9)第二十九頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式⑷模擬輸入模式當(dāng)I/O端口被配置為模擬輸入配置時(shí):●輸出緩沖器被禁止;●禁止施密特觸發(fā)輸入,實(shí)現(xiàn)了每個(gè)模擬I/O引腳上的零消耗。施密特觸發(fā)輸出值被強(qiáng)置為’0’;●弱上拉和下拉電阻被禁止;●讀取輸入數(shù)據(jù)寄存器時(shí)數(shù)值為’0’。第三十頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式⑸開漏輸出模式第三十一頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式⑸開漏輸出模式當(dāng)CPU在編號(hào)1端通過“位設(shè)置/清除寄存器”或“輸出數(shù)據(jù)寄存器”寫入數(shù)據(jù)后,該數(shù)據(jù)位將通過編號(hào)2的輸出控制電路傳送到編號(hào)4的I/O端口。如果CPU寫入的是邏輯“1”,通過輸出控制電路,編號(hào)3的N-MOS管將處于關(guān)閉狀態(tài),此時(shí)I/O端口的電平將由外部的上拉電阻決定,如果CPU寫入的邏輯“0”,則編號(hào)3的N-MOS管將處于開啟狀態(tài),此時(shí)I/O端口的電平編號(hào)3的N-MOS管拉到了VSS的零電位。在上圖的虛線部分,施密特觸發(fā)器處于開啟狀態(tài),這意味著CPU可以隨時(shí)監(jiān)控I/O端口的狀態(tài);通過這個(gè)特性,還實(shí)現(xiàn)虛擬的I/O端口雙向通信;只要CPU輸出邏輯“1”,I/O端口的電平將完全由外部電路決定,因此,CPU可以在“輸入數(shù)據(jù)寄存器”讀到外部電路的信號(hào),而不是它自己輸出的邏輯“1”。開漏輸出:輸出端相當(dāng)于三極管的集電極要得到高電平狀態(tài)需要上拉電阻才行,適合于做電流型的驅(qū)動(dòng),其吸收電流的能力相對強(qiáng)(一般20ma以內(nèi)).第三十二頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式⑸開漏輸出模式開漏輸出使用場合:一般來說,開漏是用來連接不同電平的器件,匹配電平用的,因?yàn)殚_漏引腳不連接外部的上拉電阻時(shí),只能輸出低電平,如果需要同時(shí)具備輸出高電平的功能,則需要接上拉電阻,很好的一個(gè)優(yōu)點(diǎn)是通過改變上拉電源的電壓,便可以改變傳輸電平。比如加上上拉電阻就可以提供TTL/CMOS電平輸出等。(上拉電阻的阻值決定了邏輯電平轉(zhuǎn)換的沿的速度
。阻值越大,速度越低功耗越小,所以負(fù)載電阻的選擇要兼顧功耗和速度。)可以將多個(gè)開漏輸出的Pin,連接到一條線上。通過一只上拉電阻,在不增加任何器件的情況下,形成“與邏輯”關(guān)系。這也是I2C,SMBus等總線判斷總線占用狀態(tài)的原理。補(bǔ)充:什么是“線與”?:其實(shí)可以簡單的理解為:在所有引腳連在一起時(shí),外接一上拉電阻,如果有一個(gè)引腳輸出為邏輯0,相當(dāng)于接地,與之并聯(lián)的回路“相當(dāng)于被一根導(dǎo)線短路”,所以外電路邏輯電平便為0,只有都為高電平時(shí),與的結(jié)果才為邏輯1。第三十三頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式(6)推挽輸出模式第三十四頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式(6)推挽輸出模式
當(dāng)CPU在編號(hào)1端通過“位設(shè)置/清除寄存器”或“輸出數(shù)據(jù)寄存器”寫入數(shù)據(jù)后,該數(shù)據(jù)位將通過編號(hào)2的輸出控制電路傳送到編號(hào)4的I/O端口。推挽:是指兩個(gè)管子交替工作。如果CPU寫入的是邏輯“1”,則編號(hào)3的N-MOS高阻,P-MOS導(dǎo)通,輸出1;如果CPU寫入的邏輯“0”,則編號(hào)3的N-MOS導(dǎo)通,P-MOS高阻,輸出0。推挽輸出:可以輸出高、低電平、連接數(shù)字器件
第三十五頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式當(dāng)I/O口配置成輸出時(shí):(1)輸出緩沖器被激活(2)施密特觸發(fā)輸入被激活(3)弱上拉和下拉電阻被禁止(4)出現(xiàn)在I/O口上的數(shù)據(jù)在每個(gè)APB2時(shí)鐘被采樣到輸入數(shù)據(jù)寄存器(5)在開漏模式時(shí),對輸入數(shù)據(jù)寄存器的讀訪問可得到I/O狀態(tài)(6)在推挽模式時(shí),對輸出數(shù)據(jù)寄存器的讀訪問得到最后一次寫的值第三十六頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置3個(gè)最大輸出速度-2MHz:
USART串口,若最大波特率只需115.2k
-10MHz:I2C接口,若使用400k波特率,若想把余量留大些,可以選用10M的GPIO引腳速度。-50MHz:
SPI接口,若使用18M或9M波特率
這個(gè)速度是指GPIO口驅(qū)動(dòng)電路的響應(yīng)速度,而不是輸出信號(hào)的速度,輸出信號(hào)的速度與程序有關(guān)(芯片內(nèi)部在I/O口的輸出部分安排了多個(gè)響應(yīng)速度不同的輸出驅(qū)動(dòng)電路,用戶可以根據(jù)自己的需要選擇合適的驅(qū)動(dòng)電路)。通過選擇速度來選擇不同的輸出驅(qū)動(dòng)模塊,達(dá)到最佳的噪聲控制和降低功耗的目的。高頻的驅(qū)動(dòng)電路,噪聲也高,當(dāng)不需要高的輸出頻率時(shí),請選用低頻驅(qū)動(dòng)電路,這樣非常有利于提高系統(tǒng)的EMI性能。當(dāng)然如果輸出較高頻率的信號(hào),但卻選用了較低頻率的驅(qū)動(dòng)模塊,很可能會(huì)得到失真的輸出信號(hào)第三十七頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式(7)開漏輸出復(fù)用功能第三十八頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式⑻推挽復(fù)用輸出模式第三十九頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式⑻推挽復(fù)用輸出模式
最后是GPIO推挽復(fù)用輸出模式。同樣的道理,編號(hào)2的輸出控制電路的輸入,與復(fù)用功能的輸出端相連,此時(shí)輸出數(shù)據(jù)寄存器被從輸出通道斷開了,并和片上外設(shè)的輸出信號(hào)相連接。我們將GPIO配置成復(fù)用輸出功能后,如果外設(shè)沒有被激活,那么它的輸出將不確定。其它部分與前述模式一直,包括對“輸入數(shù)據(jù)寄存器”的讀取之后內(nèi)容參考手冊P105-P106;P113-第四十頁,共91頁。
5.1GPIO的工作原理二、IO口的基本結(jié)構(gòu)2、
GPIO的8種設(shè)置模式⑻推挽復(fù)用輸出模式復(fù)用功能配置(1)在開漏或推挽式配置中,輸出緩沖器被打開(2)內(nèi)置外設(shè)的信號(hào)驅(qū)動(dòng)輸出緩沖器(復(fù)用功能輸出)、(3)施密特觸發(fā)輸入被激活(4)弱上拉和下拉電阻被禁止(5)出現(xiàn)在I/O口上的數(shù)據(jù)在每個(gè)APB2時(shí)鐘被采樣到輸入數(shù)據(jù)寄存器(6)在開漏模式時(shí),對輸入數(shù)據(jù)寄存器的讀訪問可得到I/O狀態(tài)(7)在推挽模式時(shí),對輸出數(shù)據(jù)寄存器的讀訪問得到最后一次寫的值第四十一頁,共91頁。三、STM32GPIO主要功能:
5.1GPIO的工作原理5.1.1通用I/O(GPIO)用,輸入輸出;最最基本的功能,可以驅(qū)動(dòng)LED、可以產(chǎn)生PWM、可以驅(qū)動(dòng)蜂鳴器等等;5.1.2單獨(dú)的位設(shè)置或位清除;方便軟體作業(yè),程序簡單。端口配置好以后只需GPIO_SetBits(GPIOx,
GPIO_Pin_x)就可以實(shí)現(xiàn)對GPIOx的pinx位為高電平;5.1.3外部中斷/喚醒線:端口必須配置成輸入模式時(shí),所有端口都有外部中斷能力;第四十二頁,共91頁。三、STM32GPIO主要功能:
5.1GPIO的工作原理5.1.4復(fù)用功能(AF),復(fù)用功能的端口兼有IO功能等。復(fù)位期間和剛復(fù)位后,復(fù)用功能未開啟,I/O
端口被配置成浮空輸入模式:(1)復(fù)用的輸入功能,可配置成(輸入浮空,上拉或下拉);(2)復(fù)用的輸出功能:必須配置成復(fù)用輸出模式(推挽或開漏)(3)雙向復(fù)用功能:必須配置成復(fù)用輸出模式(推挽或開漏),輸入驅(qū)動(dòng)器配置成浮空輸入模式
第四十三頁,共91頁。三、STM32GPIO主要功能:5.1.5軟件重新映射I/O復(fù)用功能:為了使不同器件封裝的外設(shè)I/O
功能的數(shù)量達(dá)到最優(yōu),可以把一些復(fù)用功能重新映射到其他一些腳上。這可以通過軟件配置相應(yīng)的寄存器來完成。這時(shí),復(fù)用功能就不再映射到它們的原始引腳上了;5.1.6GPIO鎖定機(jī)制:主要針對復(fù)位設(shè)定的,當(dāng)某端口位lock后,復(fù)位后將不改變的此端口的位配置。
5.1GPIO的工作原理第四十四頁,共91頁。第四十五頁,共91頁。通常有5種方式使用某個(gè)引腳功能,它們的配置方式如下:
1)作為普通GPIO輸入:根據(jù)需要配置該引腳為浮空輸入、帶弱上拉輸入或帶弱下拉輸入,同時(shí)不要使能該引腳對應(yīng)的所有復(fù)用功能模塊。
2)作為普通GPIO輸出:根據(jù)需要配置該引腳為推挽輸出或開漏輸出,同時(shí)不要使能該引腳對應(yīng)的所有復(fù)用功能模塊。
3)作為普通模擬輸入:配置該引腳為模擬輸入模式,同時(shí)不要使能該引腳對應(yīng)的所有復(fù)用功能模塊。
4)作為內(nèi)置外設(shè)的輸入:根據(jù)需要配置該引腳為浮空輸入、帶弱上拉輸入或帶弱下拉輸入,同時(shí)使能該引腳對應(yīng)的某個(gè)復(fù)用功能模塊。
5)作為內(nèi)置外設(shè)的輸出:根據(jù)需要配置該引腳為復(fù)用推挽輸出或復(fù)用開漏輸出,同時(shí)使能該引腳對應(yīng)的所有復(fù)用功能模塊。
注意如果有多個(gè)復(fù)用功能模塊對應(yīng)同一個(gè)引腳,只能使能其中之一,其它模塊保持非使能狀態(tài)。第四十六頁,共91頁。5.2庫函數(shù)具體函數(shù)用法詳情見STM32固件庫使用手冊第四十七頁,共91頁。#include"stm32f10x.h"GPIO_InitTypeDefGPIO_InitStructure;#defineLED1_ONGPIO_SetBits(GPIOB,GPIO_Pin_5);#defineLED1_OFFGPIO_ResetBits(GPIOB,GPIO_Pin_5);voidDelay(__IOuint32_tnCount);Intmain(void){SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//將配置為通用推挽輸出
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//速度為50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure);While(1){
LED1_ON;Delay(0xAFFFF);LED1_OFF;Delay(0xAFFFF);}}5.2
編程舉例第四十八頁,共91頁。/*****************************************************************************名稱:voidDelay(__IOuint32_tnCount)*功能:延時(shí)函數(shù)*入口參數(shù):無*出口參數(shù):無*說明:*調(diào)用方法:無****************************************************************************/voidDelay(__IOuint32_tnCount){
for(;nCount!=0;nCount--);}5.2
編程舉例第四十九頁,共91頁。(1)GPIO_Mode_AIN
模擬輸入
(2)GPIO_Mode_IN_FLOATING
浮空輸入
(3)GPIO_Mode_IPD
下拉輸入
(4)GPIO_Mode_IPU
上拉輸入
(5)GPIO_Mode_Out_OD
開漏輸出
(6)GPIO_Mode_Out_PP
推挽輸出
(7)GPIO_Mode_AF_OD
復(fù)用開漏輸出
(8)GPIO_Mode_AF_PP
復(fù)用推挽輸出第五十頁,共91頁。STM32GPIO使用操作步驟:1.使能GPIO對應(yīng)的外設(shè)時(shí)鐘例如://使能GPIOA、GPIOB、GPIOC對應(yīng)的外設(shè)時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOC,ENABLE);2.聲明一個(gè)GPIO_InitStructure結(jié)構(gòu)體例如: GPIO_InitTypeDefGPIO_InitStructure;3.選擇待設(shè)置的GPIO管腳例如:/*選擇待設(shè)置的GPIO第7、8、9管腳位,中間加“|”符號(hào)*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;4.
設(shè)置選中GPIO管腳的速率例如:/*設(shè)置選中GPIO管腳的速率為最高速率2MHz*/ GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; //最高速率2MHz5.
設(shè)置選中GPIO管腳的模式例如:/*設(shè)置選中GPIO管腳的模式為開漏輸出模式*/ GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; //開漏輸出模式6.根據(jù)GPIO_InitStructure中指定的參數(shù)初始化外設(shè)GPIOX例如:/*根據(jù)GPIO_InitStructure中指定的參數(shù)初始化外設(shè)GPIOC*/ GPIO_Init(GPIOC,&GPIO_InitStructure);第五十一頁,共91頁。7.其他應(yīng)用 例:將端口GPIOA的第10、15腳置1(高電平)GPIO_SetBits(GPIOA,GPIO_Pin_10|GPIO_Pin_15);例:將端口GPIOA的第10、15腳置0(低電平)GPIO_ResetBits(GPIOA,GPIO_Pin_10|GPIO_Pin_15);第五十二頁,共91頁。操作實(shí)例做個(gè)跑馬燈程序,PB.8—PB.11口分別4個(gè)LED燈,當(dāng)I/O為高電平時(shí)LED燈點(diǎn)亮。見課本P215第五十三頁,共91頁。#include"stm32f10x.h"voidRCC_Configuration(void);voidDelay(__IOuint32_tnCount);intmain(void){RCC->APB2ENR|=1<<3; GPIOB->CRL=0x3<<20;//配置PB5為推挽輸出,50MHZ while(1) { GPIOB->ODR=0x0; Delay(0xAFFFF); GPIOB->ODR=0x20; Delay(0xAFFFF); }}5.2寄存器描述(詳見P205)例一:寄存器操作舉例第五十四頁,共91頁。
/*****************************************************************************名稱:voidRCC_Configuration(void)*功能:系統(tǒng)時(shí)鐘配置為72MHZ*入口參數(shù):無*出口參數(shù):無*說明:*調(diào)用方法:無****************************************************************************/voidRCC_Configuration(void){SystemInit();}/*****************************************************************************名稱:voidDelay(__IOuint32_tnCount)*功能:延時(shí)函數(shù)*入口參數(shù):無*出口參數(shù):無*說明:*調(diào)用方法:無****************************************************************************/voidDelay(__IOuint32_tnCount){for(;nCount!=0;nCount--);}第五十五頁,共91頁。#include“stm32f10x.h“位帶操作的實(shí)例//位綁定的定義
#defineGPIOA_ODR_A(GPIOA_BASE+0x0c)#defineGPIOA_IDR_A(GPIOA_BASE+0x08)#defineGPIOB_ODR_B(GPIOB_BASE+0x0c)#defineGPIOB_IDR_B(GPIOB_BASE+0x08)//位綁定的公式
#defineBitBand(Addr,BitNum)*((volatileunsignedlong*)((Addr&0xf0000000)+0x2000000+((Addr&0xfffff)<<5)+(BitNum<<2)))#definePAout(n)BitBand(GPIOA_ODR_A,n)//第幾個(gè)端口作為輸出
#definePAin(n)BitBand(GPIOA_IDR_A,n)//第幾個(gè)端口作為輸如intmain(void){//1.PA.0~PA.7作為推挽輸出,50MHZ; //PA.8~PA.15作為輸入;
GPIOA->CRL=0x33333333; GPIOA->CRH=0x44444444; //2.輸入狀態(tài)反應(yīng)到輸出引腳上
while(1) { if(PAin(8)==1) PAout(0)=1;elsePAout(0)=0; if(PAin(9)==1)PAout(1)=1;elsePAout(1)=0; }}第五十六頁,共91頁。5.3GPIO復(fù)用功能AFIOAlternativeFunctionIO同一管腳,不僅作為GPIO,也可作為其他特殊功能使用即同一管腳,多種應(yīng)用第五十七頁,共91頁。5.3GPIO復(fù)用功能當(dāng)LSE振蕩器關(guān)閉時(shí),LSE振蕩器引腳OSC32_IN/OSC32_OUT可以分別用做GPIO的PC14/PC15,LSE功能始終優(yōu)先于通用I/O口的功能。5.3.2BXCAN復(fù)用功能重映射CAN信號(hào)可以被映射到端口A、端口B或端口D上,如下表所示。對于端口D,在36、48和64腳的封裝上沒有重映射功能。第五十八頁,共91頁。5.3GPIO復(fù)用功能JTAG/SWD復(fù)用功能重映射調(diào)試接口信號(hào)被映射到GPIO端口上,如下表所示。表調(diào)試接口信號(hào)第五十九頁,共91頁。5.3GPIO復(fù)用功能表調(diào)試端口映像第六十頁,共91頁。5.3GPIO復(fù)用功能5.3.4定時(shí)器復(fù)用功能重映射定時(shí)器4的通道1到通道4可以從端口B重映射到端口D。其他定時(shí)器的重映射列在下表。參見復(fù)用重映射和調(diào)試I/O配置寄存器(AFIO_MAPR)定時(shí)器4復(fù)用功能重映像第六十一頁,共91頁。5.3GPIO復(fù)用功能定時(shí)器3復(fù)用功能重映像定時(shí)器2復(fù)用功能重映像第六十二頁,共91頁。5.3GPIO復(fù)用功能定時(shí)器1復(fù)用功能重映像第六十三頁,共91頁。第六十四頁,共91頁。5.3GPIO復(fù)用功能第六十五頁,共91頁。5.3GPIO復(fù)用功能第六十六頁,共91頁。5.3GPIO復(fù)用功能第六十七頁,共91頁。5.3GPIO復(fù)用功能第六十八頁,共91頁。5.3GPIO復(fù)用功能第六十九頁,共91頁。使用默認(rèn)復(fù)用功能前必須對端口位配置寄存器編程?!駥τ趶?fù)用的輸入功能,端口可以配置成:?輸入模式(浮空、上拉或下拉)?復(fù)用功能輸出模式:輸入驅(qū)動(dòng)器被配置成浮空輸入模式●對于復(fù)用輸出功能,端口必須配置成復(fù)用功能輸出模式(推挽或開漏)。●對于雙向復(fù)用功能,端口位必須配置復(fù)用功能輸出模式(推挽或開漏)。這時(shí),輸入驅(qū)動(dòng)器被配置成浮空輸入模式。如果把一端口配置成復(fù)用輸出功能,將使引腳和輸出寄存器斷開,并和片上外設(shè)的輸出信號(hào)連接。如果軟件把一個(gè)GPIO腳配置成復(fù)用輸出功能,但是外設(shè)沒有被激活,它的輸出將不確定。5.3GPIO復(fù)用功能第七十頁,共91頁。STM32外部中斷ARM
Cortex-m3內(nèi)核支持256個(gè)“中斷通道”(16個(gè)內(nèi)核+240個(gè)外部)和可編程256級(jí)中斷優(yōu)先級(jí)設(shè)置。
STM32采用Cortex-m3內(nèi)核,但是STM32并沒有使用Cortex-m3的全部資源。
STM32目前支持76個(gè)“中斷通道”(16個(gè)內(nèi)核+60個(gè)外部)和可編程16級(jí)中斷優(yōu)先級(jí)設(shè)置。(參考書冊P132,表55)STM32的外部中斷通道已經(jīng)固定分配給相應(yīng)的外設(shè)。第七十一頁,共91頁。STM32外部中斷NVIC在內(nèi)核中的位置1、NVIC相關(guān)知識(shí)回顧第七十二頁,共91頁。STM32外部中斷NVIC在內(nèi)核中的位置1、NVIC相關(guān)知識(shí)回顧NVIC的NVIC_Init()庫函數(shù)封裝在misc.c在NVIC初始化,首先定義并填充一個(gè)NVIC_InitTypeDef類型的結(jié)構(gòu)體第七十三頁,共91頁。4bit的中斷優(yōu)先級(jí)可以分成2組,從高位看,前面定義的是搶占式優(yōu)先級(jí),后面是響應(yīng)優(yōu)先級(jí)。按照這種分組,4bit一共可以分成5組
第0組:所有4bit用于指定響應(yīng)優(yōu)先級(jí);
第1組:最高1位用于指定搶占式優(yōu)先級(jí),后面3位用于指定響應(yīng)優(yōu)先級(jí);
第2組:最高2位用于指定搶占式優(yōu)先級(jí),后面2位用于指定響應(yīng)優(yōu)先級(jí);
第3組:最高3位用于指定搶占式優(yōu)先級(jí),后面1位用于指定響應(yīng)優(yōu)先級(jí);
第4組:所有4位用于指定搶占式優(yōu)先級(jí)。由以下函數(shù)實(shí)現(xiàn):NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)//2位搶占優(yōu)先級(jí)1、NVIC相關(guān)知識(shí)回顧第七十四頁,共91頁。2、STM32-GPIO外部中斷相關(guān)知識(shí)回顧中斷分類STM32的EXTI控制器支持19個(gè)外部中斷/事件請求。每個(gè)中斷設(shè)有狀態(tài)位,每個(gè)中斷/事件都有獨(dú)立的觸發(fā)和屏蔽設(shè)置。
STM32的19個(gè)外部中斷對應(yīng)著19路中斷線,分別是EXTI_Line0-EXTI_Line18:
線0~15:對應(yīng)外部IO口的輸入中斷。
線16:連接到PVD輸出。
線17:連接到RTC鬧鐘事件。
線18:連接到USB喚醒事件。
觸發(fā)方式:STM32的外部中斷是通過邊沿來觸發(fā)的,不支持電平觸發(fā)。
外部中斷分組:STM32的每一個(gè)GPIO都能配置成一個(gè)外部中斷觸發(fā)源,STM32通過根據(jù)引腳的序號(hào)不同將眾多中斷觸發(fā)源分成不同的組,比如:PA0,PB0,PC0,PD0,PE0為第一組,那么依此類推,我們能得出一共有16組,STM32規(guī)定,每一組中同時(shí)只能有一個(gè)中斷觸發(fā)源工作,那么,最多工作的也就是16個(gè)外部中斷。第七十五頁,共91頁。中斷和事件(續(xù))
外部中斷/事件線路映像80(低密度STM32F10x)或112個(gè)(中、高密度STM32F10x)GPIO端口以左圖的方式連接到16個(gè)外部中斷/事件線上:另外三種其他的外部中斷/事件控制器的連接如下:EXTI線16連接到PVD輸出EXTI線17連接到RTC鬧鐘事件EXTI線18連接到USB喚醒事件2、STM32-GPIO外部中斷相關(guān)知識(shí)回顧第七十六頁,共91頁。在此情況下,我們智能使用類似于PB1,PC2這種末端序號(hào)不同的外部中斷源。每一組使用一個(gè)中斷標(biāo)志EXTIx。EXTI0–EXTI4這5個(gè)外部中斷有著自己的單獨(dú)的中斷響應(yīng)函數(shù),EXTI5-9共用一個(gè)中斷響應(yīng)函數(shù),EXTI10-15共用一個(gè)中斷響應(yīng)函數(shù),參考手冊P130表552、STM32-GPIO外部中斷相關(guān)知識(shí)回顧第七十七頁,共91頁。EXTI的EXTI_Init()庫函數(shù)封裝stm32f10x_exti.c在EXTI初始化,首先定義并填充一個(gè)EXTI_InitTypeDef類型的結(jié)構(gòu)體2、STM32-GPIO外部中斷相關(guān)知識(shí)回顧第七十八頁,共91頁。使用GPIO外部中斷的基本步驟如下:
STM32的每個(gè)IO口都可以作為中斷輸入,這點(diǎn)很好用。要把IO口作為外部中斷輸入,有以下幾個(gè)步驟:1)開啟IO口時(shí)鐘和復(fù)用時(shí)鐘由于GPIO并不是專用的中斷引腳,這樣我們要先開啟相應(yīng)時(shí)鐘和復(fù)用時(shí)鐘2)初始化IO口為輸入。這一步設(shè)置你要作為外部中斷輸入的IO口的狀態(tài),可以設(shè)置為上拉/下拉輸入,也可以設(shè)置為浮空輸入,但浮空的時(shí)候外部一定要帶上拉,或者下拉電阻。否則可能導(dǎo)致中斷不停的觸發(fā)。在干擾較大的地方,就算使用了上拉/下拉,也建議使用外部上拉/下拉電阻,這樣可以一定程度防止外部干擾帶來的影響。
第七十九頁,共91頁。3)在庫函數(shù)中,配置
GPIO
與中斷線的映射關(guān)系的函數(shù)
GPIO_EXTILineConfig()來實(shí)現(xiàn)的:void
GPIO_EXTILineConfig(uint8_t
GPIO_PortSource,
uint8_t
GPIO_PinSource)該函數(shù)將
GPIO
端口與中斷線映射起來,使用范例是:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);將中斷線
2
與
GPIOE
映射起來,那么很顯然是
GPIOE.2
與
EXTI2
中斷線連接了。設(shè)置好中斷線映射之后,那么到底來自這個(gè)
IO
口的中斷是通過什么方式觸發(fā)的呢?接下來我們就要設(shè)置該中斷線上中斷的初始化參數(shù)了。中斷線上中斷的初始化是通過函數(shù)
EXTI_Init()實(shí)現(xiàn)的。EXTI_Init()函數(shù)的定義是:void
EXTI_Init(EXTI_InitTypeDef*
EXTI_InitStruct);固件庫P99第八十頁,共91頁。3)在庫函數(shù)中,配置
GPIO
與中斷線的映射關(guān)系的函數(shù)EXTI外部中斷配置(中斷源的選擇,清除中斷標(biāo)志,觸發(fā)模式)。
這一步,我們要配置中斷產(chǎn)生的條件,STM32可以配置成上升沿觸發(fā),下降沿觸發(fā),或者任意電平變化觸發(fā),但是不能配置成高電平觸發(fā)和低電平觸發(fā)。這里根據(jù)自己的實(shí)際情況來配置。同時(shí)要開啟中斷線上的中斷,這里需要注意的是:如果使用外部中斷,并設(shè)置該中斷的EMR位的話,會(huì)引起軟件仿真不能跳到中斷,而硬件上是可以的。而不設(shè)置EMR,軟件仿真就可以進(jìn)入中斷服務(wù)函數(shù),并且硬件上也是可以的。建議不要配置EMR位。中斷線上中斷的初始化是通過函數(shù)
EXTI_Init()實(shí)現(xiàn)的。EXTI_Init()函數(shù)的定義是:void
EXTI_Init(EXTI_InitTypeDef*
EXTI_InitStruct);固件庫P99第八十一頁,共91頁。4)配置中斷分組(NVIC),并使能中斷配置中斷分組(NVIC),并使能中斷(分組,指定優(yōu)先級(jí),使能)
這一步,我們就是配置中斷的分組,以及使能,對STM32的中斷來說,只有配置了NVIC的設(shè)置,并開啟才能被執(zhí)行,否則是不會(huì)執(zhí)行到中斷服務(wù)函數(shù)里面去的。中斷控制器的初始化是通過函數(shù)
NVIC_Init()來實(shí)現(xiàn)
:NVIC_Init(void)
{NVIC_InitTypeDefNVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷分組
NVIC_InitStructure.NVIC_IRQChannel
=
EXTI2_IRQn;
//使能按鍵外部中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority
=
0x02;
//搶占優(yōu)先級(jí)2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority
=
0x02;
//子優(yōu)先級(jí)2
NVIC_InitStructure.NVIC_IRQChannelCmd
=
ENABLE;
//使能外部中斷通道
NVIC_Init(&NVIC_InitStructure);
}
第八十二頁,共91頁。5)編寫中斷服務(wù)程序這是中斷設(shè)置的最后一步,中斷服務(wù)函數(shù),是必不可少的,如果在代碼里面開啟了中斷,但是沒編寫中斷服務(wù)函數(shù),就可能引起硬件錯(cuò)誤,從而導(dǎo)致程序崩潰!所以在開啟了某個(gè)中斷后,一定要記得為該中斷編寫服務(wù)函數(shù)。在中斷服務(wù)函數(shù)里面編寫你要執(zhí)行的中斷后的操作。第一個(gè)函數(shù)是判斷某個(gè)中斷線上的中斷是否發(fā)生(標(biāo)志位是否置位)
:ITStatus
EXTI_GetITStatus(uint32_t
EXTI_Line);這個(gè)函數(shù)一般使用在中斷服務(wù)函數(shù)的開頭判斷中斷是否發(fā)生。另一個(gè)函數(shù)是清除某個(gè)中斷線上的中斷標(biāo)志位:void
EXTI_ClearITPendingBit(uint32_t
EXTI_Line);這個(gè)函數(shù)一般應(yīng)用在中斷服務(wù)函數(shù)結(jié)束之前,清除中斷標(biāo)志位。第八十三頁,共91頁。1)設(shè)置相應(yīng)的時(shí)鐘首先需要打開GPIOB、GPIOC和GPIOE(因?yàn)榘存I另外一端連接的是PE口)。然后由于是要用于觸發(fā)中斷,所以還需要打開GPIO復(fù)用的時(shí)鐘。詳細(xì)代碼如下:voidRCC_Configuration(void){SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE,ENABLE);}相應(yīng)的時(shí)鐘所需要的RCC函數(shù)在stm32f10x_rcc.c中,所以要在工程中添加此文件。第八十四頁,共91頁。2)GPIO配置voidGPIO_Configuration(void){GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //LED1V6GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司品牌轉(zhuǎn)讓合同范本
- 互聯(lián)網(wǎng)戰(zhàn)略合作合同范本
- 發(fā)電站煤渣供銷合同范本
- 合同范本鎳礦
- 出資金合同范本
- 同行材料供貨合同范本
- 兩個(gè)人合伙臺(tái)球廳合同范例
- 包工合作提成合同范本
- 合法種植養(yǎng)殖合同范本
- 倉庫協(xié)議合同范例
- 排球正面雙手墊球教案教學(xué)設(shè)計(jì)
- 消防(控制室)值班記錄
- 【23精品】蘇少小學(xué)美術(shù)三下教案全冊
- 房屋租賃(出租)家私清單
- 計(jì)算機(jī)技術(shù)碩士專業(yè)學(xué)位授權(quán)點(diǎn)申報(bào)研究演示課件(PPT 39頁)
- 剪紙藝術(shù)-認(rèn)識(shí)剪紙
- 駕駛員違規(guī)違章學(xué)習(xí)記錄表
- 簡易瞬態(tài)工況法1
- 中國鐵路總公司環(huán)境保護(hù)管理辦法(鐵總計(jì)統(tǒng)〔2015〕260號(hào))
- 技術(shù)分析介紹教程課件
- 汽車新能源汽車產(chǎn)業(yè)專利趨勢分析
評論
0/150
提交評論