1. 程式人生 > >15、STM32位帶操作

15、STM32位帶操作

alt ati 定義 long alias col .com 映射 簡潔

本講主要內容 1.位帶介紹
2.位帶區與位帶別名區地址轉換
3.位帶操作的優點
4.GPIO位帶操作 1.位帶介紹
(1)位帶操作
在學習51單片機時就已經使用過位操作,比如使用sbit對單
片機IO口的定義,但是STM32中並沒有這類關鍵字,而是通
過訪問位帶別名區來實現,即通過將每個比特位膨脹成一個32位字,當訪問這些字的時候就達到了訪問比特的目的。
比方說BSRR寄存器有32個位,那麽可以映射到32個地址上,當我們去訪問這32個地址就達到訪問32個比特的目的 (2)STM32位帶及位帶別名區域
支持位帶操作的區域是 SRAM 區的最低 1MB 範圍(APB1/2
,AHB外設)和片內外設區的最低 1MB範圍。 技術分享圖片
2.位帶區與位帶別名區地址轉換
外設位帶區與外設位帶別名區的地址轉換公式:
AliasAddr = 0x42000000+ (A-0x40000000)*8*4 +n*4 SRAM位帶區與SRAM位帶別名區的地址轉換公式:
AliasAddr = 0x22000000+ (A-0x20000000)*8*4 +n*4 A:表示我們要操作的那個位所在的寄存器的地址
n:位序號
理解要點:位帶區的一個位在位帶別名區會被膨脹成四個字

根據上述兩個公式特點,將其統一為一個公式表示:
((A & 0xF0000000)+0x02000000+((A &0x000FFFFF)<<5)+(n<<2))
A:要操作的位所在寄存器的地址
n:位號,即在寄存器的第幾位。

3.位帶操作的優點
(1)控制GPIO口輸入輸出非常簡單。
(2)操作串行接口芯片非常方便(DS1302、74HC595等)。
(3)代碼簡潔,閱讀方便。

4.GPIO位帶操作

#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+12) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
#define GPIOA_IDR_Addr (GPIOA_BASE+8)//0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
//IO口操作,只對單一的IO口!
//確保n的值小於16!
#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) //輸入

15、STM32位帶操作