stm32之GPIO的理解

2021-07-09 22:35:12 字數 3280 閱讀 8891

寫這個部落格著重縷清自己的思路,對基礎的東西有個更好的理解。

gpiox_crh 與gpiox_crl : 可以配置gpio的各種模式,進行初始化。

gpiox_bsrr : 32位暫存器,可以寫入或清除1/0

gpiox_idr : 低16位暫存器,讀取io的電平

gpiox_odr :低16位暫存器,寫入io的電平

通過對暫存器的操作就可以實現io口的操作了。

#define led1_off       gpio_setbits(gpiob,gpio_pin_0)

#define led1_on gpio_resetbits(gpiob,gpio_pin_0)

/* 直接操作暫存器的方法控制io */

#define digitalhi(p,i) //設定為高電平

#define digitallo(p,i) //輸出低電平

#define digitaltoggle(p,i) //輸出反轉狀態

/* 定義控制io的巨集 */

#define led1_toggle digitaltoggle(gpiob,gpio_pin_0)

#define led1_off digitalhi(gpiob,gpio_pin_0)

#define led1_on digitallo(gpiob,gpio_pin_0)

首先引用正點原子中sys.h中的**

//位帶操作,實現51類似的gpio控制功能

//具體實現思想,參考<

//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+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) //輸入

位帶別名區把每個位元膨脹成乙個 32 位的字。當你通過位帶別名區訪問這些字時,就可以達到訪問原始位元的目的。

位帶操作可以使用普通的載入/儲存指令來對單一的位元進行讀寫,實現原子操作

優勢在於:`

STM32八種GPIO模式理解

時隔好久,決定將stm32重新複習一遍,然後轉向linux。話不多說下面就是開始正文 上手stm32第一步就是得會配置工程 配置工程的教程有很多,就不多做筆記了,就列舉一下初學過程中比較容易弄錯的地方 在stm32的工程庫中 stm32f10x rcc.c 是必須要加的 在define中use st...

STM32之GPIO輸入輸出

gpio的輸出 背景 應用在點亮led。led串聯電阻再上拉,另一端與gpio口相連。因此,gpio輸出高電平則led滅,輸出低電平則led亮。第一步工作是初始化gpio,使能外設時鐘,因為gpio是掛載在apb2中線上的。然後對gpio inittypedef結構體進行初始化,設定gpio pin...

stm32學習筆記之GPIO配置

1 gpio mode ain 模擬輸入 2 gpio mode in floating 浮空輸入 3 gpio mode ipd 下拉輸入 4 gpio mode ipu 上拉輸入 5 gpio mode out od 開漏輸出 6 gpio mode out pp 推挽輸出 7 gpio mod...