STM32的GPIO 快速IO的使用與講解

2021-06-25 10:08:05 字數 1529 閱讀 4202

stm32的gpio—快速io的使用與講解

stm32的每個gpio埠都有兩個特別的暫存器,gpiox_bsrr和gpiox_brr暫存器,通過這兩個暫存器可以直接對對應的gpiox埠置'1'或置'0'。

gpiox_bsrr的高16位中每一位對應埠x的每個位,對高16位中的某位置'1'則埠x的對應位被清'0';暫存器中的位置'0',則對它對應的位不起作用。

gpiox_bsrr的低16位中每一位也對應埠x的每個位,對低16位中的某位置'1'則它對應的埠位被置'1';暫存器中的位置'0',則對它對應的埠不起作用。

簡單地說gpiox_bsrr的高16位稱作清除暫存器,而gpiox_bsrr的低16位稱作設定暫存器。另乙個暫存器gpiox_brr只有低16位有效,與gpiox_bsrr的高16位具有相同功能。

舉個例子說明如何使用這兩個暫存器和所體現的優勢。例如gpioe的16個io都被設定成輸出,而每次操作僅需要改變低8位的資料而保持高8位不變,假設新的8位資料在變數newdata中,

這個要求可以通過操作這兩個暫存器實現,stm32的韌體庫中有兩個函式gpio_setbits()和gpio_resetbits()使用了這兩個暫存器操作埠。

上述要求可以這樣實現:

gpio_setbits(gpioe, newdata & 0xff);

gpio_resetbits(gpioe, (~newdata & 0xff));

也可以直接操作這兩個暫存器:

gpioe->bsrr = newdata & 0xff;

gpioe->brr = ~newdata & 0xff;

當然還可以一次完成對8位的操作:

gpioe->bsrr = (newdata & 0xff) | (~newdata & 0xff)<<16;

從最後這個操作可以看出使用bsrr暫存器,可以實現8個埠位的同時修改操作。

如果不是用brr和bsrr暫存器,則上述要求就需要這樣實現:

gpioe->odr = gpioe->odr & 0xff00 | newdata;

使用brr和bsrr暫存器可以方便地快速地實現對埠某些特定位的操作,而不影響其它位的狀態。

比如希望快速地對gpioe的位7進行翻轉,則可以:

gpioe->bsrr = 0x80; // 置'1'

gpioe->brr = 0x80; // 置'0'

如果使用常規'讀-改-寫'的方法:

gpioe->odr = gpioe->odr | 0x80; // 置'1'

gpioe->odr = gpioe->odr & 0xff7f; // 置'0'

有人問是否bsrr的高16位是多餘的,請看下面這個例子:

假如你想在乙個操作中對gpioe的位7置'1',位6置'0',則使用bsrr非常方便: 

gpioe->bsrr = 0x400080;

如果沒有bsrr的高16位,則要分2次操作,結果造成位7和位6的變化不同步! 

gpioe->bsrr = 0x80; 

gpioe->brr = 0x40;

STM32的GPIO開發總結

gpio開發總結 gpio模式 a 浮空輸入 in floating b 帶上拉輸入 ipu in push up c 帶下拉輸入 ipd in push down d 模擬輸入 ain anolog in e 開漏輸出 out pd od 代表開漏,既open drain,oc代表開集,open ...

stm32之GPIO的理解

寫這個部落格著重縷清自己的思路,對基礎的東西有個更好的理解。gpiox crh 與gpiox crl 可以配置gpio的各種模式,進行初始化。gpiox bsrr 32位暫存器,可以寫入或清除1 0 gpiox idr 低16位暫存器,讀取io的電平 gpiox odr 低16位暫存器,寫入io的電...

STM32學習 GPIO的操作

1.應專案要求,要迅速熟悉stm32的gpio 串列埠以及tim高階定時器 輸出pwm 2.初步了解stm32學習方法以及程式設計要領 瘋狂地賦值貼上庫函式,學會看庫函式的函式介紹以及引數選擇,注意現在 件裡看函式宣告,再goto到相應的函式處 一 gpio的初始化過程 主要用來點亮led void...