娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年09月29日(星期日)

正在發生

2021年09月29日 | STM32的位帶操作分析

發布者:binggege 來源: eefocus關鍵字:STM32  位帶操作  寄存器 手機看文章 掃描二維碼
隨時隨地手機看文章

8051單片機可以直接對某一位IO進行讀寫操作,而Cortex-M3的位帶操作是8051位尋址區的加強版。使用位帶操作后,可以使用普通的加載/存儲指令對單一的比特進行讀寫操作。


一、相關概念。


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


位帶別名區:對別名地址的訪問最終作用到位帶區的訪問上。位帶別名區對位帶區的訪問有個地址映射過程。



二、位帶操作的原理


位帶操作的最終目的是想對位帶區的比特位進行獨立的讀寫操作。但它是通過對位帶別名區的操作來實現的。


具體過程如下:


對位帶別名區進行讀寫訪問,位帶別名區通過地址映射關系映射到相應的位帶區,對位帶區進行原始比特的讀寫操作。

三、地址映射


上面對位帶操作進行了簡單的介紹,那么哪些地址支持位帶操作?它們對應的位帶別名區地址又是多少?兩者間的地址映射關系又是怎么樣的?


1、支持位帶操作的地址


Cortex-M3有兩個區支持位帶操作。這兩個區除了像普通的RAM一樣使用外,還可以通過位帶別名區進行操作。這兩個區(位帶區)分別是:


SRAM區中的最低1MB:0x2000 0000 - 0x200F FFFF


片上外設去中的最低1MB:0x4000 0000 - 0x400F FFFF


這兩個位帶區對應的位帶別名區是:


SRAM區中的最低1MB的位帶區對應的位帶別名區:

片上外設去中的最低1MB的位帶區對應的位帶別名區:

2、位帶區與位帶別名區的地址映射關系


位帶別名區把位帶區的每一個比特位膨脹成32位的字,即位帶區的每一個比特位對應位帶別名區中一個4個字節大小的地址。


下圖示例SRAM區中的最低1MB的位帶區與位帶別名區的膨脹對應關系:

計算公式:


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

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

說明:“*4”表示一個字為4個字節,“*8”表示一個字節中有8個比特。


四、讀寫操作的機制


在位帶區中,雖然每個比特位都映射到別名區的一個字,但別名區的字只有LSB(最低位有效)有效,所以讀寫操作是對別名區字的LSB進行讀寫,LSB的數值是0或1.


1、讀流程:

舉例子:


讀取SRAM地址0x2000 0000 的第二位的值:

2、寫流程:讀、改、寫

舉例子:


將SRAM地址0x2000 0000 的第二位的值置1:

五、位帶操作編程實現


在C編譯器中并沒有直接支持位帶操作,比如,C編譯器并不知道同一塊內存可以用不同的地址來訪問,也不知道對位帶別名區的訪問只對LSB有效。欲在C中使用位帶操作,最簡單的做法時#define一個位帶別名區的地址。


1、位帶操作的宏定義


 為了簡化位帶操作,我們可以建議一個把”位帶地址+位序號“轉換為別名地址的宏,再建立一個把別名地址轉換為指針類型的宏:

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) /* 把”位帶地址+位序號“轉換為別名地址的宏  */

#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) /* 把別名地址轉換為指針類型的宏  */

#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) /* 某地址某一位的位帶操作的宏  */


2、舉個例子


下面以STM32F407的GPIOA->ODR寄存器(地址為0x40020014)為例,通過位帶操作進行讀寫,并與傳統方式讀寫比較,并通過串口將信息發送到控制臺顯示。代碼如下:


頭文件定義:


#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 

#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 

#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 

//IO口地址映射

#define GPIOA_ODR_Addr    (GPIOA_BASE+20) //0x40020014

#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  


main函數:

int main(void)

{

u8 Temp;

u16 Data;

Data = 0;

Stm32_Clock_Init(336,8,2,7);//初始化時鐘為 168Mhz

delay_init(168);  //初始化延時函數

uart_init(84,115200);  //串口初始化為 115200

 

printf("init finishedrn");

GPIOA->ODR = 0xffff; /* 傳統方式寫:將GPIOA->ODR各個位寫1 */

printf("Tratidional operate: GPIOA->ODR[0x%x]:0x%xrn", &GPIOA->ODR, GPIOA->ODR);

GPIOA->ODR = 0x0; /* 將GPIOA->ODR清零 */

printf("Clear GPIOA->ODR: GPIOA->ODR[0x%x]:0x%xrn", &GPIOA->ODR, GPIOA->ODR);

 

for(Temp = 0; Temp < 16; Temp++)

{

PAout(Temp) = 1; /* 位帶操作寫:通過位帶別名區寫GPIOA->ODR每一位為1 */

}

printf("Bit-band write: GPIOA->ODR[0x%x]:0x%xrn", &GPIOA->ODR, GPIOA->ODR); /* 可以看到位帶操作寫后,GPIOA->ODR各位的值 */

 

for(Temp = 0; Temp < 16; Temp++)

{

Data |= (PAout(Temp) << Temp); /* 位帶操作讀:通過位帶別名區讀GPIOA->ODR每一位的值,并存在Data中 */

}

printf("Bit-band read: GPIOA->ODR[0x%x]:0x%xrn", &GPIOA->ODR, Data); /* 可以看到位帶操作讀后,GPIOA->ODR各個比特位對應的別名區的值 */

while(1)

{

}

return 1;

}


