欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

STM32新手入門-什么是寄存器-創(chuàng)新互聯(lián)

?作者簡介:嵌入式入坑者,與大家一起加油,希望文章能夠幫助各位?。。?!
📃個人主頁:@rivencode的個人主頁
🔥系列專欄:玩轉(zhuǎn)STM32
💬推薦一款模擬面試、刷題神器,從基礎(chǔ)到大廠面試題👉點擊跳轉(zhuǎn)刷題網(wǎng)站進行注冊學(xué)習(xí)
在這里插入圖片描述

目前成都創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計、堆龍德慶網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
一.前言

俗話說得好地基不牢地動山搖,要想學(xué)好單片機必須要非常熟悉底原理,畢竟我們這是底層開發(fā)所以接觸到越底層越好,能讓我們知道每一句代碼在做什么,單片機的本質(zhì)其實就是在操作寄存器,讓單片機完成我們想要的動作例如點亮一個LED燈,stm32的庫函數(shù)開發(fā)也不例外它只不過是將操作寄存器封裝成一個個函數(shù),我們只要配置指定函數(shù)的參數(shù),再調(diào)用該函數(shù)自動把對應(yīng)的寄存器配置好,其實本質(zhì)還是操作寄存器,更加方便快捷,如果你只學(xué)庫函數(shù)的話后期就有種空中閣樓的感覺,知其然不知其所以然。

總結(jié):寄存器必須要學(xué),如果前期學(xué)的有點困難,可以學(xué)一段時間庫函數(shù)在返回看寄存器會好很多;

二.STM32的系統(tǒng)架構(gòu)

STM32 芯片是已經(jīng)封裝好的成品,主要由內(nèi)核和片上外設(shè)組成。若與電腦類比,內(nèi)核與外設(shè)就如同電腦上的 CPU 與主板、內(nèi)存、顯卡、硬盤的關(guān)系。

下面這張stm32系統(tǒng)結(jié)構(gòu)的圖非常重要,我們要理解stm32如何運作,以及各個外設(shè)掛載在哪條總線上,而我們主要學(xué)習(xí)的是掛載在 AHB系統(tǒng)總線上的外設(shè)

在這里插入圖片描述

1.四個驅(qū)動單元(CUP)

  • Cortex?-M3內(nèi)核DCode總線
  • Cortex?-M3內(nèi)核系統(tǒng)總線System
  • 通用DMA1
  • 通用DMA2

2.四個被動單元(外設(shè))

  • 內(nèi)部SRAM
  • 內(nèi)部閃存存儲器FLASH
  • FSMC
  • AHB到APB的橋,它連接所有的APB外設(shè)

3.驅(qū)動單元

  • ICode 總線

ICode 中的 I 表示 Instruction,即指令。內(nèi)核通過ICode 總線讀取內(nèi)部FLASH代碼指令來執(zhí)行程序.。

  • DCode 總線

DCode 中的 D 表示 Data,即數(shù)據(jù),那說明這條總線是用來取數(shù)的。因為數(shù)據(jù)可以被 Dcode 總線和 DMA 總線訪問(向flash,SRAM,或外設(shè)數(shù)據(jù)寄存器里面取數(shù)據(jù)),所以為了避免訪問沖突,在取數(shù)的時候需要經(jīng)過一個總線矩陣來仲裁,決定哪個總線在取數(shù),取到的數(shù)據(jù)可以暫存在Cortex?-M3內(nèi)核里面的寄存器在進行處理。

  • 系統(tǒng)總線System

系統(tǒng)總線主要是訪問外設(shè)的寄存器,我們通常說的寄存器編程,即讀寫寄存器都是通過這根系統(tǒng)總線來完成的。

  • DMA 總線

