STM32中的位帶操作: 名字為位帶操作,實際上是對位的操作,位操作就是可以單獨的對一個比特位讀和寫,這個在 51 單片機中非常常見。 51 單片機中通過關鍵字 sbit 來實現位定義, STM32 沒有這樣的關鍵字,而是通過訪問位帶別名區來實現。STM32 的全部寄存器都可以通過訪問位帶別名區的方式來達到訪問原始寄存器比特位的效果,這比 51 單片機強大很多。因為 51 單片機里面并不是所有的寄存器都是可以比特位操作,有些寄存器還是得字節操作,比如 SBUF。
51單片機中的位操作:
51單片機中可以對寄存器實現單個位的操作,靠的就是關鍵字sbit,如
sbit led=P1^0; led=1;就可實現對P1.0位置1的效果。
為什么STM32不推崇直接進行位操作?
本人認為STM32是32位MCU,一次處理32位數據,所以一次只處理一位的數據未必大材小用了,除非特殊情況,否則都以32位處理。
如何處理STM32中要對某一位進行操作時的情況?
要知道STM32中采用庫函數編程,所以有很多的對位操作的任務都用具體的函數來完成,而這些函數都已經做好了我們只需要知道怎么用就行。但我們仍然可以自己實現位操作,這種神操作就是位帶操作 。
位帶區與位帶區別名:
在 STM32 中,有兩個地方實現了位帶,一個是 SRAM 區的最低 1MB 空間,令一個是外設區最低 1MB 空間。這兩個 1MB 的空間除了可以像正常的 RAM 一樣操作外,他們還有自己的位帶別名區,位帶別名區把這 1MB 的空間的每一個位膨脹成32 位 (要知道 STM32 的系統總線是 32 位的,按照 4 個字節訪問的時候是最快的,所以膨脹成 4 個字節來訪問是最高效的。),當訪問位帶別名區的這些字時,就可以達到訪問位帶區某個比特位的目的。
位帶區就是就是可以進行位帶操作的寄存器的映射地址。
位帶區別名可以理解為將位帶區每一個位都膨脹32倍(用一個字節代表一個位,以便于32位MCU操作)后的地址。
如何實現位帶操作?
要進行位帶操作需要知道被操作的位的地址,因為SRAM和外設中都可以位帶操作,所以形式上可以將位帶操作歸納為倆個公式。
對于位帶區的某個比特,記它所在字節的地址為 A,位序號為 n(0<=n<=7),則其在位帶區別名地址為:
外設:AliasAddr= =0x42000000+ (A-0x40000000)*8*4 +n*4
SRAM:AliasAddr= =0x22000000+ (A-0x20000000)*8*4 +n*4
用外設解釋公式:0X42000000 是外設位帶別名區的起始地址, 0x40000000 是外設位帶區的起始地址,(A-0x40000000)表示該比特前面有多少個字節,一個字節有 8 位,所以8,一個位膨脹后是 4 個字節,所以4, n 表示該比特在 A 地址的序號,因為一個位經過膨脹后是四個字節,所以也*4。
當然,也可以將倆個公式合二為一:
// 把“位帶地址+位序號”轉換成別名地址的宏
AliasAdd = (addr & 0xF0000000)+0x02000000+((addr &0x00FFFFFF)<<5)+(bitnum<<2)
知曉了位帶區別名的地址,然后將此地址轉換為指針類型就可以通過位帶操作對原始的為進行操作。
附上野火的位帶操作代碼:
#include "stm32f10x.h"
#include "./led/bsp_led.h"
#define PCout(n) (*(unsigned int*)(((GPIOC_BASE+0x0c) & 0xF0000000)+0x02000000+(((GPIOC_BASE+0x0c) &0x000FFFFF)<<5)+(n<<2)))
#define PBout(n) (*(unsigned int*)(((GPIOB_BASE+0x0c) & 0xF0000000)+0x02000000+(((GPIOB_BASE+0x0c) &0x000FFFFF)<<5)+(n<<2)))
void delay(uint32_t count)
{
for(; count!=0; count--);
}
int main(void)
{
LED_GPIO_Config(); //LED初始化函數
while(1)
{
PCout(2) = 1;
//GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
delay(0xfffff);
PCout(2) = 0;
//GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
delay(0xfffff);
PCout(3) = 1;
//GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
delay(0xfffff);
PCout(3) = 0;
//GPIO_ResetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
delay(0xfffff);
}
代碼簡述:用宏定義的方法來操作GPIOC中的ODR寄存器和IDR寄存器中的某一位來實現led燈的亮滅
#define PCout(n) (*(unsigned int*)(((GPIOC_BASE+0x0c) & 0xF0000000)+0x02000000+(((GPIOC_BASE+0x0c) &0x000FFFFF)<<5)+(n<<2)))
上一篇:利用ST-LINK配合ST-LINK Utility 將bin文件下載到STM32的FLASH中
下一篇:STM32—重定向printf和getchar函數到串口
推薦閱讀
史海拾趣
對于四通道紅外遙控器接收器電路,網友可能提出的問題涉及多個方面,以下是一些可能的問題及回答:
一、技術原理類問題
-
問題:四通道紅外遙控器接收器電路是如何工作的?
回答:四通道紅外遙控器接收器電路主要通過光電二極管接收遙控器發射的紅外信號,經過放大、解碼等處理,最終識別出不同的按鍵指令,并控制相應的設備執行操作。具體來說,當遙控器發射出特定頻率的紅外光信號時,光電二極管將光信號轉換為電信號,經過放大電路放大后,送入解碼器進行解碼,解碼器根據解碼結果輸出相應的控制信號,控制設備執行相應的操作。 -
問題:接收器電路中的關鍵元件有哪些?
回答:接收器電路中的關鍵元件包括光電二極管(用于接收紅外光信號)、放大器(用于放大微弱的電信號)、解碼器(用于解碼信號并輸出控制信號)以及可能的濾波電路(用于濾除噪聲干擾)等。這些元件共同協作,實現紅外信號的接收和處理。
二、故障排查與維修類問題
-
問題:接收器無法接收到信號,可能的原因有哪些?
回答:接收器無法接收到信號的可能原因包括:- 光電二極管損壞或老化,導致無法有效接收紅外光信號。
- 接收器電路中的連接線松動或接觸不良,導致信號傳輸中斷。
- 放大器或解碼器故障,無法對接收到的信號進行正常放大或解碼。
- 接收器受到外界干擾(如光線、電磁干擾等),影響信號的接收和處理。
針對以上問題,可以逐一檢查光電二極管、連接線、放大器、解碼器等元件的狀態,并采取相應的維修或更換措施。同時,注意避免將接收器放置在易受干擾的環境中。
-
問題:如何排查和解決接收器響應延遲或誤動作的問題?
回答:排查和解決接收器響應延遲或誤動作的問題可以從以下幾個方面入手:- 檢查遙控器發射的紅外信號是否正常,包括信號的頻率、強度等是否符合接收器的要求。
- 檢查接收器電路中的濾波電路是否設置得當,以避免噪聲干擾導致誤動作。
- 檢查解碼器的解碼邏輯是否正確,以確保能夠準確識別出遙控器發射的指令。
- 如果以上均正常,可以考慮檢查接收器的電源系統是否穩定,以及是否有其他電路元件故障導致的影響。
針對具體問題,可以采取相應的調整或維修措施來解決。
三、應用與拓展類問題
-
問題:四通道紅外遙控器接收器電路可以應用于哪些場景?
回答:四通道紅外遙控器接收器電路可以廣泛應用于各種需要遙控控制的設備中,如智能家居系統(如電視、空調、燈光等的遙控控制)、工業自動化控制(如電機、閥門等的遠程控制)、安防監控系統(如攝像頭、報警器的遙控操作)等。通過擴展通道數量和增加控制邏輯,還可以實現更復雜的控制功能。 -
問題:如何對四通道紅外遙控器接收器電路進行升級或改造?
回答:對四通道紅外遙控器接收器電路進行升級或改造時,可以考慮以下幾個方面:- 升級光電二極管或放大器等關鍵元件的性能,以提高接收靈敏度和信號處理能力。
- 增加濾波電路或改進解碼算法,以減少噪聲干擾和提高解碼準確性。
- 擴展通道數量或增加控制邏輯,以實現更復雜的控制功能。
- 引入無線通信模塊(如Wi-Fi、藍牙等),將紅外遙控與無線控制相結合,提高控制的靈活性和便捷性。
在進行升級或改造時,需要根據具體的應用需求和技術條件進行選擇和設計。
隨著國內市場的飽和,Carroll & Meynell Transformers Ltd公司開始將目光投向國際市場。公司積極參與國際電子行業的交流與合作,學習借鑒國際先進經驗和技術。同時,公司還加大了對海外市場的拓展力度,通過參加國際展覽、建立海外銷售網絡等方式,將產品推向全球。這一國際化戰略不僅為公司帶來了更廣闊的市場空間,也提升了公司的國際影響力。
自1997年成立以來,AnalogicTech便致力于技術創新,不斷推動電子行業的發展。公司總部位于硅谷,設計中心則分布在圣塔克拉拉和上海,匯聚了全球頂尖的研發人才。憑借深厚的技術底蘊和創新能力,AnalogicTech成功研發出一系列具有顛覆性的產品,為當今最具創造性的消費品提供了強大的技術支持。
為了進一步提升競爭力,BOCA公司開始嘗試產業鏈整合。公司不僅加強了對上游原材料供應商的控制,還通過并購和合作的方式,將下游的組裝、銷售等環節也納入自己的體系。這一舉措使得BOCA能夠更好地控制產品質量和交貨期,同時也降低了成本,提高了整體運營效率。
綠寶石公司自創立之初,便致力于電子材料領域的研發。某年,公司研發團隊成功開發了一種具有優異性能的綠寶石電子材料,這種材料在高頻、高溫等極端環境下仍能保持穩定性能,為電子行業帶來了革命性的變革。隨著這一技術的廣泛應用,綠寶石公司在行業內逐漸樹立了技術領先的形象,市場份額穩步上升。
作為一家技術驅動的公司,EPC公司一直致力于持續創新和產品研發。近年來,公司不斷推出新的氮化鎵功率半導體器件和集成電路產品,以滿足市場不斷變化的需求。其中,EPC公司全新推出的ePower功率級集成電路系列,為高功率密度應用提供了更高性能及更小型化的解決方案。這一系列產品在市場上獲得了良好的反響,進一步鞏固了EPC公司在氮化鎵技術領域的領先地位。