51單片機估計都用過,可以單獨對P1口的第一個IO進行操作,然而STM32是不允許這樣做的,為了像51單片機一樣能夠單獨的對某一個IO單獨操作,就引入了位帶操作這樣的概念,簡而言之,言而總之,就是為了單獨操作32里面的某個端口,所以才有了位帶這樣的操作機制。
位帶區,和位帶別名區,位帶區,就是你想單獨操作的IO的區域,也就是PA,PB等等這一堆IO口的內存所在區,而位帶別名區,就是給每一位重新起了個名字的那一片地址區域。M3內核 存儲器映射表,1M內存的BitBand區,還有與之對應的32M內存的BitBand別名區,因為你將每一位膨脹成為了一個32位,所以相應的別名區的內存也會是位帶區的32倍。
官方給出的相應的計算公式,以外設為例
AliasAddr=0X42000000+((A-0X40000000)*8+n)*4=0X42000000+(A-0X40000000)*32+n*4
AliasAddr是別名區的地址,A是GPIOA->ODR的地址,n是該端口的上的某一位,這里就是1,通過這個公式你可以找到對應的別名區的地址,接下來就是對這個地址進行操作了,你給他寫1,該位輸出1,寫0,就輸出0。
0x42000000是位帶別名區域的起始地址,A是輸出數據寄存器GPIOA->ODR的地址,A的地址先減去位帶區基地址,得到的是相對于位帶區基地址的偏移地址,那么膨脹之后還是一個偏移地址,是相對于位帶別名區基地址的偏移量,加上位帶別名區域基地址,就得到了其對應的別名區地址,這是總的原理,
((A‐0x40000000)*8+n)*4 =0x42000000+ (A‐0x40000000)*32 + n*4
每一位對應一個32位的字,這樣最終的地址轉換就完成,關鍵還是要注意兩點,一是,兩部分地址的互相轉換,主要是每一部分的基地址。二就是位上升的32位地址這樣的一個方法概念。
//位帶操作,實現51類似的GPIO控制功能
//具體實現思想,參考《CM3權威指南》第五章(87頁~92頁)。M3同M4類似,只是寄存器地址變了
//IO口操作宏定義
#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 GPIOB_ODR_Addr (GPIOB_BASE+20) //0x40020414
#define GPIOC_ODR_Addr (GPIOC_BASE+20) //0x40020814
#define GPIOD_ODR_Addr (GPIOD_BASE+20) //0x40020C14
#define GPIOE_ODR_Addr (GPIOE_BASE+20) //0x40021014
#define GPIOF_ODR_Addr (GPIOF_BASE+20) //0x40021414
#define GPIOG_ODR_Addr (GPIOG_BASE+20) //0x40021814
#define GPIOH_ODR_Addr (GPIOH_BASE+20) //0x40021C14
#define GPIOI_ODR_Addr (GPIOI_BASE+20) //0x40022014
//IO口操作,只對單一的IO口
//確保n的值小于16
#define GPIOA_IDR_Addr (GPIOA_BASE+16) //0x40020010
#define GPIOB_IDR_Addr (GPIOB_BASE+16) //0x40020410
#define GPIOC_IDR_Addr (GPIOC_BASE+16) //0x40020810
#define GPIOD_IDR_Addr (GPIOD_BASE+16) //0x40020C10
#define GPIOE_IDR_Addr (GPIOE_BASE+16) //0x40021010
#define GPIOF_IDR_Addr (GPIOF_BASE+16) //0x40021410
#define GPIOG_IDR_Addr (GPIOG_BASE+16) //0x40021810
#define GPIOH_IDR_Addr (GPIOH_BASE+16) //0x40021C10
#define GPIOI_IDR_Addr (GPIOI_BASE+16) //0x40022010
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //輸出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //輸入
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //輸出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //輸入
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //輸出
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //輸入
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //輸出
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //輸入
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //輸出
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //輸入
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //輸出
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //輸入
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //輸出
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //輸入
#define PHout(n) BIT_ADDR(GPIOH_ODR_Addr,n) //輸出
#define PHin(n) BIT_ADDR(GPIOH_IDR_Addr,n) //輸入
#define PIout(n) BIT_ADDR(GPIOI_ODR_Addr,n) //輸出
#define PIin(n) BIT_ADDR(GPIOI_IDR_Addr,n) //輸入
上一篇:STM32的位帶操作分析
下一篇:STM32時鐘基礎知識
推薦閱讀
史海拾趣
CP Technology Inc成立之初,便專注于半導體技術的研發。公司研發團隊成功開發出一種高效能、低功耗的芯片,這一創新為公司的快速崛起奠定了基石。隨著技術的不斷完善和產品的廣泛應用,CP Technology Inc逐漸在半導體市場上占據了一席之地。公司通過持續的技術創新和產品迭代,不斷滿足市場需求,贏得了客戶的信賴和支持。
AVX一直致力于綠色技術的研發與應用。在數十年的深入研發支持下,AVX的產品為各種綠色技術提供了關鍵的支持,如風能、太陽能和水力發電等領域。這些技術的應用旨在節省現有能源并創建可靠、價格合理的電子系統,為可持續發展做出了積極貢獻。AVX在這一領域的持續投入和創新,使其在綠色技術領域取得了顯著成果。
近年來,AVX在汽車領域的應用也取得了顯著進展。隨著汽車行業的快速發展,對電子元件的需求也日益增長。AVX憑借其卓越的技術和品質,成功為汽車安全性、發動機控制、信息娛樂和底盤控制技術的開發提供了關鍵支持。AVX的產品廣泛應用于各類汽車中,為提升汽車性能和安全性做出了積極貢獻。
以上五個故事展示了AVX公司在電子行業中的發展歷程和取得的成就。從創立初期到如今的全球化布局,AVX始終堅持以技術創新和市場拓展為核心,不斷推動公司的發展。同時,AVX也積極關注可持續發展和綠色技術,為行業的進步做出了積極貢獻。
2020年,受全球疫情影響,許多中小電容器廠家面臨供應鏈中斷、生產受阻等困境。然而,艾華集團憑借其在行業內的深厚積累和強大的研發實力,迅速調整生產策略,優化供應鏈管理,成功應對了疫情帶來的挑戰。同時,公司還加大了對新興市場的開拓力度,進一步鞏固了在全球市場的地位。
在追求經濟效益的同時,Deltron公司始終關注環境保護和可持續發展。公司大力推行綠色生產理念,引進環保設備和技術,減少生產過程中的污染物排放。同時,公司還積極參與環保公益活動,提高員工和公眾的環保意識。這些舉措不僅提升了Deltron的品牌形象,也為公司的長期發展奠定了堅實基礎。
隨著國內市場的逐漸飽和,Baneasa SA開始將目光投向海外市場。公司制定了國際化的發展戰略,通過在歐美等發達國家設立分支機構、參加國際展會等方式積極開拓國際市場。這些努力使得Baneasa SA的產品逐漸在國際市場上占據了一席之地,公司的業務范圍也得到了進一步擴大。
好像很早前就有個一個概念,現在用在了車載上。 AIDA將具備察言觀色的能力,能夠根據面部表情以及其它線索讀懂駕駛者的心情 如果駕駛者心情不好,它甚至還會表現出很同情的樣子。 AIDA能夠根據路況報道為駕駛者尋找最理想的回家路線 ...… 查看全部問答∨ |
|
我現在是在EVC下做一個簡單的對話框程序,程序是在2440XP開發板上運行,系統是WinCE5.0 這個程序就是一個基于對話框的程序,首先我給對話框設置一張背景圖片,然后還在對話框上加了一些CBitmapButton和CStatic這些控件我都把它們的背景設置成一些 ...… 查看全部問答∨ |
|
香版:您好! 我在使用Custom_Hid的時候,發現其需要安裝驅動,但其啟動好像是PC系統自帶,這倒沒有什么問題。 問題是,在第一次插入PC的時候,會提示ST等信息。而作為我們設計的產品,希望能提示公司自己的ID或者什么都不顯示。不知道這樣 ...… 查看全部問答∨ |
|
各位大哥大姐: 小弟最近在設計方案,涉及到兩塊板子的通信問題。 要求兩塊板的電源,地完全隔離;能夠進行數據通信,通信距離在10米至30米。 小弟我苦思幾天,通信不過就如下幾種: 232,485,CAN,紅外。但好像這 ...… 查看全部問答∨ |
目的研制一種具有無線傳輸功能的便攜式 電監護儀 。方法以MS P 4 3 0單片機為核心 , 控制心電采集 、 放大模塊 , 并通過 BC M一 0 3藍牙模塊 將心電數據發送到掌上 電腦上進 行監護。結果 實現了心數據的采集及與P D A的藍牙無線 ...… 查看全部問答∨ |
Altera FFT兆核函數2.0.0版簡介一.FFT兆核函數簡介Altera FFT兆核函數2.0.0版是一個高性能、參數化快速傅立葉變換(FFT)處理器,對Altera Stratix II、Stratix GX、Stratix以及Cyclone器件系列已經進行了設計優化。FFT兆核函數可以完成高性能復數FFT ...… 查看全部問答∨ |
大家好: 我現在想用BSL給MSP430下載程序,但是不想用硬件產生進入BSL的時序,想通過兩個I/O口產生TEST和RST的時序,問題是:直接把TXT格式的文件傳入BSL_R就可以了嗎?還是需要考慮其他問題? 謝謝!… 查看全部問答∨ |