DMA 總線與DCode總線一樣主要是用來傳輸數(shù)據(jù),但Dcode總線傳輸數(shù)據(jù)要占用內(nèi)核(cpu)的資源,而DMA總線相當(dāng)于獨立于內(nèi)核cpu但幫助內(nèi)核cpu傳輸數(shù)據(jù)而不用占用內(nèi)核(cpu)的資源,就是在DMA傳輸數(shù)據(jù)的同時內(nèi)核cpu可以干別的事情比如點亮一個LED燈

  • 總線矩陣

總線矩陣協(xié)調(diào)內(nèi)核系統(tǒng)總線和DMA主控總線之間的訪問仲裁,仲裁利用輪換算法。因為數(shù)據(jù)可以被 Dcode 總線和 DMA 總線訪問,數(shù)據(jù)可以是在某個外設(shè)的數(shù)據(jù)寄存器,可以在SRAM,可以在內(nèi)部的 FLASH。所以為了避免訪問沖突,在取數(shù)的時候需要經(jīng)過一個總線矩陣來仲裁,決定哪個總線在取數(shù)

4. 被動單元

  • 內(nèi)部FLASH

簡單介紹在flash存儲內(nèi)容:我們寫好的程序編譯之后都是一條條指令(二進制代碼),存放在 FLASH 中,我們常量或常變量C 語言中的 const 關(guān)鍵字修飾也存放在FLASH

  • 內(nèi)部SRAM

就是我們常說的電腦內(nèi)存條,程序函數(shù)內(nèi)部的局部變量和全局變量,堆(malloc分配)棧(局部變量)等的開銷都是基于內(nèi)部的SRAM。內(nèi)核通過 DCode 總線來訪問它

  • FSMC

FSMC 的英文全稱是 Flexible static memory controller,叫靈活的靜的存儲器控制器,是 STM32F10xx 中一個很有特色的外設(shè)通過FSMC我們可以擴展內(nèi)存,如外部的SRAM,NANDFLASH 和 NORFLASH。但有一點我們要注意的是,F(xiàn)SMC 只能擴展靜態(tài)的內(nèi)存,即名稱里面的 S:static,不能是動態(tài)的內(nèi)存,比如 SDRAM 就不能擴展。

  • AHB 到 APB 的橋

兩個AHB/APB橋在AHB和2個APB總線間提供同步連接。APB1操作速度限于36MHz,APB2操作于全速(最高72MHz),上面掛載著 STM32 各種各樣的特色外設(shè)。我們經(jīng)常說的 GPIO、串口、I2C、SPI 這些外設(shè)就掛載在這兩條總線上,這個是我們學(xué)習(xí) STM32 的重點,就是要學(xué)會編程這些外設(shè)去驅(qū)動外部的各種設(shè)備。

三.存儲器映射

存儲器本身不具有地址信息,它的地址是由芯片廠商或用戶分配,給存儲器分配地址的過程就稱為存儲器映射,如果給存儲器再分配一個地址就叫存儲器重映射。

程序存儲器、數(shù)據(jù)存儲器、寄存器和輸入輸出端口被組織在同一個4GB的線性地址空間內(nèi)。數(shù)據(jù)字節(jié)以小端格式存放在存儲器中。一個字里的最低地址字節(jié)被認為是該字的最低有效字節(jié),而最高地址字節(jié)是最高有效字節(jié)。

1. STM32的存儲空間

上面說的4GB但為什么是4GB,存儲空間的大小是由芯片內(nèi)CPU內(nèi)的地址總線的數(shù)量來決定,而stm32芯片內(nèi)部的總線為32根
內(nèi)存被劃分為一個個的內(nèi)存單元,每個內(nèi)存單元的大小是一個字節(jié),為了能有效的訪問到內(nèi)存的每個單元就給內(nèi)存單元進行編號,編號就被稱為該內(nèi)存單元的地址

怎樣產(chǎn)生地址
32根地址線每根線 可以輸出正電和負電(1 或 0)
在這里插入圖片描述