串口打印的信息:

 本文主要參考以下資料編寫:


 ·《CM3權威指南》第五章(87頁~92頁)


 ·《STM32F4xx中文參考手冊》

關鍵字:STM32  位帶操作  寄存器 引用地址:STM32的位帶操作分析

上一篇:STM32入門學習之USART(STM32F030F4P6基于CooCox IDE)
下一篇:STM32:位帶操作分析

推薦閱讀

在三大件里面,目前整車企業都開始自己滲透入電機生產、電驅動動力總成的組裝和電池Pack的組裝(部分車企是自己做模組的),目前網上第一批?奧迪e-tron電動車平臺有兩臺異步電機分別位于前后軸,電池位于車身的中間,布局在車底位置。位于前軸的電機最大功率是125千瓦,boost模式下能夠達到135千瓦。位于后軸的電機最大功率140千瓦,在boost模式可以爆發1...
折疊手機Galaxy Fold即將在美國開賣,卻又出現折疊屏幕瑕疵。美國科技媒體《TechCrunch》報道指出,Galaxy Fold使用27小時就出現瑕疵。27日起,三星電子將通過美國電信AT&T、美國最大家電品牌百思買、三星直營店銷售Galaxy Fold,但外媒《TechCrunch》卻傳出屏幕瑕疵問題。TechCrunch記者布萊恩·希特(Brian Heater)試用的Galaxy Fold屏幕中間出現...
近日,深圳市科技創新委對外公示了2020年基礎研究重點項目擬資助項目,302個項目榜上有名,涉及電子信息、生物和生態環保、智能裝備、材料能源領域,擬資助總金額超過6億元。其中,南方科技大學申報的“GaN功率和射頻器件制備技術及其機理研究”項目擬獲得250萬元資助;“低功耗 PAM4調制全集成光接收芯片設計技術研究”項目擬獲得200萬元資助;“半導體...
#include "stm32f0xx.h"#include "stm32_lib/inc/stm32f0xx_rcc.h"#include "stm32_lib/inc/stm32f0xx_gpio.h"#include "stm32_lib/inc/stm32f0xx_usart.h" int main(void){ //1、使能時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //特別注意:因為串口有使用GPIO,所以對應GPIO的時鐘也要使能 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_...

史海拾趣

問答坊 | AI 解惑

PT100分度表

PT100溫度傳感器分度表。在附件中。…

查看全部問答∨

請大俠幫忙。。。畢業設計(論文)題目:基于PC機控制的LED點陣顯示屏的下位機設計

本帖最后由 paulhyde 于 2014-9-15 09:50 編輯 I、畢業設計(論文)題目: 基于PC機控制的LED點陣顯示屏的下位機設計 II、畢 業設計(論文)使用的原始資料(數據)及設計技術要求: 在PC機上實現基于RS232的串行通信功能,制定和實現可靠 ...…

查看全部問答∨

如何備賽,讓取得成績的老師說話~~~

本帖最后由 paulhyde 于 2014-9-15 09:19 編輯 附件是一些備賽資料,覺得不錯,與壇子里的朋友分享下。 如果覺得侵權,請告之,我會修改。不過,真的謝謝這三位老師的貢獻。 職業院校技能大賽&組織培訓基本方法 ——by北京信息職業技術學院電 ...…

查看全部問答∨

求助:關于電感磁芯

    我們做一款小功率的電源類產品,內部涉及到一個電感,我們目前是用鐵粉芯材料的磁環,可是發熱比較嚴重,我們考慮能否用一個高頻特性好磁芯來替換一下。     其工作頻率約300KHz、電感量約10uH、導線過電流能力10A左右, ...…

查看全部問答∨

介紹幾款Allegro 應用在LED 照明與顯示產品上芯片

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 編輯 …

查看全部問答∨

lcd驅動編程輔導

這是求助的帖子。以前還沒真真寫過程序,現在下寫一個希望各位能給點幫助。比如能說說lcd的硬件原理,信號的分析,以及寫驅動的大概框架。不知道這個要求會不會太高。如是能順利出來的話,再和大家討論討論。謝謝…

查看全部問答∨

MCP2515接收報文時的問題

  各位大俠!   小弟目前用MCP2515接收CAN通信時碰到如下問題,期待大俠的幫忙~~   問題是這樣的:   在CAN通信,接收報文時:   接收時,首先MCU會先檢測CANINTF.RXOIF的狀態位,如果為1 ...…

查看全部問答∨

請教一問題

                                 我想用STM32F101做手持設備,電池供電.USB功能不需要.工作電流能做到多少?謝謝!…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 比如县| 柘荣县| 彭泽县| 游戏| 垣曲县| 花垣县| 策勒县| 行唐县| 侯马市| 忻城县| 七台河市| 玉树县| 汉源县| 阿拉善右旗| 临猗县| 佛学| 株洲市| 平湖市| 义乌市| 土默特右旗| 阿鲁科尔沁旗| 盐山县| 湘潭县| 香港 | 兴文县| 木兰县| 三河市| 洛川县| 奉贤区| 沂水县| 多伦县| 尖扎县| 延安市| 伊宁县| 吉安县| 景德镇市| 上饶县| 宜宾市| 滕州市| 浦城县| 东乌|