STM32暫存器操作埠模式SDA_OUT()/SDA_IN()
阿新 • • 發佈:2019-01-26
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
GPIOB->CRL|=(u32)3<<28;
3換成2進位制是0011, 結合上面的就是00就是outpu的push-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啦!!!
#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, 分別是將CRL的31到28bit
位置1000, 查上面的表:
GPIOB->CRL|=(u32)3<<28;
3換成2進位制是0011, 結合上面的就是00就是outpu的push-pull, 11表示速度是50MHz
那麼, 如果要修改PB_11
#define SDA_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=(u32)8<<12;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=(u32)3<<12;} OK啦!!!