分配好地址后,被控單元的 FLASH,RAM,F(xiàn)SMC 和 AHB 到 APB 的橋(即片上外設(shè)),這些功能部件共同排列在一個 4GB 的地址空間內(nèi)。我們在編程的時候,可以通過他們的地址找到他們,然后來操作他們( C語言里的將地址解引用操作 * 取出內(nèi)容對他們進行數(shù)據(jù)的讀和寫)。
在這里插入圖片描述

2. 存儲器區(qū)域功能劃分

在這 4GB 的地址空間中,ARM 已經(jīng)粗線條的平均分成了 8 個塊,每塊 512MB,每個塊也都規(guī)定了用途每個塊的大小都有512MB,顯然這是非常大的,
在這里插入圖片描述
在這 8 個 Block 里面,有 3 個塊非常重要,也是我們最關(guān)心的三個塊。Block0 用來設(shè)計成內(nèi)部 FLASH,Block1 用來設(shè)計成內(nèi)部 RAM,Block2 用來設(shè)計成片上的外設(shè),下面我們簡單的介紹下這三個 Block 里面的具體區(qū)域的功能劃分。

  • 存儲器 Block0 內(nèi)部區(qū)域功能劃分

在這里插入圖片描述

  • 儲存器 Block1 內(nèi)部區(qū)域功能劃分

在這里插入圖片描述

  • 儲存器 Block2 內(nèi)部區(qū)域功能劃分

Block2 用于設(shè)計片內(nèi)的外設(shè),根據(jù)外設(shè)的總線速度不同,Block 被分成了 APB 和 AHB兩部分,其中 APB 又被分為 APB1 和 APB2
在這里插入圖片描述
解釋一下預(yù)留地址,這些地址沒有給他分配存儲單元,理論是4GB但實際并沒有這么多,只是給了你指標(biāo)而并沒有全用

三.什么是寄存器 1. 寄存器映射

在存儲器 Block2 這塊區(qū)域,設(shè)計的是片上外設(shè),它們以四個字節(jié)為一個單元,共32bit,每一個單元對應(yīng)不同的功能,當(dāng)我們控制這些單元時就可以驅(qū)動外設(shè)工作。我們可以找到每個單元的起始地址,然后通過 C 語言指針的操作方式 (既然一個單元是四個字節(jié)那我們就用一次取四個字節(jié)的指針(int * )來操作這些功能單元) 來訪問這些單元,如果每次都是通過這種地址的方式來訪問,不僅不好記憶還容易出錯,這時我們可以根據(jù)每個單元功能的不同,以功能為名給這個內(nèi)存單元取一個別名,這個給已經(jīng)分配好地址的有特定功能的內(nèi)存單元取別名的過程就叫寄存器映射

2. 什么是寄存器

寄存器:給特定功能的的單元取的別名這個別名就叫做寄存器,所以寄存器只是特定功能的的單元的名字而已

比如,我們找到 GPIOB 端口的輸出數(shù)據(jù)寄存器 ODR 的地址是 0x4001 0C0C(至于這個地址如何找到可以先跳過,后面我們會有詳細的講解),ODR 寄存器(就是4字節(jié)的功能單元)是 32bit,低 16bit有效,對應(yīng)著 16 個外部 IO,寫 0/1 對應(yīng)的的 IO 則輸出低/高電平。現(xiàn)在我們通過 C 語言指針的操作方式,讓 GPIOB 的 16 個 IO 都輸出高電平,具體見。
在這里插入圖片描述

3. 如何給功能單元取個別名(寄存器)

我們利用C語言的#define 定義一個寄存器標(biāo)識符

在這里插入圖片描述
這樣再操作一個功能單元就簡單多了,而且更容易理解
在這里插入圖片描述
接下來就是層層套娃找到GPIOB端口的所有功能單元地址,將他們分不同的功能改個別名變成寄存器,以后直接操作對應(yīng)的寄存器就OK啦。

4. STM32的外設(shè)地址映射

