日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32 进阶教程 8 - 位带操作

發布時間:2025/4/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32 进阶教程 8 - 位带操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

有過51單片機開發經歷的朋友應該都對51的IO口或一些特殊寄存器可以直接按位操作的方式不陌生吧,那么在stm32中有沒有類似的操作呢,答案是肯定的,本節將給大家介紹如何在STM32中實現位帶操作。

在《ARM Cortex-M3權為指南》中的第87頁對位帶操作如下描述:

位帶操作

支持了位帶操作后,可以使用普通的加載/存儲指令來對單一的比特進行讀寫。在 CM3中,有兩個區中實現了位帶。其中一個是 SRAM 區的最低 1MB 范圍,第二個則是片內外設區的最低 1MB 范圍。這兩個區中的地址除了可以像普通的 RAM 一樣使用外,它們還都有自己的“位帶別名區”,位帶別名區把每個比特膨脹成一個 32 位的字。當你通過位帶別名區訪問這些字時,就可以達到訪問原始比特的目的。

位帶區與位帶別名區的膨脹關系圖 A

位帶區與位帶別名區的膨脹對應關系圖 B

?

示例詳解

基于硬件平臺: STM32F10C8T6最小系統板, MCU 的型號是?STM32F103c8t6, 使用stm32cubemx 工具自動產生的配置工程,使用KEIL5編譯代碼。

?

?

本示例所用的最小系統板原理圖:

?

  • 關于CUBEMX工具及KEIL工具的操作將不再細講,如果還有不熟悉的可以查看之前的教程文檔。下面直接介紹工程配置:
  • 系統時鐘樹
  • 定時器配置
  • 引腳配置
  • 中斷配置(保持默認)
  • ?

    ?

  • 工程代碼
  • ?

  • 本節以stm32f103芯片為例,關于位帶操作的基本說明/舉例(可參看《ARM Cortex-M3權為指南》):
  • 位帶操作的概念其實30年前就有了,那還是8051 單片機開創的先河。如今,CM3 將此能力進化,這里的位帶操作是 8051 位尋址區的威力大幅加強版。

    ?

    CM3 使用如下術語來表示位帶存儲的相關地址

    z 位帶區: 支持位帶操作的地址區

    z 位帶別名: 對別名地址的訪問最終作用到位帶區的訪問上(注意:這中途有一個對

    地址映射過程)

    在位帶區中,每個比特都映射到別名地址區的一個字——這是只有 LSB 有效的字。當一個別名地址被訪問時,會先把該地址變換成位帶地址。對于讀操作,讀取位帶地址中的一個字,再把需要的位右移到 LSB,并把 LSB 返回。對于寫操作,把需要寫的位左移至對應的位序號處,然后執行一個原子的“讀-改-寫”過程。

    ?

    支持位帶操作的兩個內存區的范圍是:

    0x2000_0000‐0x200F_FFFFSRAM 區中的最低 1MB

    0x4000_0000‐0x400F_FFFF(片上外設區中的最低 1MB

    對于 SRAM 位帶區的某個比特,記它所在字節地址為 A, 位序號為 n(0<=n<=7),則該比特在別名區的地址為:

    AliasAddr0x22000000+((A‐0x20000000)*8+n)*4 =0x22000000+ (A‐0x20000000)*32 + n*4

    對于片上外設位帶區的某個比特,記它所在字節的地址為 A,位序號為 n(0<=n<=7),則該比特在別名區的地址為:

    AliasAddr0x42000000+((A‐0x40000000)*8+n)*4 =0x42000000+ (A‐0x40000000)*32 + n*4

    上式中,“*4表示一個字為 4 個字節,“*8表示一個字節中有 8 個比特。

    ?

    對于 SRAM 內存區,位帶別名的重映射如表 5.2 所示:

    5.2 SRAM 區中的位帶地址映射

    位帶區 ????????等效的別名地址

    0x20000000.0 0x22000000.0

    0x20000000.1 0x22000004.0

    0x20000000.2 0x22000008.0

    0x20000000.31 0x2200007C.0

    0x20000004.0 0x22000080.0

    0x20000004.1 0x22000084.0

    0x20000004.2 0x22000088.0

    0x200FFFFC.31 0x23FFFFFC.0

    ?

    對于片上外設,映射關系如下表所示:

    5.3 SRAM 區中的位帶地址映射

    位帶區 ????????等效的別名地址

    0x40000000.0 0x42000000.0

    0x40000000.1 0x42000004.0

    0x40000000.2 0x42000008.0

    0x40000000.31 0x4200007C.0

    0x40000004.0 0x42000080.0

    0x40000004.1 0x42000084.0

    0x40000004.2 0x42000088.0

    0x400FFFFC.31 0x43FFFFFC.0

    ?

  • 在main.c中加入如下圖所示代碼:
  • ?

  • 編譯工程,下載程序看效果,可以看到LED(PC13引腳驅動)亮500ms滅500ms交替進行,查看PC13引腳上的波形:
  • ?

    通過上面的實例,我們成功地通過使用位帶別名地址實現對寄存器中位的操作程,成功控制PC13引腳來控制LED的亮滅。是不是很簡單,對于在SRAMSRAM 內存區,通過位帶別名同樣可以輕易實現對位操作,有興趣的同學可以自行實險一下。

    OK,本期實驗完成!下期見!同時如果大家有什么疑問或是有想了解的其它內容,也歡迎大家留言!!最后喜歡這個公眾號的同學們記得加關注了,會有不定期技術干貨推出!!

    文中源碼資料下載,在公眾號里給十三發消息:

    下載|STM32進階教程 8

    ?

    關注十三公眾號

    ?

    ?

    總結

    以上是生活随笔為你收集整理的STM32 进阶教程 8 - 位带操作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。