成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

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

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

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

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

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

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

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

在這里插入圖片描述

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

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

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

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

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ù)據(jù)寄存器里面取數(shù)據(jù)),所以為了避免訪問沖突,在取數(shù)的時候需要經(jīng)過一個總線矩陣來仲裁,決定哪個總線在取數(shù),取到的數(shù)據(jù)可以暫存在Cortex?-M3內(nèi)核里面的寄存器在進行處理。

  • 系統(tǒng)總線System

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

  • DMA 總線

DMA 總線與DCode總線一樣主要是用來傳輸數(shù)據(jù),但Dcode總線傳輸數(shù)據(jù)要占用內(nèi)核(cpu)的資源,而DMA總線相當于獨立于內(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ù)據(jù)寄存器,可以在SRAM,可以在內(nèi)部的 FLASH。所以為了避免訪問沖突,在取數(shù)的時候需要經(jīng)過一個總線矩陣來仲裁,決定哪個總線在取數(shù)

4. 被動單元

  • 內(nèi)部FLASH

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

  • 內(nèi)部SRAM

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

  • FSMC

FSMC 的英文全稱是 Flexible static memory controller,叫靈活的靜的存儲器控制器,是 STM32F10xx 中一個很有特色的外設通過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 各種各樣的特色外設。我們經(jīng)常說的 GPIO、串口、I2C、SPI 這些外設就掛載在這兩條總線上,這個是我們學習 STM32 的重點,就是要學會編程這些外設去驅(qū)動外部的各種設備。

三.存儲器映射

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

程序存儲器、數(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 的橋(即片上外設),這些功能部件共同排列在一個 4GB 的地址空間內(nèi)。我們在編程的時候,可以通過他們的地址找到他們,然后來操作他們( C語言里的將地址解引用操作 * 取出內(nèi)容對他們進行數(shù)據(jù)的讀和寫)。
在這里插入圖片描述

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

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

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

2. 什么是寄存器

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

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

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

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

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

4. STM32的外設地址映射

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

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

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

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

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

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

  • 外設寄存器

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

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

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

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

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

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

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

1. 封裝總線和外設基地址

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

2. 封裝寄存器列表

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

3. 操作寄存器

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

五.總結

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

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

在這里插入圖片描述

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

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

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

廣告

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

h5響應式網(wǎng)站建設
平陆县| 莲花县| 平原县| 奉新县| 石屏县| 建德市| 武鸣县| 龙陵县| 秦安县| 安阳县| 常德市| 遂昌县| 霍城县| 台山市| 明溪县| 丹棱县| 武宁县| 普格县| 拜泉县| 凌云县| 沙河市| 自治县| 巴林左旗| 岗巴县| 如皋市| 田阳县| 昌江| 怀集县| 庆阳市| 延边| 靖江市| 东阳市| 余干县| 遂川县| 宜昌市| 同心县| 子洲县| 广安市| 宝丰县| 馆陶县| 山丹县|