片上外設(shè)區(qū)分為三條總線,根據(jù)外設(shè)速度的不同,不同總線掛載著不同的外設(shè),APB1掛載低速外設(shè),APB2和AHB掛載高速外設(shè)。相應(yīng)總線的最低地址我們稱為該總線的基地址,總線基地址也是掛載在該總線上的首個外設(shè)的地址。其中 APB1 總線的地址最低,片上外設(shè)從這里開始,也叫外設(shè)基地址。
在這里插入圖片描述

在這里插入圖片描述
列出了所用STM32F10xxx中內(nèi)置外設(shè)的起始地址。

在這里插入圖片描述在這里插入圖片描述
這里我截取一段教你們這么找總線基地址,外設(shè)基地址。
請?zhí)砑訄D片描述

看上圖就能一 一找到下面各個總線或各個外設(shè)的基地址

  • 總線基地址
    在這里插入圖片描述
    相對外設(shè)基地址偏移”即該總線地址與“片上外設(shè)”基地址 0x4000 0000的差值。

  • 外設(shè)基地址
    總線上掛載著各種外設(shè),這些外設(shè)也有自己的地址范圍,特定外設(shè)的首個地址稱為“XX 外設(shè)基地址”。
    這里以GPIO為例其他外設(shè)是一樣的操作
    在這里插入圖片描述
    這里相對APB2總線的地址偏移,外設(shè)基地址減去APB2總線基地址0X4001 0000 就是相對APB2總線的地址偏移,因為GPIO端口全是掛載在APB2總線。

  • 外設(shè)寄存器

  • 在 XX 外設(shè)的地址范圍內(nèi),分布著的就是該外設(shè)的寄存器。以 GPIO 外設(shè)為例, -GPIO(general purpose input output)是通用輸入輸出端口的簡稱,簡單來說就是 STM32 可控制的引腳,基本功能是控制引腳輸出高電平或者低電平。最簡單的應(yīng)用就是把 GPIO 的引腳連接到 LED 燈的陰極,LED 燈的陽極接電源,然后通過 STM32 控制該引腳的電平,從而實現(xiàn)控制 LED 燈的亮滅。
    在這里插入圖片描述
    這里我們以 GPIOB 端口為例,來說明 GPIO 都有哪些寄存器.
    在這里插入圖片描述

GPIO 有很多個寄存器,每一個都有特定的功能。每個寄存器32bit,占四個字節(jié),在該外設(shè)的基地址上按照順序排列,寄存器的位置都以相對該外設(shè)基地址的偏移地址來描述。

各個寄存器的地址=外設(shè)基地址+寄存器相對于外設(shè)基地址的偏移

這里我們按照地址偏移順序看幾個寄存器,理解寄存器的說明,具體見圖
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
這里我就不一 一列舉了,所有的外設(shè)基本都有自己的寄存器只不過功能不同名字不同都是按照此種模式來排列

四.C語言對寄存器的封裝

上面方式還不夠方便,接下來經(jīng)過層層套娃,找到各個外設(shè)寄存器的地址再用C語言的結(jié)構(gòu)體進行封裝

1. 封裝總線和外設(shè)基地址

在編程上為了方便理解和記憶,我們把總線基地址和外設(shè)基地址都以相應(yīng)的宏定義起,總線或者外設(shè)都以他們的名字作為宏名
在這里插入圖片描述

2. 封裝寄存器列表

