位帶操作 GPIO輸出和輸入

2022-04-30 21:09:12 字數 2073 閱讀 5871

gpioc->odr |=(0<<2);  // 匯流排操作,即操作整個暫存器.

在51微控制器中

p0=0xfe;   //匯流排操作.

sbit led1=p0^0;  //位操作,即操作暫存器中的某一位.

led1 =0;    

在stm32中並沒有sbit這樣的關鍵字.但是我們可以用位帶操作實現位操作.

位帶操作

在 stm32 中,有兩個地方實現了位帶,乙個是 sram 區(存放**)的最低 1mb 空間,令乙個是外設區最低 1mb 空間。這兩個 1mb 的空間除了可以像正常的 ram 一樣操作外,他們還有自己的位帶別名區,位帶別名區把這 1mb 的空間的每

乙個位膨脹成乙個 32 位的字(4個位元組),當訪問位帶別名區的這些字時,就可以達到訪問位帶區某個位元位的目的.

位帶操作的公式

外設位帶區與外設位帶別名區的位址轉換:    alisaaddr=0x42000000+(a-0x40000000)*8*4+n*4

sram位帶區與sram位帶別名區位址轉換:  alisaaddr=0x22000000+(a-0x20000000)*8*4+n*4

其中:a:表示操作的那個位暫存器所在的暫存器位址

n:位號(第幾位)

對上面式子的解釋:

alisaaddr=位帶別名區基位址+(暫存器位址-暫存器基位址)[偏移多少個位元組]*8[乙個位元組8位]*4[每個位膨脹4個位元組] [這是第0位]+n*4[第n個位膨脹的位元組說]

理解要點:位帶區的乙個位在位帶別名區膨脹位4個位元組

位帶操作的總公式

alisaaddr =((addr&0xf0000000)+0x02000000+((addr&0x00ffffff)<<5)+(bitnum<<2))

其中:addr:要操作的暫存器位址.(暫存器對映表中,每個外設位址+偏移位址)

bitnum:位號,即暫存器的第幾位

對上面式子的解釋:   addr&0xf0000000:為了取出4和2,用來區分是外設還是sram.然後+0x20000000就等於外設/sram位帶別名區的起始位址

add&0x00ffffff0x00ffffff:遮蔽掉高2位,外設位帶區的高位址位0x4010 0000,sram的位帶區高位址為0x2010 0000, (0x4010 0000 –0x40000000) 和(0x2010 0000-0x200000)在求偏移位址相減的時候只要第四位有效,所以就把剩下的高兩位遮蔽掉,剩下的6位與f相與即可.

點亮led的原始碼

我們在上次的**中繼續新增:

main為:

#include "stm32f10x.h"   // 相當於51微控制器中的  #include 

#include "bsp_led.h"

#include "bsp_key.h"

#define soft_delay delay(0x0fffff);

//void delay(__io u32 ncount);

#define gpioc_odr_addr (gpioc_base+0x0c)

#define pcout(bitnum) *(unsigned

int *)((gpioc_odr_addr&0xf0000000)+0x02000000+((gpioc_odr_addr &0x00ffffff)<<5)+(bitnum<<2))

#define gpioc_idr_addr (gpioc_base+0x08)

#define pcin(bitnum) *(unsigned

int *)((gpioc_idr_addr&0xf0000000)+0x02000000+((gpioc_idr_addr &0x00ffffff)<<5)+(bitnum<<2))

void delay( uint32_t count)

int main(void)

}}

GPIO 位帶操作

gpio 位帶操作 本章參考資料 stm32f4xx 中文參考手冊 儲存器和匯流排構架章節 gpio 章節,cortex m4 核心程式設計手冊 2.2.5 bit banding。學習本章時,配套這些參考資料學習效果 會更佳。位操作就是可以單獨的對乙個位元位讀和寫,這個在 51 微控制器中非常常見...

F3不能用位帶操作GPIO之原由

最近用到stm32f303,在修改io的時候,覺得用庫操作太麻煩了,要自己乙個乙個修改,用巨集定義也不解決,自然就會想到用位帶操作。查m4的手冊知道m4也是支援位帶操作,f3系列也是屬於m4核心,而且在405也是用位帶操作,覺得f303也是一樣可以做位帶操作。直接先修改乙個io,除錯卻發現在,io電...

推挽輸出和開漏輸出 GPIO輸入與輸出設定

gpio 也稱為通用輸入 輸出 是控制器中最簡單也是最重要的配置。但即便如此,io也有各種各樣的型別和配置選項,有輸入,輸出,上拉,下拉,推挽等。雖然我們天天都和它打交道,但是你真的了解其中的配置嗎?通常,gpio輸入主要通過以下三種方式之一進行配置 高阻抗 hi z,也稱為浮動floating 上...