1. 程式人生 > >STM32暫存器操作埠模式SDA_OUT()/SDA_IN()

STM32暫存器操作埠模式SDA_OUT()/SDA_IN()

#define SDA_IN()        {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;} 

#define SDA_OUT()    {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;} 

是不是看到懵了,其實不難,相信用暫存器寫過stm8s的就明白了,其實這是利用暫存器配置埠模式,只是32為的暫存器太多!

首先得明白CRL、CRH是2個控制埠模式的暫存器。他們的位數資料為:

CRL(引腳的0-7腳)


CRH(引腳的8-16腳)

 然後一個埠分4位來控制模式,這4為的組合為:


我們來分析一下:

GPIOB->CRL&=0X0FFFFFFF;
GPIOB->CRL|=(u32) 8<<28;
的意思 先都置0, 0000, 然後1000B, 左移28, 1000, 分別是將CRL3128bit
位置1000, 查上面的表: 

1000意思就是Input模式, Input pull-up  即輸出模式!!! GPIOB->CRL&=0X0FFFFFFF;
GPIOB->CRL|=(u32)3<<28;
3
換成2進位制是0011, 結合上面的就是00就是outpupush-pull, 11表示速度是50MHz


那麼, 如果要修改PB_11
的配置, 就修改CRH, 移動3*4次就好,
#define SDA_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=(u32)8<<12;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=(u32)3<<12;}
 
OK啦!!!