1 寄存器問(wèn)題
(資料圖片僅供參考)
首先要了解什么是寄存器?寄存器是中央處理器CPU內(nèi)用來(lái)暫存指令、數(shù)據(jù)和地址的存儲(chǔ)器,在所有應(yīng)用單片機(jī)來(lái)進(jìn)行各種控制操作時(shí),都是通過(guò)設(shè)置單片機(jī)的內(nèi)部寄存器來(lái)操作單片機(jī)的,其思想就是根據(jù)每塊內(nèi)存單元所具有功能的不同,給這些地址取一個(gè)別名,這個(gè)過(guò)程也叫作寄存器地址映射。在后面的發(fā)展過(guò)程中,為了減少直接操作寄存器,又增添了庫(kù)文件操作,以及后來(lái)的CubeMX中設(shè)置各種寄存器信息,但寄存器操作是單片機(jī)內(nèi)部基礎(chǔ)操作的方式,因此寄存器的操作是很有必要了解一下的。
圖1.1 存儲(chǔ)結(jié)構(gòu)圖
1.1 單片機(jī)中的寄存器
單片機(jī)中有眾多寄存器,在實(shí)際單片機(jī)操作中應(yīng)熟練掌握的寄存器有程序狀態(tài)寄存器PSW,定時(shí)器方式控制寄存器TMOD,電源控制寄存器PCON,定時(shí)器控制寄存器TCOD,中斷允許寄存器IE,中斷優(yōu)先級(jí)寄存器IP,以及串行口控制寄存器SCON。
1.2 寄存器配置的常用方式
(1) 先將待設(shè)置位清0,再設(shè)置相應(yīng)的值(常用)。
(2) 先將寄存器的值讀出來(lái),修改完成后,再寫(xiě)進(jìn)寄存器。
1.3 寄存器地址
寄存器地址:保存當(dāng)前CPU所訪問(wèn)的內(nèi)存單元的地址。
基地址:Stm32的每個(gè)模塊都包含多個(gè)寄存器,這些寄存器地址通常是連續(xù)的,而第一個(gè)寄存器的地址(地址值最低的地址)就是基地址。
偏移地址:寄存器在本模塊中的地址偏移量。
絕對(duì)地址:絕對(duì)地址是寄存器的實(shí)際地址,它等于基地址+偏移地址。
圖1.2 GPIO寄存器地址
在寄存器設(shè)置中首先會(huì)用到結(jié)構(gòu)體,將操作GPIO的7個(gè)寄存器封裝進(jìn)一個(gè)結(jié)構(gòu)體中,利用結(jié)構(gòu)體的特性,結(jié)構(gòu)體向內(nèi)存申請(qǐng)連續(xù)存儲(chǔ)空間,結(jié)構(gòu)體中的32位變量正好就占據(jù)4字節(jié),如是16位的就占據(jù)2字節(jié)。
2 GPIO端口設(shè)置
GPIO:G:通用 P:端口即通用I/O(輸入/輸出)端口,是Stm32可控制的引腳。Stm32芯片的GPIO引腳與外部設(shè)備連接起來(lái),可實(shí)現(xiàn)與外部通訊、控制外部硬件或者采集外部硬件數(shù)據(jù)的功能。
圖2.1 寄存器與GPIO口的關(guān)系圖
2.1 GPIO端口位基本結(jié)構(gòu)
GPIO的內(nèi)部電路主要由一對(duì)保護(hù)二極管、受開(kāi)關(guān)控制的上下拉電阻、TTL施密特觸發(fā)器 、兩個(gè)MOS管、輸入輸出數(shù)據(jù)寄存器、復(fù)位/置位寄存器、及一些讀寫(xiě)控制邏輯電路等組成。注:施密特觸發(fā)器具有電壓滯后的特性,利用它對(duì)脈沖波形進(jìn)行整形,使波形的上升沿或下降沿變得陡直。
圖2.2 GPIO基本電路圖
2.2 GPIO端口位的工作模式
2.2.1 輸入模式
輸入模式IO引腳用于讀取外部狀態(tài),如判斷外部按鍵的狀態(tài),接收外部各種傳感器的信號(hào)等。
(1)GPIO_Mode_IN_FLOATING 浮空輸入(即不連接內(nèi)部上下拉電阻)
(2)GPIO_Mode_IPU 上拉輸入
(3)GPIO_Mode_IPD 下拉輸入
(4)GPIO_Mode_AIN 模擬輸入
圖2.3 輸入模式電路圖
2.2.2 輸出模式
輸出模式IO引腳用于控制外部電路工作,如外部的LED的閃爍,LCD1602的顯示等。
(5)GPIO_Mode_Out_OD 開(kāi)漏輸出(帶上拉或者下拉)
(6)GPIO_Mode_AF_OD 復(fù)用開(kāi)漏輸出(帶上拉或者下拉)
(7)GPIO_Mode_Out_PP 推挽輸出(帶上拉或者下拉)
(8)GPIO_Mode_AF_PP 復(fù)用推挽輸出(帶上拉或者下拉)
圖2.4 輸出模式電路圖
2.2.3 復(fù)用模式
復(fù)用模式IO引腳用于如定時(shí)器的PWM信號(hào)的輸入輸出引腳及串口的輸入輸出引腳等。
圖2.5 復(fù)用模式電路圖
2.2.4 AD/DA模擬信號(hào)輸入輸出模式
模擬信號(hào)輸出輸出模式IO引腳應(yīng)用于輸入模擬信號(hào)便于進(jìn)行模數(shù)轉(zhuǎn)換的電路。
圖2.6 高阻抗模擬輸入模式
3 GPIO端口工作模式設(shè)置
3.1 端口配置數(shù)據(jù)設(shè)置
IO引腳的工作模式的設(shè)置通過(guò)模式選擇寄存器GPIOx_MODER來(lái)完成,GPIO中的每一個(gè)引腳的功能都由兩個(gè)位控制,CNF0[1:0]與MODE0[1:0]配置序號(hào)為0的引腳,后面的引腳依次類推,一組IO口有16個(gè)引腳,故需要64bit來(lái)配置一組端口,在Stm32中利用兩個(gè)32位寄存器高位CRH與低位CRL寄存器控制GPIO。其中每一個(gè)IO口都是由7個(gè)寄存器來(lái)控制(CRH、CRL、IDR、ODR、BRR、BSRR、LCKR)[1]。
圖3.1GPIO寄存器簡(jiǎn)介
圖3.2 GPIO端口配置低位寄存器表
通過(guò)軟件來(lái)設(shè)置相應(yīng)的端口時(shí),就需要參考GPIO配置寄存器表,如在輸入模式(MODE[1:0]=00), 輸出模式(MODE[1:0]>00),輸入輸出確定后在CNF[1:0]中確定輸出輸入的模式(8種)。
圖3.3 輸入輸出配置圖
例://使能PORTA時(shí)鐘RCC- >APB2ENR|=1< <2; //將GPIOA的PA13位清零 GPIOA- >CRH&=0XFF0FFFFF; //首先PA13位為8(二進(jìn)制1000)MODE位為00,因此是輸入,//CNF位為10,即為上拉/下拉輸入 GPIOA- >CRH|=0X00800000; //PA13設(shè)置成上拉/下拉輸入 //PA13輸出為高 GPIOA- >ODR|=1< <13;
3.2 輸入輸出端口設(shè)置
控制GPIO的寄存器已經(jīng)在3.1介紹過(guò)了,現(xiàn)主要介紹一下輸入輸出的端口寄存器。
(1)端口輸入寄存器IDR
圖3.4 寄存器IDR配置表
(2)端口輸出寄存器ODR
圖3.5 寄存器IDR配置表
4 推挽電路與開(kāi)漏電路
4.1 推挽電路
推挽電路由輸入部分、輸出部分、NPN型三極管及PNP型三極管組成,通過(guò)輸入電壓的正負(fù)來(lái)控制電路中的三極管來(lái)達(dá)到推挽的效果[2]。
圖4.1 推挽電路原理圖
4.1.1 推電路
當(dāng)Vin端電壓為V+時(shí),上面的N型三極管Q3導(dǎo)通,下面的P型三極管阻塞,電流通過(guò)Q3給負(fù)載供電,這樣的電路就叫推push電路。
圖4.2 推電路原理圖
4.1.2 挽電路
挽電路同理,即當(dāng)Vin端電壓為V-時(shí),P型三極管Q4導(dǎo)通,電流通過(guò)負(fù)載從下往上流去,這就叫挽pull。
圖4.3 挽電路原理圖
推挽電路的優(yōu)缺點(diǎn):由于電路在工作時(shí),兩個(gè)對(duì)稱開(kāi)關(guān)三極管每次只有一個(gè)導(dǎo)通,所以導(dǎo)通時(shí)的損耗較小,且效率高。輸出即可以向負(fù)載灌電流,也可從負(fù)載抽取電流,推拉式輸出級(jí)即提高電路的負(fù)載能力,又提高開(kāi)關(guān)速度。
4.2 開(kāi)漏電路
場(chǎng)效應(yīng)管是電壓控制型元器件,當(dāng)對(duì)場(chǎng)效應(yīng)管的柵極施加電壓時(shí),漏極與源極會(huì)導(dǎo)通。結(jié)型場(chǎng)效應(yīng)管有一個(gè)特性就是它的輸入阻抗非常大,這意味著:沒(méi)有電流從控制電路流出,也沒(méi)有電流進(jìn)入控制電路。沒(méi)有電流流入或流出,就不會(huì)燒壞控制電路。
圖4.4 N型場(chǎng)效應(yīng)管
開(kāi)漏電路(Open-Drain)就是將圖4.5中的三極管換為場(chǎng)效應(yīng)管,利用柵極的輸入來(lái)達(dá)到控制LED燈的亮滅,即當(dāng)柵極有電流時(shí),Q5導(dǎo)通及電流不會(huì)流入LED燈,所以LED燈滅,當(dāng)柵極無(wú)電流時(shí),Q5斷開(kāi),LED燈亮。
圖4.5 開(kāi)漏電路原理圖
開(kāi)漏電路可以利用外部電路的驅(qū)動(dòng)能力,減少cpu內(nèi)部的驅(qū)動(dòng),且開(kāi)漏輸出提供了靈活的輸出方式,但當(dāng)上升沿通過(guò)外接上拉無(wú)源電阻對(duì)負(fù)載充電,即當(dāng)電阻選擇小時(shí)延時(shí)小,但功耗大,反之亦然。
5 GPIO端口輸出功能配置步驟及涉及的寄存器
在Stm32單片機(jī)由內(nèi)核和各種電路模塊組成,如通用模塊中的GPIO模塊、串行外設(shè)接口SPI、同步/異步串口接口、定時(shí)器等電路模塊,Stm32單片機(jī)通過(guò)對(duì)各種外設(shè)的寄存器進(jìn)行操作達(dá)到操作外設(shè)的目的。
5.1 GPIO的配置流程
使能端口時(shí)鐘,使用前先使能對(duì)應(yīng)模塊的時(shí)鐘;
配置端口位的工作模式寄存器;
配置電路驅(qū)動(dòng)類型寄存器,如推挽還是開(kāi)漏;
配置引腳響應(yīng)速度寄存器;
配置上下拉電阻設(shè)置寄存器;
配置輸出數(shù)據(jù)寄存器;
5.2 GPIO點(diǎn)亮LED燈的配置流程
void LED_init9(void){//我的stm32板中的兩個(gè)LED燈在GPIO的A和D組中,在USART1中.//首先先使能端口APB2,USART1掛載在APB2通道上 RCC- >APB2ENR|=1< <2; //使能PORTA時(shí)鐘 RCC- >APB2ENR|=1< <5; //使能PORTD時(shí)鐘 //設(shè)置GPIOA的8號(hào)引腳,8號(hào)引腳屬于高位因此對(duì)CRH寄存器進(jìn)行操作//再設(shè)置ODR寄存器,對(duì)端口的輸出電壓高低進(jìn)行設(shè)置 GPIOA- >CRH&=0XFFFFFFF0; //清除bit位 GPIOA- >CRH|=0X00000003;//PA8 推挽輸出 最大輸出速度 GPIOA- >ODR|=1< <8; //PA8 輸出高,即將端口的輸出電平設(shè)置高電平//與GPIOA同理 GPIOD- >CRL&=0XFFFFF0FF; GPIOD- >CRL|=0X00000300;//PD.2推挽輸出 GPIOD- >ODR|=1< <2; //PD.2輸出高 }
標(biāo)簽: