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

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

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

STM32單片機中C語言操作寄存器的原理

單片機與嵌入式 ? 來源:單片機與嵌入式 ? 2023-11-30 14:08 ? 次閱讀

映射的概念

存儲器本身不具有地址信息,它的地址是由芯片廠商或用戶分配,給存儲器分配地址的過程就稱為存儲器映射,如下圖所示的4GB空間(從block0-block7每個block512M)。在梳理STM32芯片的內(nèi)部架構(gòu)中提到的被控單元FLASH、RAM、FSMC和APB等功能部件共同排列在這4GB的地址空間內(nèi)。在編程的時候,可以通過他們的地址找到他們,然后通過C語言對它們進(jìn)行數(shù)據(jù)的讀和寫操作。

8d6e0094-8f36-11ee-939d-92fbcf53809c.png

存儲器映射

在這 4GB 的地址空間中,ARM 已經(jīng)粗線條的平均分成了 8 個塊,每塊 512MB,每個塊也都規(guī)定了用途,具體分類見如下表格。在這 8 個 Block 里面,有 3 個塊非常重要,也是我們最關(guān)心的三個塊。Block0 用來設(shè)計成內(nèi)部FLASH,Block1 用來設(shè)計成內(nèi)部 RAM,Block2 用來設(shè)計成片上的外設(shè)。其中,Block2 用于設(shè)計片內(nèi)的外設(shè),根據(jù)外設(shè)的總線速度不同,Block 被分成了AHB、APB1、APB2。

8d98e502-8f36-11ee-939d-92fbcf53809c.png

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

通過C語言操作寄存器的例子

GPIOB端口的輸出數(shù)據(jù)寄存器ODR的地址是0x40010C0C,ODR寄存器是32bit,低16bit有效,對應(yīng)著16個外部IO,寫0、1對應(yīng)的IO則輸出低、高電平?,F(xiàn)在我們通過C語言指針的操作方式,讓GPIOB的16個IO都輸出高電平,見如下代碼。

// GPIOB 端口全部輸出 高電平 
*(unsigned int*)(0x4001 0C0C) = 0xFFFF;

0x40010C0C在我們看來是GPIOB端口ODR的地址,但是在編譯器看來,這只是一個普通的變量,是一個立即數(shù),要想讓編譯器也認(rèn)為是指針,我們得進(jìn)行強制類型轉(zhuǎn)換,把它轉(zhuǎn)換成指針,即(unsigned int *)0x4001 0C0C,然后再對這個指針進(jìn)行*操作。

通過絕對地址訪問內(nèi)存單元不好記憶且容易出錯,可以通過寄存器的方式來操作,具體見如下代碼。

//GPIOB端口全部輸出高電平
#defineGPIOB_ODR(unsignedint*)(GPIOB_BASE+0x0C)
*GPIOB_ODR=0xFF;

審核編輯:湯梓紅

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

    關(guān)注

    6030

    文章

    44489

    瀏覽量

    631989
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5294

    瀏覽量

    119816
  • 存儲器
    +關(guān)注

    關(guān)注

    38

    文章

    7430

    瀏覽量

    163517
  • STM32
    +關(guān)注

    關(guān)注

    2264

    文章

    10854

    瀏覽量

    354298
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7594

    瀏覽量

    135861

原文標(biāo)題:STM32單片機中C語言操作寄存器的原理

文章出處:【微信號:單片機與嵌入式,微信公眾號:單片機與嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    STM32單片機C語言基礎(chǔ)知識

    C語言單片機開發(fā)的必備基礎(chǔ)知識,本文列舉了部分STM32學(xué)習(xí)中比較常見的一些C
    發(fā)表于 09-21 17:21 ?4515次閱讀

    STM32單片機使用寄存器是如何進(jìn)行操作

    以下實例為STM32單片機使用寄存器進(jìn)行操作的一個頭文件的代碼因為直接對寄存器進(jìn)行
    發(fā)表于 07-15 06:15

    51單片機匯編語言教程_單片機的特殊功能寄存器

    51單片機匯編語言教程:7課單片機的特殊功能寄存器
    發(fā)表于 01-19 15:26 ?0次下載

    STM32庫函數(shù)和寄存器應(yīng)該如何操作

    從開始接觸51單片機,到現(xiàn)在開始轉(zhuǎn)型學(xué)習(xí)功能更加強大的STM32f407系列,學(xué)習(xí)過程引入了庫函數(shù)及相應(yīng)操作,當(dāng)時趕著進(jìn)度做點東西出來,有點不求甚解?,F(xiàn)在返回來求索:相比于原來51
    發(fā)表于 09-10 17:26 ?3次下載
    <b class='flag-5'>STM32</b>庫函數(shù)和<b class='flag-5'>寄存器</b>應(yīng)該如何<b class='flag-5'>操作</b>

    51單片機特殊功能寄存器C51程序的定義詳細(xì)說明

    具有位尋址能力,它們的字節(jié)地址都能被8整除,即字節(jié)地址是以8或0為尾數(shù)的。為了能直接訪問這些SPR,F(xiàn)ranklin C51提供了一種自主形式的定義方法,這種定義方法與標(biāo)準(zhǔn)C語言不兼容,只適合與對MCS-51系列
    發(fā)表于 07-22 17:37 ?1次下載
    51<b class='flag-5'>單片機</b>特殊功能<b class='flag-5'>寄存器</b>在<b class='flag-5'>C</b>51程序<b class='flag-5'>中</b>的定義詳細(xì)說明

    STM32單片機不完全手冊之寄存器版本

    STM32單片機不完全手冊之寄存器版本
    發(fā)表于 07-31 16:10 ?0次下載

    單片機寄存器

    單片機寄存器其實就相當(dāng)于一個變量,只不過這個變量在固定的地址,有一個特殊的名稱(當(dāng)然也不強制)。初學(xué)者對寄存器操作比較困難的原因不是匯編語言
    發(fā)表于 11-10 18:35 ?11次下載
    <b class='flag-5'>單片機</b><b class='flag-5'>寄存器</b>

    C語言操作在(單片機)寄存器的應(yīng)用

    C語言操作寄存器的應(yīng)用本文參考另一篇博客寫成附鏈接,個人感覺內(nèi)容過多不便于吸收,就寫了這篇博客。整體思想:設(shè)置一個位就是設(shè)置該位為1,
    發(fā)表于 11-29 10:06 ?8次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>位<b class='flag-5'>操作</b>在(<b class='flag-5'>單片機</b>)<b class='flag-5'>寄存器</b><b class='flag-5'>中</b>的應(yīng)用

    32單片機 C語言 寄存器(四)

    32單片機C語言相關(guān)知識以及寄存器地址名稱映射分析
    發(fā)表于 11-29 10:06 ?12次下載
    32<b class='flag-5'>單片機</b> <b class='flag-5'>C</b><b class='flag-5'>語言</b> <b class='flag-5'>寄存器</b>(四)

    C語言寄存器操作

    C語言寄存器操作
    發(fā)表于 01-13 12:56 ?6次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>寄存器</b><b class='flag-5'>操作</b>

    STM32寄存器操作

    STM32寄存器操作在使用STM32單片機編程時一般都用ST給的庫函數(shù)編程,庫函數(shù)編程的底層就是對單片
    發(fā)表于 01-13 15:43 ?19次下載
    <b class='flag-5'>STM32</b>的<b class='flag-5'>寄存器</b><b class='flag-5'>操作</b>

    STM32單片機C語言操作寄存器的原理

    存儲本身不具有地址信息,它的地址是由芯片廠商或用戶分配,給存儲分配地址的過程就稱為存儲映射
    發(fā)表于 02-08 17:08 ?0次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>單片機</b><b class='flag-5'>中</b><b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>操作</b><b class='flag-5'>寄存器</b>的原理

    C語言操作寄存器的常見手法

    使用C語言寄存器賦值時,常常需要用到C語言的位操作方法。把
    的頭像 發(fā)表于 03-12 09:06 ?3266次閱讀

    單片機寄存器有哪些 單片機寄存器怎么理解 寄存器單片機的關(guān)系

    單片機寄存器是一種特殊的存儲器件,用于存儲和處理程序的數(shù)據(jù)和指令??梢詫?b class='flag-5'>單片機寄存器看作是CPU內(nèi)部的工作區(qū)域,類似于人的大腦,用于暫時存
    發(fā)表于 04-01 15:47 ?6043次閱讀

    單片機工作寄存器作用 單片機常用專用寄存器

    除了通用寄存器(如累加、通用寄存器等),單片機還會有特定功能的寄存器,如定時
    的頭像 發(fā)表于 04-08 14:46 ?7231次閱讀