各個寄存器的地址=外設(shè)基地址+寄存器相對于外設(shè)基地址的偏移
在這里插入圖片描述
到這里大家有沒有發(fā)現(xiàn)一個特點寄存器的地址每次偏移4,如果定義一個寄存器的類型為(unsigned int)是不是正好在內(nèi)存中占4個字節(jié),而一個內(nèi)存單元就是1個字節(jié),分配一個地址,那4個字節(jié)不正好每次偏移4個地址,而且有符合結(jié)構(gòu)體的內(nèi)存對齊,關(guān)于結(jié)構(gòu)體的內(nèi)存對齊這里不細講,以后會出有關(guān)結(jié)構(gòu)體的文章詳細闡述。
在這里插入圖片描述
把寄存器封裝成結(jié)構(gòu)體后,接下來就是取出寄存器對寄存器進行操作以GPIOA為例,我們將GPIOA外設(shè)的基地址強制類型轉(zhuǎn)化為該結(jié)構(gòu)體的首地址不就完美解決了嘛
在這里插入圖片描述
我們定義的這個 GPIO_TypeDef ,這個結(jié)構(gòu)體的首地址就為 0x4001 0800(這也是第一個成員變量 CRL 的地址), 那么結(jié)構(gòu)體中第二個成員變量 CRH 的地址即為 0x4001 0800 +0x04 ,加上的這個 0x04 ,正是代表 CRL 所占用的 4 個字節(jié)地址的偏移量,其它成員變量相對于結(jié)構(gòu)體首地址的偏移

3. 操作寄存器

最后我們就可以直接使用宏定義好 GPIO_TypeDef 類型的指針,而且指針指向各個 GPIO 端口的首地址,使用時我們直接用GPIOA這個指針對結(jié)構(gòu)體成員寄存器進行訪問
在這里插入圖片描述

五.總結(jié)

相信你讀完此文已經(jīng)大概知道什么叫寄存器,以及學(xué)好寄存器的重要性,詳細分析GPIO的八種工作模式已出—>STM32-GPIO八種工作模式,手把手教讓你變成點燈大師,如果覺得本文對你有幫助就快快點贊收藏叭?。?!

結(jié)束語:
最近發(fā)現(xiàn)一款刷題神器,如果大家想提升編程水平,玩轉(zhuǎn)C語言指針,還有常見的數(shù)據(jù)結(jié)構(gòu)(最重要的是鏈表和隊列)后面嵌入式學(xué)習(xí)操作系統(tǒng)的時如freerots、RT-Thread等操作系統(tǒng),鏈表與隊列知識大量使用。
大家可以點擊下面連接進入??途W(wǎng)刷題
點擊跳轉(zhuǎn)進入網(wǎng)站(C語言方向)
點擊跳轉(zhuǎn)進入網(wǎng)站(數(shù)據(jù)結(jié)構(gòu)算法方向)

在這里插入圖片描述

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

分享標(biāo)題:STM32新手入門-什么是寄存器-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://aaarwkj.com/article18/csoigp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)App設(shè)計、Google、全網(wǎng)營銷推廣、服務(wù)器托管自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
91在线直播观看高清| 免费观看在线黄色大片| 日本加勒比系列在线视频| 一区二区三区日韩专区| 欧美欧成人一区二区三区a∨| 淫色网av人妻中文字幕| 久久精品夜夜夜夜夜久久| 熟女少妇久久中文字幕| 免费黄色日韩在线观看| 国产传媒免费在线播放| 欧美中文字幕内射合集| 九九九热在线免费视频| 国产丝袜美女一区二区| 国产91久久精品一区二区| 亚洲熟女午夜毛片av毛片| 91黄色国产在线播放| 丰满人妻被黑人猛烈进入免费 | 一区二区三区三级视频| 欧美日韩激情中文字幕| 免费观看亚洲成人av| 久久婷婷欧美激情综合| 欧美精品一区二区三区黄片| 国产免费高清视频成人| 日本国产在线一区二区| 国语av一区二区三区| 中国日本欧美最黄大片| 亚洲一区二区三区黄色| 国产精品黑丝美女91| 人人人妻人人澡人人爽e| 亚洲精品视频久久免费| 亚洲综合色婷婷在线影院| 国产成人短视频在线播放| 日韩欧美一区亚洲一区| 欧美日韩在线国产一区| 91久久国产综合精品| 欧美日韩三级国产在线| 在线中文字幕日韩有码| 未满十八禁在线观看免费| 国产伦精品二区三区视频| 成年人正常性生活频率| 亚洲欧美日韩不卡视频|