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入門學習之USART(STM32F030F4P6基于CooCox IDE)
下一篇:STM32:位帶操作分析
推薦閱讀
史海拾趣
隨著導熱材料技術的不斷進步,其應用領域也在不斷擴展。Bergquist Company緊跟市場需求,將導熱產品應用于汽車、家用電器、電腦、散熱器、電源供應器及電馬達控制等多個領域。這些產品的廣泛應用不僅提升了人們的生活品質,還為公司的持續發展注入了強大動力。
作為一家具有高度責任感的企業,DiCon長期以來一直致力于為國防工業提供高質量的光纖通信產品。公司的首批產品之一FDDI交換機在許多海軍艦艇上部署了30多年,為國家的安全穩定做出了重要貢獻。這一里程碑事件不僅彰顯了DiCon在光纖通信技術領域的實力,也進一步提升了公司的品牌形象和市場地位。
面對電子行業的快速變革和市場競爭的加劇,Anderson Electronics Inc公司積極進行產業升級和智能制造的轉型。公司引進了先進的生產設備和技術,實現了生產過程的自動化和智能化。同時,公司還加大了對研發人員的培養和引進力度,建立了一支高素質的研發團隊。通過產業升級和智能制造的轉型,公司成功提升了生產效率和產品質量,進一步鞏固了市場地位。
進入20世紀90年代,電子行業的技術革新日新月異。Connor-Winfield敏銳地捕捉到了市場的變化,開始將產品線擴展到其他領域,以滿足更多客戶的需求。除了石英計時電路和振蕩器,公司還開始研發和生產一系列與電子應用緊密相關的產品。這些新產品的推出,不僅進一步鞏固了公司在行業內的地位,也為其開拓了更廣闊的市場空間。
碩頡科技股份有限公司成立于1999年11月,總部設在臺北市。自成立以來,公司一直專注于積體電路的設計、研發與銷售,致力于為客戶提供高質量的電子產品解決方案。在創立初期,碩頡便以其創新的技術和嚴謹的研發態度,迅速在電子行業嶄露頭角。公司資本額為新臺幣三億三仟萬元,為公司的穩健發展提供了堅實的資金基礎。
在競爭激烈的電子照明市場中,Califia Lighting始終堅持以技術創新為核心競爭力。公司不斷投入研發資源,推動LED照明技術的升級和突破。通過引入先進的生產工藝和設計理念,Califia Lighting成功開發出了一系列具有獨特優勢的產品,如高效節能、長壽命、環保等,贏得了市場的廣泛認可。
請大俠幫忙。。。畢業設計(論文)題目:基于PC機控制的LED點陣顯示屏的下位機設計 本帖最后由 paulhyde 于 2014-9-15 09:50 編輯 I、畢業設計(論文)題目: 基于PC機控制的LED點陣顯示屏的下位機設計 II、畢 業設計(論文)使用的原始資料(數據)及設計技術要求: 在PC機上實現基于RS232的串行通信功能,制定和實現可靠 ...… 查看全部問答∨ |
|
本帖最后由 paulhyde 于 2014-9-15 09:19 編輯 附件是一些備賽資料,覺得不錯,與壇子里的朋友分享下。 如果覺得侵權,請告之,我會修改。不過,真的謝謝這三位老師的貢獻。 職業院校技能大賽&組織培訓基本方法 ——by北京信息職業技術學院電 ...… 查看全部問答∨ |
|
各位大俠! 小弟目前用MCP2515接收CAN通信時碰到如下問題,期待大俠的幫忙~~ 問題是這樣的: 在CAN通信,接收報文時: 接收時,首先MCU會先檢測CANINTF.RXOIF的狀態位,如果為1 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 利用驗證框架 JAIST揭示開源自動駕駛系統的安全漏洞
- 現代汽車集團擬采用VR模擬器替代道路測試 提升未來車型的競爭力
- 研究人員開發光驅動致動器 可用于驅動水下機器人
- 吉利將發射“千里浩瀚”衛星,實現輔助駕駛系統與衛星功能深度融合
- 以鴻道工業操作系統為核心 打造工業智能機器人新生態
- UNIST研發出新表面處理技術 延長下一代鋰金屬電池的壽命
- 車載SerDes芯片行業的"DeepSeek"時刻——瑞發科HSMT SerDes閃耀2025上海車展
- 豐田顛覆傳統,固態電池明年就能量產,最受傷的將是中國?
- 基于恩智浦與onsemi的駕駛員監控系統方案
- 機器人行業周報|5月27日:宇樹G1格斗賽、人形機器人技術與場景融合趨勢