寫這個部落格著重縷清自己的思路,對基礎的東西有個更好的理解。
gpiox_crh 與gpiox_crl : 可以配置gpio的各種模式,進行初始化。通過對暫存器的操作就可以實現io口的操作了。gpiox_bsrr : 32位暫存器,可以寫入或清除1/0
gpiox_idr : 低16位暫存器,讀取io的電平
gpiox_odr :低16位暫存器,寫入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...